Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'tools-ynl-gen-print-setters-for-multi-val-attrs'

Jakub Kicinski says:

====================
tools: ynl-gen: print setters for multi-val attrs

ncdevmem seems to manually prepare the queue attributes.
This is not ideal, YNL should be providing helpers for this.
Make YNL output allocation and setter helpers for multi-val attrs.

v1: https://lore.kernel.org/20250722161927.3489203-1-kuba@kernel.org
====================

Link: https://patch.msgid.link/20250723171046.4027470-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+39 -18
+36 -13
tools/net/ynl/pyynl/ynl_gen_c.py
··· 275 275 def _setter_lines(self, ri, member, presence): 276 276 raise Exception(f"Setter not implemented for class type {self.type}") 277 277 278 - def setter(self, ri, space, direction, deref=False, ref=None): 278 + def setter(self, ri, space, direction, deref=False, ref=None, var="req"): 279 279 ref = (ref if ref else []) + [self.c_name] 280 - var = "req" 281 280 member = f"{var}->{'.'.join(ref)}" 282 281 283 282 local_vars = [] ··· 331 332 def attr_get(self, ri, var, first): 332 333 pass 333 334 334 - def setter(self, ri, space, direction, deref=False, ref=None): 335 + def setter(self, ri, space, direction, deref=False, ref=None, var=None): 335 336 pass 336 337 337 338 ··· 354 355 def attr_policy(self, cw): 355 356 pass 356 357 357 - def setter(self, ri, space, direction, deref=False, ref=None): 358 + def setter(self, ri, space, direction, deref=False, ref=None, var=None): 358 359 pass 359 360 360 361 ··· 694 695 f"parg.data = &{var}->{self.c_name};"] 695 696 return get_lines, init_lines, None 696 697 697 - def setter(self, ri, space, direction, deref=False, ref=None): 698 + def setter(self, ri, space, direction, deref=False, ref=None, var="req"): 698 699 ref = (ref if ref else []) + [self.c_name] 699 700 700 701 for _, attr in ri.family.pure_nested_structs[self.nested_attrs].member_list(): 701 702 if attr.is_recursive(): 702 703 continue 703 - attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref) 704 + attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref, 705 + var=var) 704 706 705 707 706 708 class TypeMultiAttr(Type): ··· 1879 1879 def op_prefix(ri, direction, deref=False): 1880 1880 suffix = f"_{ri.type_name}" 1881 1881 1882 - if not ri.op_mode or ri.op_mode == 'do': 1882 + if not ri.op_mode: 1883 + pass 1884 + elif ri.op_mode == 'do': 1883 1885 suffix += f"{direction_to_suffix[direction]}" 1884 1886 else: 1885 1887 if direction == 'request': ··· 2472 2470 return 'obj' 2473 2471 2474 2472 2475 - def print_alloc_wrapper(ri, direction): 2473 + def print_alloc_wrapper(ri, direction, struct=None): 2476 2474 name = op_prefix(ri, direction) 2477 - ri.cw.write_func_prot(f'static inline struct {name} *', f"{name}_alloc", [f"void"]) 2475 + struct_name = name 2476 + if ri.type_name_conflict: 2477 + struct_name += '_' 2478 + 2479 + args = ["void"] 2480 + cnt = "1" 2481 + if struct and struct.in_multi_val: 2482 + args = ["unsigned int n"] 2483 + cnt = "n" 2484 + 2485 + ri.cw.write_func_prot(f'static inline struct {struct_name} *', 2486 + f"{name}_alloc", args) 2478 2487 ri.cw.block_start() 2479 - ri.cw.p(f'return calloc(1, sizeof(struct {name}));') 2488 + ri.cw.p(f'return calloc({cnt}, sizeof(struct {struct_name}));') 2480 2489 ri.cw.block_end() 2481 2490 2482 2491 ··· 2556 2543 2557 2544 def print_type_full(ri, struct): 2558 2545 _print_type(ri, "", struct) 2546 + 2547 + if struct.request and struct.in_multi_val: 2548 + print_alloc_wrapper(ri, "", struct) 2549 + ri.cw.nl() 2550 + free_rsp_nested_prototype(ri) 2551 + ri.cw.nl() 2552 + 2553 + # Name conflicts are too hard to deal with with the current code base, 2554 + # they are very rare so don't bother printing setters in that case. 2555 + if ri.ku_space == 'user' and not ri.type_name_conflict: 2556 + for _, attr in struct.member_list(): 2557 + attr.setter(ri, ri.attr_set, "", var="obj") 2558 + ri.cw.nl() 2559 2559 2560 2560 2561 2561 def print_type_helpers(ri, direction, deref=False): ··· 3541 3515 for attr_set, struct in parsed.pure_nested_structs.items(): 3542 3516 ri = RenderInfo(cw, parsed, args.mode, "", "", attr_set) 3543 3517 print_type_full(ri, struct) 3544 - if struct.request and struct.in_multi_val: 3545 - free_rsp_nested_prototype(ri) 3546 - cw.nl() 3547 3518 3548 3519 for op_name, op in parsed.ops.items(): 3549 3520 cw.p(f"/* ============== {op.enum_name} ============== */")
+3 -5
tools/testing/selftests/drivers/net/hw/ncdevmem.c
··· 526 526 struct netdev_queue_id *queues; 527 527 size_t i = 0; 528 528 529 - queues = calloc(num_queues, sizeof(*queues)); 529 + queues = netdev_queue_id_alloc(num_queues); 530 530 for (i = 0; i < num_queues; i++) { 531 - queues[i]._present.type = 1; 532 - queues[i]._present.id = 1; 533 - queues[i].type = NETDEV_QUEUE_TYPE_RX; 534 - queues[i].id = start_queue + i; 531 + netdev_queue_id_set_type(&queues[i], NETDEV_QUEUE_TYPE_RX); 532 + netdev_queue_id_set_id(&queues[i], start_queue + i); 535 533 } 536 534 537 535 return queues;