netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).