Skip to content

Commit 7dba0cc

Browse files
committed
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>
2 parents 126d85f + f70d981 commit 7dba0cc

File tree

2 files changed

+39
-18
lines changed

2 files changed

+39
-18
lines changed

tools/net/ynl/pyynl/ynl_gen_c.py

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,8 @@ def attr_get(self, ri, var, first):
275275
def _setter_lines(self, ri, member, presence):
276276
raise Exception(f"Setter not implemented for class type {self.type}")
277277

278-
def setter(self, ri, space, direction, deref=False, ref=None):
278+
def setter(self, ri, space, direction, deref=False, ref=None, var="req"):
279279
ref = (ref if ref else []) + [self.c_name]
280-
var = "req"
281280
member = f"{var}->{'.'.join(ref)}"
282281

283282
local_vars = []
@@ -332,7 +331,7 @@ def attr_put(self, ri, var):
332331
def attr_get(self, ri, var, first):
333332
pass
334333

335-
def setter(self, ri, space, direction, deref=False, ref=None):
334+
def setter(self, ri, space, direction, deref=False, ref=None, var=None):
336335
pass
337336

338337

@@ -355,7 +354,7 @@ def attr_get(self, ri, var, first):
355354
def attr_policy(self, cw):
356355
pass
357356

358-
def setter(self, ri, space, direction, deref=False, ref=None):
357+
def setter(self, ri, space, direction, deref=False, ref=None, var=None):
359358
pass
360359

361360

@@ -695,13 +694,14 @@ def _attr_get(self, ri, var):
695694
f"parg.data = &{var}->{self.c_name};"]
696695
return get_lines, init_lines, None
697696

698-
def setter(self, ri, space, direction, deref=False, ref=None):
697+
def setter(self, ri, space, direction, deref=False, ref=None, var="req"):
699698
ref = (ref if ref else []) + [self.c_name]
700699

701700
for _, attr in ri.family.pure_nested_structs[self.nested_attrs].member_list():
702701
if attr.is_recursive():
703702
continue
704-
attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref)
703+
attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref,
704+
var=var)
705705

706706

707707
class TypeMultiAttr(Type):
@@ -1879,7 +1879,9 @@ def rdir(direction):
18791879
def op_prefix(ri, direction, deref=False):
18801880
suffix = f"_{ri.type_name}"
18811881

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':
18831885
suffix += f"{direction_to_suffix[direction]}"
18841886
else:
18851887
if direction == 'request':
@@ -2470,11 +2472,22 @@ def free_arg_name(direction):
24702472
return 'obj'
24712473

24722474

2473-
def print_alloc_wrapper(ri, direction):
2475+
def print_alloc_wrapper(ri, direction, struct=None):
24742476
name = op_prefix(ri, direction)
2475-
ri.cw.write_func_prot(f'static inline struct {name} *', f"{name}_alloc", [f"void"])
2477+
struct_name = name
2478+
if ri.type_name_conflict:
2479+
struct_name += '_'
2480+
2481+
args = ["void"]
2482+
cnt = "1"
2483+
if struct and struct.in_multi_val:
2484+
args = ["unsigned int n"]
2485+
cnt = "n"
2486+
2487+
ri.cw.write_func_prot(f'static inline struct {struct_name} *',
2488+
f"{name}_alloc", args)
24762489
ri.cw.block_start()
2477-
ri.cw.p(f'return calloc(1, sizeof(struct {name}));')
2490+
ri.cw.p(f'return calloc({cnt}, sizeof(struct {struct_name}));')
24782491
ri.cw.block_end()
24792492

24802493

@@ -2544,6 +2557,19 @@ def print_type(ri, direction):
25442557
def print_type_full(ri, struct):
25452558
_print_type(ri, "", struct)
25462559

2560+
if struct.request and struct.in_multi_val:
2561+
print_alloc_wrapper(ri, "", struct)
2562+
ri.cw.nl()
2563+
free_rsp_nested_prototype(ri)
2564+
ri.cw.nl()
2565+
2566+
# Name conflicts are too hard to deal with with the current code base,
2567+
# they are very rare so don't bother printing setters in that case.
2568+
if ri.ku_space == 'user' and not ri.type_name_conflict:
2569+
for _, attr in struct.member_list():
2570+
attr.setter(ri, ri.attr_set, "", var="obj")
2571+
ri.cw.nl()
2572+
25472573

25482574
def print_type_helpers(ri, direction, deref=False):
25492575
print_free_prototype(ri, direction)
@@ -3515,9 +3541,6 @@ def main():
35153541
for attr_set, struct in parsed.pure_nested_structs.items():
35163542
ri = RenderInfo(cw, parsed, args.mode, "", "", attr_set)
35173543
print_type_full(ri, struct)
3518-
if struct.request and struct.in_multi_val:
3519-
free_rsp_nested_prototype(ri)
3520-
cw.nl()
35213544

35223545
for op_name, op in parsed.ops.items():
35233546
cw.p(f"/* ============== {op.enum_name} ============== */")

tools/testing/selftests/drivers/net/hw/ncdevmem.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -526,12 +526,10 @@ static struct netdev_queue_id *create_queues(void)
526526
struct netdev_queue_id *queues;
527527
size_t i = 0;
528528

529-
queues = calloc(num_queues, sizeof(*queues));
529+
queues = netdev_queue_id_alloc(num_queues);
530530
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);
535533
}
536534

537535
return queues;

0 commit comments

Comments
 (0)