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>
This commit is contained in:
Jakub Kicinski 2025-07-24 17:28:52 -07:00
commit 7dba0cc93c
2 changed files with 39 additions and 18 deletions

View File

@ -275,9 +275,8 @@ class Type(SpecAttr):
def _setter_lines(self, ri, member, presence):
raise Exception(f"Setter not implemented for class type {self.type}")
def setter(self, ri, space, direction, deref=False, ref=None):
def setter(self, ri, space, direction, deref=False, ref=None, var="req"):
ref = (ref if ref else []) + [self.c_name]
var = "req"
member = f"{var}->{'.'.join(ref)}"
local_vars = []
@ -332,7 +331,7 @@ class TypeUnused(Type):
def attr_get(self, ri, var, first):
pass
def setter(self, ri, space, direction, deref=False, ref=None):
def setter(self, ri, space, direction, deref=False, ref=None, var=None):
pass
@ -355,7 +354,7 @@ class TypePad(Type):
def attr_policy(self, cw):
pass
def setter(self, ri, space, direction, deref=False, ref=None):
def setter(self, ri, space, direction, deref=False, ref=None, var=None):
pass
@ -695,13 +694,14 @@ class TypeNest(Type):
f"parg.data = &{var}->{self.c_name};"]
return get_lines, init_lines, None
def setter(self, ri, space, direction, deref=False, ref=None):
def setter(self, ri, space, direction, deref=False, ref=None, var="req"):
ref = (ref if ref else []) + [self.c_name]
for _, attr in ri.family.pure_nested_structs[self.nested_attrs].member_list():
if attr.is_recursive():
continue
attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref)
attr.setter(ri, self.nested_attrs, direction, deref=deref, ref=ref,
var=var)
class TypeMultiAttr(Type):
@ -1879,7 +1879,9 @@ def rdir(direction):
def op_prefix(ri, direction, deref=False):
suffix = f"_{ri.type_name}"
if not ri.op_mode or ri.op_mode == 'do':
if not ri.op_mode:
pass
elif ri.op_mode == 'do':
suffix += f"{direction_to_suffix[direction]}"
else:
if direction == 'request':
@ -2470,11 +2472,22 @@ def free_arg_name(direction):
return 'obj'
def print_alloc_wrapper(ri, direction):
def print_alloc_wrapper(ri, direction, struct=None):
name = op_prefix(ri, direction)
ri.cw.write_func_prot(f'static inline struct {name} *', f"{name}_alloc", [f"void"])
struct_name = name
if ri.type_name_conflict:
struct_name += '_'
args = ["void"]
cnt = "1"
if struct and struct.in_multi_val:
args = ["unsigned int n"]
cnt = "n"
ri.cw.write_func_prot(f'static inline struct {struct_name} *',
f"{name}_alloc", args)
ri.cw.block_start()
ri.cw.p(f'return calloc(1, sizeof(struct {name}));')
ri.cw.p(f'return calloc({cnt}, sizeof(struct {struct_name}));')
ri.cw.block_end()
@ -2544,6 +2557,19 @@ def print_type(ri, direction):
def print_type_full(ri, struct):
_print_type(ri, "", struct)
if struct.request and struct.in_multi_val:
print_alloc_wrapper(ri, "", struct)
ri.cw.nl()
free_rsp_nested_prototype(ri)
ri.cw.nl()
# Name conflicts are too hard to deal with with the current code base,
# they are very rare so don't bother printing setters in that case.
if ri.ku_space == 'user' and not ri.type_name_conflict:
for _, attr in struct.member_list():
attr.setter(ri, ri.attr_set, "", var="obj")
ri.cw.nl()
def print_type_helpers(ri, direction, deref=False):
print_free_prototype(ri, direction)
@ -3515,9 +3541,6 @@ def main():
for attr_set, struct in parsed.pure_nested_structs.items():
ri = RenderInfo(cw, parsed, args.mode, "", "", attr_set)
print_type_full(ri, struct)
if struct.request and struct.in_multi_val:
free_rsp_nested_prototype(ri)
cw.nl()
for op_name, op in parsed.ops.items():
cw.p(f"/* ============== {op.enum_name} ============== */")

View File

@ -526,12 +526,10 @@ static struct netdev_queue_id *create_queues(void)
struct netdev_queue_id *queues;
size_t i = 0;
queues = calloc(num_queues, sizeof(*queues));
queues = netdev_queue_id_alloc(num_queues);
for (i = 0; i < num_queues; i++) {
queues[i]._present.type = 1;
queues[i]._present.id = 1;
queues[i].type = NETDEV_QUEUE_TYPE_RX;
queues[i].id = start_queue + i;
netdev_queue_id_set_type(&queues[i], NETDEV_QUEUE_TYPE_RX);
netdev_queue_id_set_id(&queues[i], start_queue + i);
}
return queues;