* [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs
@ 2025-07-23 17:10 Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 1/5] tools: ynl-gen: don't add suffix for pure types Jakub Kicinski
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
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.
v2:
- rename a variable to args
v1: https://lore.kernel.org/20250722161927.3489203-1-kuba@kernel.org
Jakub Kicinski (5):
tools: ynl-gen: don't add suffix for pure types
tools: ynl-gen: move free printing to the print_type_full() helper
tools: ynl-gen: print alloc helper for multi-val attrs
tools: ynl-gen: print setters for multi-val attrs
selftests: drv-net: devmem: use new mattr ynl helpers
.../selftests/drivers/net/hw/ncdevmem.c | 8 ++-
tools/net/ynl/pyynl/ynl_gen_c.py | 49 ++++++++++++++-----
2 files changed, 39 insertions(+), 18 deletions(-)
--
2.50.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v2 1/5] tools: ynl-gen: don't add suffix for pure types
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
@ 2025-07-23 17:10 ` Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 2/5] tools: ynl-gen: move free printing to the print_type_full() helper Jakub Kicinski
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
Don't add _req to helper names for pure types. We don't currently
print those so it makes no difference to existing codegen.
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
tools/net/ynl/pyynl/ynl_gen_c.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 76032e01c2e7..1bdcc368e776 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -1879,7 +1879,9 @@ _C_KW = {
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':
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 2/5] tools: ynl-gen: move free printing to the print_type_full() helper
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 1/5] tools: ynl-gen: don't add suffix for pure types Jakub Kicinski
@ 2025-07-23 17:10 ` Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 3/5] tools: ynl-gen: print alloc helper for multi-val attrs Jakub Kicinski
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
Just to avoid making the main function even more enormous,
before adding more things to print move the free printing
to a helper which already prints the type.
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
tools/net/ynl/pyynl/ynl_gen_c.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 1bdcc368e776..dc78542e6c88 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -2546,6 +2546,10 @@ _C_KW = {
def print_type_full(ri, struct):
_print_type(ri, "", struct)
+ if struct.request and struct.in_multi_val:
+ free_rsp_nested_prototype(ri)
+ ri.cw.nl()
+
def print_type_helpers(ri, direction, deref=False):
print_free_prototype(ri, direction)
@@ -3517,9 +3521,6 @@ _C_KW = {
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} ============== */")
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 3/5] tools: ynl-gen: print alloc helper for multi-val attrs
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 1/5] tools: ynl-gen: don't add suffix for pure types Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 2/5] tools: ynl-gen: move free printing to the print_type_full() helper Jakub Kicinski
@ 2025-07-23 17:10 ` Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 4/5] tools: ynl-gen: print setters " Jakub Kicinski
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
In general YNL provides allocation and free helpers for types.
For pure nested structs which are used as multi-attr (and therefore
have to be allocated dynamically) we already print a free helper
as it's needed by free of the containing struct.
Add printing of the alloc helper for consistency. The helper
takes the number of entries to allocate as an argument, e.g.:
static inline struct netdev_queue_id *netdev_queue_id_alloc(unsigned int n)
{
return calloc(n, sizeof(struct netdev_queue_id));
}
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
v2:
- naming - arg vs args vs [arg], args seems most prevalent
v1: https://lore.kernel.org/m2ldof9sxs.fsf@gmail.com
---
tools/net/ynl/pyynl/ynl_gen_c.py | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index dc78542e6c88..6bc0782f2658 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -2472,11 +2472,22 @@ _C_KW = {
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()
@@ -2547,6 +2558,8 @@ _C_KW = {
_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()
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 4/5] tools: ynl-gen: print setters for multi-val attrs
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
` (2 preceding siblings ...)
2025-07-23 17:10 ` [PATCH net-next v2 3/5] tools: ynl-gen: print alloc helper for multi-val attrs Jakub Kicinski
@ 2025-07-23 17:10 ` Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 5/5] selftests: drv-net: devmem: use new mattr ynl helpers Jakub Kicinski
2025-07-25 0:42 ` [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
For basic types we "flatten" setters. If a request "a" has a simple
nest "b" with value "val" we print helpers like:
req_set_a_b(struct a *req, int val)
{
req->_present.a = 1;
req->b._present.val = 1;
req->b.val = ...
}
This is not possible for multi-attr because they have to be allocated
dynamically by the user. Print "object level" setters so that user
preparing the object doesn't have to futz with the presence bits
and other YNL internals.
Add the ability to pass in the variable name to generated setters.
Using "req" here doesn't feel right, while the attr is part of a request
it's not the request itself, so it seems cleaner to call it "obj".
Example:
static inline void
netdev_queue_id_set_id(struct netdev_queue_id *obj, __u32 id)
{
obj->_present.id = 1;
obj->id = id;
}
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
tools/net/ynl/pyynl/ynl_gen_c.py | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index 6bc0782f2658..ef032e17fec4 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -275,9 +275,8 @@ from lib import SpecSubMessage, SpecSubMessageFormat
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 @@ from lib import SpecSubMessage, SpecSubMessageFormat
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 @@ from lib import SpecSubMessage, SpecSubMessageFormat
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 @@ from lib import SpecSubMessage, SpecSubMessageFormat
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):
@@ -2563,6 +2563,13 @@ _C_KW = {
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)
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v2 5/5] selftests: drv-net: devmem: use new mattr ynl helpers
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
` (3 preceding siblings ...)
2025-07-23 17:10 ` [PATCH net-next v2 4/5] tools: ynl-gen: print setters " Jakub Kicinski
@ 2025-07-23 17:10 ` Jakub Kicinski
2025-07-25 0:42 ` [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2025-07-23 17:10 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, pabeni, andrew+netdev, horms, donald.hunter,
almasrymina, sdf, Jakub Kicinski
Use the just-added YNL helpers instead of manually setting
"_present" bits in the queue attrs. Compile tested only.
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Acked-by: Mina Almasry <almasrymina@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
tools/testing/selftests/drivers/net/hw/ncdevmem.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c b/tools/testing/selftests/drivers/net/hw/ncdevmem.c
index cc9b40d9c5d5..72f828021f83 100644
--- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c
+++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c
@@ -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;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
` (4 preceding siblings ...)
2025-07-23 17:10 ` [PATCH net-next v2 5/5] selftests: drv-net: devmem: use new mattr ynl helpers Jakub Kicinski
@ 2025-07-25 0:42 ` patchwork-bot+netdevbpf
5 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-07-25 0:42 UTC (permalink / raw)
To: Jakub Kicinski
Cc: davem, netdev, edumazet, pabeni, andrew+netdev, horms,
donald.hunter, almasrymina, sdf
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 23 Jul 2025 10:10:41 -0700 you wrote:
> 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.
>
> v2:
> - rename a variable to args
> v1: https://lore.kernel.org/20250722161927.3489203-1-kuba@kernel.org
>
> [...]
Here is the summary with links:
- [net-next,v2,1/5] tools: ynl-gen: don't add suffix for pure types
https://git.kernel.org/netdev/net-next/c/a8a9fd042e09
- [net-next,v2,2/5] tools: ynl-gen: move free printing to the print_type_full() helper
https://git.kernel.org/netdev/net-next/c/cf5869977702
- [net-next,v2,3/5] tools: ynl-gen: print alloc helper for multi-val attrs
https://git.kernel.org/netdev/net-next/c/2c222dde61c4
- [net-next,v2,4/5] tools: ynl-gen: print setters for multi-val attrs
https://git.kernel.org/netdev/net-next/c/8553fb7c555c
- [net-next,v2,5/5] selftests: drv-net: devmem: use new mattr ynl helpers
https://git.kernel.org/netdev/net-next/c/f70d9819c779
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-07-25 0:42 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-23 17:10 [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 1/5] tools: ynl-gen: don't add suffix for pure types Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 2/5] tools: ynl-gen: move free printing to the print_type_full() helper Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 3/5] tools: ynl-gen: print alloc helper for multi-val attrs Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 4/5] tools: ynl-gen: print setters " Jakub Kicinski
2025-07-23 17:10 ` [PATCH net-next v2 5/5] selftests: drv-net: devmem: use new mattr ynl helpers Jakub Kicinski
2025-07-25 0:42 ` [PATCH net-next v2 0/5] tools: ynl-gen: print setters for multi-val attrs patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).