* [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).