* [PATCH net-next] netlink: specs: support conditional operations
@ 2023-10-25 16:22 Jakub Kicinski
2023-10-26 6:05 ` Jiri Pirko
2023-10-27 2:50 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 3+ messages in thread
From: Jakub Kicinski @ 2023-10-25 16:22 UTC (permalink / raw)
To: davem; +Cc: netdev, edumazet, pabeni, Jakub Kicinski
Page pool code is compiled conditionally, but the operations
are part of the shared netlink family. We can handle this
by reporting empty list of pools or -EOPNOTSUPP / -ENOSYS
but the cleanest way seems to be removing the ops completely
at compilation time. That way user can see that the page
pool ops are not present using genetlink introspection.
Same way they'd check if the kernel is "new enough" to
support the ops.
Extend the specs with the ability to specify the config
condition under which op (and its policies, etc.) should
be hidden.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
Documentation/netlink/genetlink-c.yaml | 5 +++++
Documentation/netlink/genetlink-legacy.yaml | 5 +++++
Documentation/netlink/genetlink.yaml | 5 +++++
tools/net/ynl/ynl-gen-c.py | 22 +++++++++++++++++++++
4 files changed, 37 insertions(+)
diff --git a/Documentation/netlink/genetlink-c.yaml b/Documentation/netlink/genetlink-c.yaml
index 7ef2496d57c8..9d13bbb7ae47 100644
--- a/Documentation/netlink/genetlink-c.yaml
+++ b/Documentation/netlink/genetlink-c.yaml
@@ -295,6 +295,11 @@ additionalProperties: False
type: array
items:
enum: [ strict, dump, dump-strict ]
+ config-cond:
+ description: |
+ Name of the kernel config option gating the presence of
+ the operation, without the 'CONFIG_' prefix.
+ type: string
do: &subop-type
description: Main command handler.
type: object
diff --git a/Documentation/netlink/genetlink-legacy.yaml b/Documentation/netlink/genetlink-legacy.yaml
index cd5ebe39b52c..0daf40402a29 100644
--- a/Documentation/netlink/genetlink-legacy.yaml
+++ b/Documentation/netlink/genetlink-legacy.yaml
@@ -346,6 +346,11 @@ additionalProperties: False
type: array
items:
enum: [ strict, dump, dump-strict ]
+ config-cond:
+ description: |
+ Name of the kernel config option gating the presence of
+ the operation, without the 'CONFIG_' prefix.
+ type: string
# Start genetlink-legacy
fixed-header: *fixed-header
# End genetlink-legacy
diff --git a/Documentation/netlink/genetlink.yaml b/Documentation/netlink/genetlink.yaml
index 501ed2e6c8ef..3283bf458ff1 100644
--- a/Documentation/netlink/genetlink.yaml
+++ b/Documentation/netlink/genetlink.yaml
@@ -264,6 +264,11 @@ additionalProperties: False
type: array
items:
enum: [ strict, dump, dump-strict ]
+ config-cond:
+ description: |
+ Name of the kernel config option gating the presence of
+ the operation, without the 'CONFIG_' prefix.
+ type: string
do: &subop-type
description: Main command handler.
type: object
diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 0fee68863db4..6eb32b2ef848 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -1162,6 +1162,7 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
self._block_end = False
self._silent_block = False
self._ind = 0
+ self._ifdef_block = None
if out_file is None:
self._out = os.sys.stdout
else:
@@ -1202,6 +1203,8 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
if self._silent_block:
ind += 1
self._silent_block = line.endswith(')') and CodeWriter._is_cond(line)
+ if line[0] == '#':
+ ind = 0
if add_ind:
ind += add_ind
self._out.write('\t' * ind + line + '\n')
@@ -1328,6 +1331,19 @@ from lib import SpecFamily, SpecAttrSet, SpecAttr, SpecOperation, SpecEnumSet, S
line += '= ' + str(one[1]) + ','
self.p(line)
+ def ifdef_block(self, config):
+ config_option = None
+ if config:
+ config_option = 'CONFIG_' + c_upper(config)
+ if self._ifdef_block == config_option:
+ return
+
+ if self._ifdef_block:
+ self.p('#endif /* ' + self._ifdef_block + ' */')
+ if config_option:
+ self.p('#ifdef ' + config_option)
+ self._ifdef_block = config_option
+
scalars = {'u8', 'u16', 'u32', 'u64', 's32', 's64', 'uint', 'sint'}
@@ -2006,10 +2022,13 @@ _C_KW = {
def print_req_policy(cw, struct, ri=None):
+ if ri and ri.op:
+ cw.ifdef_block(ri.op.get('config-cond', None))
print_req_policy_fwd(cw, struct, ri=ri, terminate=False)
for _, arg in struct.member_list():
arg.attr_policy(cw)
cw.p("};")
+ cw.ifdef_block(None)
cw.nl()
@@ -2127,6 +2146,7 @@ _C_KW = {
if op.is_async:
continue
+ cw.ifdef_block(op.get('config-cond', None))
cw.block_start()
members = [('cmd', op.enum_name)]
if 'dont-validate' in op:
@@ -2157,6 +2177,7 @@ _C_KW = {
if op.is_async or op_mode not in op:
continue
+ cw.ifdef_block(op.get('config-cond', None))
cw.block_start()
members = [('cmd', op.enum_name)]
if 'dont-validate' in op:
@@ -2192,6 +2213,7 @@ _C_KW = {
members.append(('flags', ' | '.join([c_upper('genl-' + x) for x in flags])))
cw.write_struct_init(members)
cw.block_end(line=',')
+ cw.ifdef_block(None)
cw.block_end(line=';')
cw.nl()
--
2.41.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH net-next] netlink: specs: support conditional operations
2023-10-25 16:22 [PATCH net-next] netlink: specs: support conditional operations Jakub Kicinski
@ 2023-10-26 6:05 ` Jiri Pirko
2023-10-27 2:50 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: Jiri Pirko @ 2023-10-26 6:05 UTC (permalink / raw)
To: Jakub Kicinski; +Cc: davem, netdev, edumazet, pabeni
Wed, Oct 25, 2023 at 06:22:53PM CEST, kuba@kernel.org wrote:
>Page pool code is compiled conditionally, but the operations
>are part of the shared netlink family. We can handle this
>by reporting empty list of pools or -EOPNOTSUPP / -ENOSYS
>but the cleanest way seems to be removing the ops completely
>at compilation time. That way user can see that the page
>pool ops are not present using genetlink introspection.
>Same way they'd check if the kernel is "new enough" to
>support the ops.
>
>Extend the specs with the ability to specify the config
>condition under which op (and its policies, etc.) should
>be hidden.
>
>Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net-next] netlink: specs: support conditional operations
2023-10-25 16:22 [PATCH net-next] netlink: specs: support conditional operations Jakub Kicinski
2023-10-26 6:05 ` Jiri Pirko
@ 2023-10-27 2:50 ` patchwork-bot+netdevbpf
1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-10-27 2:50 UTC (permalink / raw)
To: Jakub Kicinski; +Cc: davem, netdev, edumazet, pabeni
Hello:
This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 25 Oct 2023 09:22:53 -0700 you wrote:
> Page pool code is compiled conditionally, but the operations
> are part of the shared netlink family. We can handle this
> by reporting empty list of pools or -EOPNOTSUPP / -ENOSYS
> but the cleanest way seems to be removing the ops completely
> at compilation time. That way user can see that the page
> pool ops are not present using genetlink introspection.
> Same way they'd check if the kernel is "new enough" to
> support the ops.
>
> [...]
Here is the summary with links:
- [net-next] netlink: specs: support conditional operations
https://git.kernel.org/netdev/net-next/c/bc30bb88ff31
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] 3+ messages in thread
end of thread, other threads:[~2023-10-27 2:50 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-25 16:22 [PATCH net-next] netlink: specs: support conditional operations Jakub Kicinski
2023-10-26 6:05 ` Jiri Pirko
2023-10-27 2:50 ` 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).