netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL
@ 2023-06-12 15:59 Jakub Kicinski
  2023-06-12 15:59 ` [PATCH net-next 1/2] tools: ynl-gen: correct enum policies Jakub Kicinski
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Jakub Kicinski @ 2023-06-12 15:59 UTC (permalink / raw)
  To: davem; +Cc: netdev, edumazet, pabeni, arkadiusz.kubalewski, Jakub Kicinski

A set of improvements needed to generate the kernel code for DPLL.

Jakub Kicinski (2):
  tools: ynl-gen: correct enum policies
  tools: ynl-gen: inherit policy in multi-attr

 tools/net/ynl/ynl-gen-c.py | 57 +++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 20 deletions(-)

-- 
2.40.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/2] tools: ynl-gen: correct enum policies
  2023-06-12 15:59 [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL Jakub Kicinski
@ 2023-06-12 15:59 ` Jakub Kicinski
  2023-06-12 16:55   ` Keller, Jacob E
  2023-06-12 15:59 ` [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr Jakub Kicinski
  2023-06-13 18:50 ` [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL patchwork-bot+netdevbpf
  2 siblings, 1 reply; 6+ messages in thread
From: Jakub Kicinski @ 2023-06-12 15:59 UTC (permalink / raw)
  To: davem; +Cc: netdev, edumazet, pabeni, arkadiusz.kubalewski, Jakub Kicinski

Scalar range validation assumes enums start at 0.
Teach it to properly calculate the value range.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 tools/net/ynl/ynl-gen-c.py | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 870f98d0e12c..54777d529f5e 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -300,8 +300,10 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
             return f"NLA_POLICY_MIN({policy}, {self.checks['min']})"
         elif 'enum' in self.attr:
             enum = self.family.consts[self.attr['enum']]
-            cnt = len(enum['entries'])
-            return f"NLA_POLICY_MAX({policy}, {cnt - 1})"
+            low, high = enum.value_range()
+            if low == 0:
+                return f"NLA_POLICY_MAX({policy}, {high})"
+            return f"NLA_POLICY_RANGE({policy}, {low}, {high})"
         return super()._attr_policy(policy)
 
     def _attr_typol(self):
@@ -676,6 +678,15 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
     def new_entry(self, entry, prev_entry, value_start):
         return EnumEntry(self, entry, prev_entry, value_start)
 
+    def value_range(self):
+        low = min([x.value for x in self.entries.values()])
+        high = max([x.value for x in self.entries.values()])
+
+        if high - low + 1 != len(self.entries):
+            raise Exception("Can't get value range for a noncontiguous enum")
+
+        return low, high
+
 
 class AttrSet(SpecAttrSet):
     def __init__(self, family, yaml):
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr
  2023-06-12 15:59 [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL Jakub Kicinski
  2023-06-12 15:59 ` [PATCH net-next 1/2] tools: ynl-gen: correct enum policies Jakub Kicinski
@ 2023-06-12 15:59 ` Jakub Kicinski
  2023-06-12 16:56   ` Keller, Jacob E
  2023-06-13 18:50 ` [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL patchwork-bot+netdevbpf
  2 siblings, 1 reply; 6+ messages in thread
From: Jakub Kicinski @ 2023-06-12 15:59 UTC (permalink / raw)
  To: davem; +Cc: netdev, edumazet, pabeni, arkadiusz.kubalewski, Jakub Kicinski

Instead of reimplementing policies in MutliAttr for every
underlying type forward the calls to the base type.
This will be needed for DPLL which uses a multi-attr nest,
and currently gets an invalid NLA_NEST policy generated.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 tools/net/ynl/ynl-gen-c.py | 42 ++++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 54777d529f5e..71c5e79e877f 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -462,6 +462,11 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
 
 
 class TypeMultiAttr(Type):
+    def __init__(self, family, attr_set, attr, value, base_type):
+        super().__init__(family, attr_set, attr, value)
+
+        self.base_type = base_type
+
     def is_multi_val(self):
         return True
 
@@ -497,13 +502,11 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
         else:
             raise Exception(f"Free of MultiAttr sub-type {self.attr['type']} not supported yet")
 
+    def _attr_policy(self, policy):
+        return self.base_type._attr_policy(policy)
+
     def _attr_typol(self):
-        if 'type' not in self.attr or self.attr['type'] == 'nest':
-            return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
-        elif self.attr['type'] in scalars:
-            return f".type = YNL_PT_U{self.attr['type'][1:]}, "
-        else:
-            raise Exception(f"Sub-type {self.attr['type']} not supported yet")
+        return self.base_type._attr_typol()
 
     def _attr_get(self, ri, var):
         return f'n_{self.c_name}++;', None, None
@@ -717,29 +720,32 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
             self.c_name = ''
 
     def new_attr(self, elem, value):
-        if 'multi-attr' in elem and elem['multi-attr']:
-            return TypeMultiAttr(self.family, self, elem, value)
-        elif elem['type'] in scalars:
-            return TypeScalar(self.family, self, elem, value)
+        if elem['type'] in scalars:
+            t = TypeScalar(self.family, self, elem, value)
         elif elem['type'] == 'unused':
-            return TypeUnused(self.family, self, elem, value)
+            t = TypeUnused(self.family, self, elem, value)
         elif elem['type'] == 'pad':
-            return TypePad(self.family, self, elem, value)
+            t = TypePad(self.family, self, elem, value)
         elif elem['type'] == 'flag':
-            return TypeFlag(self.family, self, elem, value)
+            t = TypeFlag(self.family, self, elem, value)
         elif elem['type'] == 'string':
-            return TypeString(self.family, self, elem, value)
+            t = TypeString(self.family, self, elem, value)
         elif elem['type'] == 'binary':
-            return TypeBinary(self.family, self, elem, value)
+            t = TypeBinary(self.family, self, elem, value)
         elif elem['type'] == 'nest':
-            return TypeNest(self.family, self, elem, value)
+            t = TypeNest(self.family, self, elem, value)
         elif elem['type'] == 'array-nest':
-            return TypeArrayNest(self.family, self, elem, value)
+            t = TypeArrayNest(self.family, self, elem, value)
         elif elem['type'] == 'nest-type-value':
-            return TypeNestTypeValue(self.family, self, elem, value)
+            t = TypeNestTypeValue(self.family, self, elem, value)
         else:
             raise Exception(f"No typed class for type {elem['type']}")
 
+        if 'multi-attr' in elem and elem['multi-attr']:
+            t = TypeMultiAttr(self.family, self, elem, value, t)
+
+        return t
+
 
 class Operation(SpecOperation):
     def __init__(self, family, yaml, req_value, rsp_value):
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* RE: [PATCH net-next 1/2] tools: ynl-gen: correct enum policies
  2023-06-12 15:59 ` [PATCH net-next 1/2] tools: ynl-gen: correct enum policies Jakub Kicinski
@ 2023-06-12 16:55   ` Keller, Jacob E
  0 siblings, 0 replies; 6+ messages in thread
From: Keller, Jacob E @ 2023-06-12 16:55 UTC (permalink / raw)
  To: Jakub Kicinski, davem; +Cc: netdev, edumazet, pabeni, Kubalewski, Arkadiusz



> -----Original Message-----
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Monday, June 12, 2023 8:59 AM
> To: davem@davemloft.net
> Cc: netdev@vger.kernel.org; edumazet@google.com; pabeni@redhat.com;
> Kubalewski, Arkadiusz <arkadiusz.kubalewski@intel.com>; Jakub Kicinski
> <kuba@kernel.org>
> Subject: [PATCH net-next 1/2] tools: ynl-gen: correct enum policies
> 
> Scalar range validation assumes enums start at 0.
> Teach it to properly calculate the value range.
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>

>  tools/net/ynl/ynl-gen-c.py | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
> index 870f98d0e12c..54777d529f5e 100755
> --- a/tools/net/ynl/ynl-gen-c.py
> +++ b/tools/net/ynl/ynl-gen-c.py
> @@ -300,8 +300,10 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr,
> SpecOperation, SpecEnumSet, S
>              return f"NLA_POLICY_MIN({policy}, {self.checks['min']})"
>          elif 'enum' in self.attr:
>              enum = self.family.consts[self.attr['enum']]
> -            cnt = len(enum['entries'])
> -            return f"NLA_POLICY_MAX({policy}, {cnt - 1})"
> +            low, high = enum.value_range()
> +            if low == 0:
> +                return f"NLA_POLICY_MAX({policy}, {high})"
> +            return f"NLA_POLICY_RANGE({policy}, {low}, {high})"
>          return super()._attr_policy(policy)
> 
>      def _attr_typol(self):
> @@ -676,6 +678,15 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr,
> SpecOperation, SpecEnumSet, S
>      def new_entry(self, entry, prev_entry, value_start):
>          return EnumEntry(self, entry, prev_entry, value_start)
> 
> +    def value_range(self):
> +        low = min([x.value for x in self.entries.values()])
> +        high = max([x.value for x in self.entries.values()])
> +
> +        if high - low + 1 != len(self.entries):
> +            raise Exception("Can't get value range for a noncontiguous enum")
> +

Guessing we don't anticipate any non-contiguous enums so an exception here is fine

> +        return low, high
> +
> 
>  class AttrSet(SpecAttrSet):
>      def __init__(self, family, yaml):
> --
> 2.40.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr
  2023-06-12 15:59 ` [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr Jakub Kicinski
@ 2023-06-12 16:56   ` Keller, Jacob E
  0 siblings, 0 replies; 6+ messages in thread
From: Keller, Jacob E @ 2023-06-12 16:56 UTC (permalink / raw)
  To: Jakub Kicinski, davem; +Cc: netdev, edumazet, pabeni, Kubalewski, Arkadiusz



> -----Original Message-----
> From: Jakub Kicinski <kuba@kernel.org>
> Sent: Monday, June 12, 2023 8:59 AM
> To: davem@davemloft.net
> Cc: netdev@vger.kernel.org; edumazet@google.com; pabeni@redhat.com;
> Kubalewski, Arkadiusz <arkadiusz.kubalewski@intel.com>; Jakub Kicinski
> <kuba@kernel.org>
> Subject: [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr
> 
> Instead of reimplementing policies in MutliAttr for every
> underlying type forward the calls to the base type.
> This will be needed for DPLL which uses a multi-attr nest,
> and currently gets an invalid NLA_NEST policy generated.
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>

Reviewed-by: Jacob Keller <Jacob.e.keller@intel.com>

> ---
>  tools/net/ynl/ynl-gen-c.py | 42 ++++++++++++++++++++++----------------
>  1 file changed, 24 insertions(+), 18 deletions(-)
> 
> diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
> index 54777d529f5e..71c5e79e877f 100755
> --- a/tools/net/ynl/ynl-gen-c.py
> +++ b/tools/net/ynl/ynl-gen-c.py
> @@ -462,6 +462,11 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr,
> SpecOperation, SpecEnumSet, S
> 
> 
>  class TypeMultiAttr(Type):
> +    def __init__(self, family, attr_set, attr, value, base_type):
> +        super().__init__(family, attr_set, attr, value)
> +
> +        self.base_type = base_type
> +
>      def is_multi_val(self):
>          return True
> 
> @@ -497,13 +502,11 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr,
> SpecOperation, SpecEnumSet, S
>          else:
>              raise Exception(f"Free of MultiAttr sub-type {self.attr['type']} not
> supported yet")
> 
> +    def _attr_policy(self, policy):
> +        return self.base_type._attr_policy(policy)
> +
>      def _attr_typol(self):
> -        if 'type' not in self.attr or self.attr['type'] == 'nest':
> -            return f'.type = YNL_PT_NEST, .nest = &{self.nested_render_name}_nest, '
> -        elif self.attr['type'] in scalars:
> -            return f".type = YNL_PT_U{self.attr['type'][1:]}, "
> -        else:
> -            raise Exception(f"Sub-type {self.attr['type']} not supported yet")
> +        return self.base_type._attr_typol()
> 
>      def _attr_get(self, ri, var):
>          return f'n_{self.c_name}++;', None, None
> @@ -717,29 +720,32 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr,
> SpecOperation, SpecEnumSet, S
>              self.c_name = ''
> 
>      def new_attr(self, elem, value):
> -        if 'multi-attr' in elem and elem['multi-attr']:
> -            return TypeMultiAttr(self.family, self, elem, value)
> -        elif elem['type'] in scalars:
> -            return TypeScalar(self.family, self, elem, value)
> +        if elem['type'] in scalars:
> +            t = TypeScalar(self.family, self, elem, value)
>          elif elem['type'] == 'unused':
> -            return TypeUnused(self.family, self, elem, value)
> +            t = TypeUnused(self.family, self, elem, value)
>          elif elem['type'] == 'pad':
> -            return TypePad(self.family, self, elem, value)
> +            t = TypePad(self.family, self, elem, value)
>          elif elem['type'] == 'flag':
> -            return TypeFlag(self.family, self, elem, value)
> +            t = TypeFlag(self.family, self, elem, value)
>          elif elem['type'] == 'string':
> -            return TypeString(self.family, self, elem, value)
> +            t = TypeString(self.family, self, elem, value)
>          elif elem['type'] == 'binary':
> -            return TypeBinary(self.family, self, elem, value)
> +            t = TypeBinary(self.family, self, elem, value)
>          elif elem['type'] == 'nest':
> -            return TypeNest(self.family, self, elem, value)
> +            t = TypeNest(self.family, self, elem, value)
>          elif elem['type'] == 'array-nest':
> -            return TypeArrayNest(self.family, self, elem, value)
> +            t = TypeArrayNest(self.family, self, elem, value)
>          elif elem['type'] == 'nest-type-value':
> -            return TypeNestTypeValue(self.family, self, elem, value)
> +            t = TypeNestTypeValue(self.family, self, elem, value)
>          else:
>              raise Exception(f"No typed class for type {elem['type']}")
> 
> +        if 'multi-attr' in elem and elem['multi-attr']:
> +            t = TypeMultiAttr(self.family, self, elem, value, t)
> +
> +        return t
> +
> 
>  class Operation(SpecOperation):
>      def __init__(self, family, yaml, req_value, rsp_value):
> --
> 2.40.1
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL
  2023-06-12 15:59 [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL Jakub Kicinski
  2023-06-12 15:59 ` [PATCH net-next 1/2] tools: ynl-gen: correct enum policies Jakub Kicinski
  2023-06-12 15:59 ` [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr Jakub Kicinski
@ 2023-06-13 18:50 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-06-13 18:50 UTC (permalink / raw)
  To: Jakub Kicinski; +Cc: davem, netdev, edumazet, pabeni, arkadiusz.kubalewski

Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 12 Jun 2023 08:59:18 -0700 you wrote:
> A set of improvements needed to generate the kernel code for DPLL.
> 
> Jakub Kicinski (2):
>   tools: ynl-gen: correct enum policies
>   tools: ynl-gen: inherit policy in multi-attr
> 
>  tools/net/ynl/ynl-gen-c.py | 57 +++++++++++++++++++++++++-------------
>  1 file changed, 37 insertions(+), 20 deletions(-)

Here is the summary with links:
  - [net-next,1/2] tools: ynl-gen: correct enum policies
    https://git.kernel.org/netdev/net-next/c/10c4d2a7b88d
  - [net-next,2/2] tools: ynl-gen: inherit policy in multi-attr
    https://git.kernel.org/netdev/net-next/c/be093a80dff0

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] 6+ messages in thread

end of thread, other threads:[~2023-06-13 18:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-12 15:59 [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL Jakub Kicinski
2023-06-12 15:59 ` [PATCH net-next 1/2] tools: ynl-gen: correct enum policies Jakub Kicinski
2023-06-12 16:55   ` Keller, Jacob E
2023-06-12 15:59 ` [PATCH net-next 2/2] tools: ynl-gen: inherit policy in multi-attr Jakub Kicinski
2023-06-12 16:56   ` Keller, Jacob E
2023-06-13 18:50 ` [PATCH net-next 0/2] tools: ynl-gen: improvements for DPLL 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).