2023-06-13 23:23:58

by Kubalewski, Arkadiusz

[permalink] [raw]
Subject: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

Including ynl generated uapi header files into source kerneldocs
(rst files in Documentation/) produces warnings during documentation
builds (i.e. make htmldocs)

Prevent warnings by generating also description for enums where rander_max
was selected.

Signed-off-by: Arkadiusz Kubalewski <[email protected]>
---
include/uapi/linux/netdev.h | 1 +
tools/include/uapi/linux/netdev.h | 1 +
tools/net/ynl/ynl-gen-c.py | 11 ++++++++++-
3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
index 639524b59930..d78f7ae95092 100644
--- a/include/uapi/linux/netdev.h
+++ b/include/uapi/linux/netdev.h
@@ -24,6 +24,7 @@
* XDP buffer support in the driver napi callback.
* @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements
* non-linear XDP buffer support in ndo_xdp_xmit callback.
+ * @NETDEV_XDP_ACT_MASK: valid values mask
*/
enum netdev_xdp_act {
NETDEV_XDP_ACT_BASIC = 1,
diff --git a/tools/include/uapi/linux/netdev.h b/tools/include/uapi/linux/netdev.h
index 639524b59930..d78f7ae95092 100644
--- a/tools/include/uapi/linux/netdev.h
+++ b/tools/include/uapi/linux/netdev.h
@@ -24,6 +24,7 @@
* XDP buffer support in the driver napi callback.
* @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements
* non-linear XDP buffer support in ndo_xdp_xmit callback.
+ * @NETDEV_XDP_ACT_MASK: valid values mask
*/
enum netdev_xdp_act {
NETDEV_XDP_ACT_BASIC = 1,
diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 0b5e0802a9a7..0d396bf98c27 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -2011,6 +2011,7 @@ def render_uapi(family, cw):
# Write kdoc for enum and flags (one day maybe also structs)
if const['type'] == 'enum' or const['type'] == 'flags':
enum = family.consts[const['name']]
+ name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")

if enum.has_doc():
cw.p('/**')
@@ -2022,10 +2023,18 @@ def render_uapi(family, cw):
if entry.has_doc():
doc = '@' + entry.c_name + ': ' + entry['doc']
cw.write_doc_line(doc)
+ if const.get('render-max', False):
+ if const['type'] == 'flags':
+ doc = '@' + c_upper(name_pfx + 'mask') + ': valid values mask'
+ cw.write_doc_line(doc)
+ else:
+ doc = '@' + c_upper(name_pfx + 'max') + ': max valid value'
+ cw.write_doc_line(doc)
+ doc = '@__' + c_upper(name_pfx + 'max') + ': do not use'
+ cw.write_doc_line(doc)
cw.p(' */')

uapi_enum_start(family, cw, const, 'name')
- name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
for entry in enum.entries.values():
suffix = ','
if entry.value_change:
--
2.37.3



2023-06-14 01:05:22

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

On Wed, 14 Jun 2023 01:17:09 +0200 Arkadiusz Kubalewski wrote:
> Including ynl generated uapi header files into source kerneldocs
> (rst files in Documentation/) produces warnings during documentation
> builds (i.e. make htmldocs)
>
> Prevent warnings by generating also description for enums where rander_max
> was selected.

Do you reckon that documenting the meta-values makes sense, or should
we throw a:

/* private: */

comment in front of them so that kdoc ignores them? Does user space
have any use for those? If we want to document them...

> diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
> index 639524b59930..d78f7ae95092 100644
> --- a/include/uapi/linux/netdev.h
> +++ b/include/uapi/linux/netdev.h
> @@ -24,6 +24,7 @@
> * XDP buffer support in the driver napi callback.
> * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements
> * non-linear XDP buffer support in ndo_xdp_xmit callback.
> + * @NETDEV_XDP_ACT_MASK: valid values mask

... I think we need to include some sort of indication that the value
will change as the uAPI is extended. Unlike the other values which are
set in stone, so to speak. "mask of currently defines values" ? Dunno.

> */
> enum netdev_xdp_act {
> NETDEV_XDP_ACT_BASIC = 1,
> diff --git a/tools/include/uapi/linux/netdev.h b/tools/include/uapi/linux/netdev.h
> index 639524b59930..d78f7ae95092 100644
> --- a/tools/include/uapi/linux/netdev.h
> +++ b/tools/include/uapi/linux/netdev.h
> @@ -24,6 +24,7 @@
> * XDP buffer support in the driver napi callback.
> * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements
> * non-linear XDP buffer support in ndo_xdp_xmit callback.
> + * @NETDEV_XDP_ACT_MASK: valid values mask
> */
> enum netdev_xdp_act {
> NETDEV_XDP_ACT_BASIC = 1,
> diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
> index 0b5e0802a9a7..0d396bf98c27 100755
> --- a/tools/net/ynl/ynl-gen-c.py
> +++ b/tools/net/ynl/ynl-gen-c.py
> @@ -2011,6 +2011,7 @@ def render_uapi(family, cw):
> # Write kdoc for enum and flags (one day maybe also structs)
> if const['type'] == 'enum' or const['type'] == 'flags':
> enum = family.consts[const['name']]
> + name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
>
> if enum.has_doc():
> cw.p('/**')
> @@ -2022,10 +2023,18 @@ def render_uapi(family, cw):
> if entry.has_doc():
> doc = '@' + entry.c_name + ': ' + entry['doc']
> cw.write_doc_line(doc)
> + if const.get('render-max', False):
> + if const['type'] == 'flags':
> + doc = '@' + c_upper(name_pfx + 'mask') + ': valid values mask'
> + cw.write_doc_line(doc)
> + else:
> + doc = '@' + c_upper(name_pfx + 'max') + ': max valid value'
> + cw.write_doc_line(doc)
> + doc = '@__' + c_upper(name_pfx + 'max') + ': do not use'

This one is definitely a candidate for /* private: */

> + cw.write_doc_line(doc)
> cw.p(' */')
>
> uapi_enum_start(family, cw, const, 'name')
> - name_pfx = const.get('name-prefix', f"{family.name}-{const['name']}-")
> for entry in enum.entries.values():
> suffix = ','
> if entry.value_change:

--
pw-bot: cr

2023-06-14 12:57:23

by Kubalewski, Arkadiusz

[permalink] [raw]
Subject: RE: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

>From: Jakub Kicinski <[email protected]>
>Sent: Wednesday, June 14, 2023 2:59 AM
>
>On Wed, 14 Jun 2023 01:17:09 +0200 Arkadiusz Kubalewski wrote:
>> Including ynl generated uapi header files into source kerneldocs
>> (rst files in Documentation/) produces warnings during documentation
>> builds (i.e. make htmldocs)
>>
>> Prevent warnings by generating also description for enums where
>> rander_max was selected.
>
>Do you reckon that documenting the meta-values makes sense, or should
>we throw a:
>
>/* private: */
>

Most probably it doesn't..
Tried this:
/*
[ other values description ]
* private:
* @__<NAME>_MAX
*/
and this:
/*
[ other values description ]
* private: @__<NAME>_MAX
*/

Both are not working as we would expect.

Do you mean to have double comments for enums? like:
/*
[ other values description ]
*/
/*
* private:
* @__<NAME>_MAX
*/

>comment in front of them so that kdoc ignores them? Does user space
>have any use for those? If we want to document them...
>

Hmm, do you recall where I can find proper format of such ignore enum comment
for kdoc generation?
Or maybe we need to also submit patch to some kdoc build process to actually
change the current behavior?

>> diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
>> index 639524b59930..d78f7ae95092 100644
>> --- a/include/uapi/linux/netdev.h
>> +++ b/include/uapi/linux/netdev.h
>> @@ -24,6 +24,7 @@
>> * XDP buffer support in the driver napi callback.
>> * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements
>> * non-linear XDP buffer support in ndo_xdp_xmit callback.
>> + * @NETDEV_XDP_ACT_MASK: valid values mask
>
>... I think we need to include some sort of indication that the value
>will change as the uAPI is extended. Unlike the other values which are
>set in stone, so to speak. "mask of currently defines values" ? Dunno.
>

Sure can fix this.

>> */
>> enum netdev_xdp_act {
>> NETDEV_XDP_ACT_BASIC = 1,
>> diff --git a/tools/include/uapi/linux/netdev.h
>>b/tools/include/uapi/linux/netdev.h
>> index 639524b59930..d78f7ae95092 100644
>> --- a/tools/include/uapi/linux/netdev.h
>> +++ b/tools/include/uapi/linux/netdev.h
>> @@ -24,6 +24,7 @@
>> * XDP buffer support in the driver napi callback.
>> * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev
>>implements
>> * non-linear XDP buffer support in ndo_xdp_xmit callback.
>> + * @NETDEV_XDP_ACT_MASK: valid values mask
>> */
>> enum netdev_xdp_act {
>> NETDEV_XDP_ACT_BASIC = 1,
>> diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
>> index 0b5e0802a9a7..0d396bf98c27 100755
>> --- a/tools/net/ynl/ynl-gen-c.py
>> +++ b/tools/net/ynl/ynl-gen-c.py
>> @@ -2011,6 +2011,7 @@ def render_uapi(family, cw):
>> # Write kdoc for enum and flags (one day maybe also structs)
>> if const['type'] == 'enum' or const['type'] == 'flags':
>> enum = family.consts[const['name']]
>> + name_pfx = const.get('name-prefix', f"{family.name}-
>>{const['name']}-")
>>
>> if enum.has_doc():
>> cw.p('/**')
>> @@ -2022,10 +2023,18 @@ def render_uapi(family, cw):
>> if entry.has_doc():
>> doc = '@' + entry.c_name + ': ' + entry['doc']
>> cw.write_doc_line(doc)
>> + if const.get('render-max', False):
>> + if const['type'] == 'flags':
>> + doc = '@' + c_upper(name_pfx + 'mask') + ':
>>valid values mask'
>> + cw.write_doc_line(doc)
>> + else:
>> + doc = '@' + c_upper(name_pfx + 'max') + ': max
>>valid value'
>> + cw.write_doc_line(doc)
>> + doc = '@__' + c_upper(name_pfx + 'max') + ': do
>>not use'
>
>This one is definitely a candidate for /* private: */

Yep, makes sense, trying to find some way...

Thank you,
Arkadiusz

>
>> + cw.write_doc_line(doc)
>> cw.p(' */')
>>
>> uapi_enum_start(family, cw, const, 'name')
>> - name_pfx = const.get('name-prefix', f"{family.name}-
>{const['name']}-")
>> for entry in enum.entries.values():
>> suffix = ','
>> if entry.value_change:
>
>--
>pw-bot: cr

2023-06-14 17:58:34

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

On Wed, 14 Jun 2023 12:48:14 +0000 Kubalewski, Arkadiusz wrote:
> >From: Jakub Kicinski <[email protected]>
> >Sent: Wednesday, June 14, 2023 2:59 AM
> >
> >On Wed, 14 Jun 2023 01:17:09 +0200 Arkadiusz Kubalewski wrote:
> >> Including ynl generated uapi header files into source kerneldocs
> >> (rst files in Documentation/) produces warnings during documentation
> >> builds (i.e. make htmldocs)
> >>
> >> Prevent warnings by generating also description for enums where
> >> rander_max was selected.
> >
> >Do you reckon that documenting the meta-values makes sense, or should
> >we throw a:
> >
> >/* private: */
> >
>
> Most probably it doesn't..
> Tried this:
> /*
> [ other values description ]
> * private:
> * @__<NAME>_MAX
> */
> and this:
> /*
> [ other values description ]
> * private: @__<NAME>_MAX
> */
>
> Both are not working as we would expect.
>
> Do you mean to have double comments for enums? like:
> /*
> [ other values description ]
> */
> /*
> * private:
> * @__<NAME>_MAX
> */
>
> >comment in front of them so that kdoc ignores them? Does user space
> >have any use for those? If we want to document them...
>
> Hmm, do you recall where I can find proper format of such ignore enum comment
> for kdoc generation?
> Or maybe we need to also submit patch to some kdoc build process to actually
> change the current behavior?

It's explained in the kdoc documentation :(
https://docs.kernel.org/doc-guide/kernel-doc.html#members

2023-06-14 22:35:45

by Kubalewski, Arkadiusz

[permalink] [raw]
Subject: RE: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

>From: Jakub Kicinski <[email protected]>
>Sent: Wednesday, June 14, 2023 7:39 PM
>
>On Wed, 14 Jun 2023 12:48:14 +0000 Kubalewski, Arkadiusz wrote:
>> >From: Jakub Kicinski <[email protected]>
>> >Sent: Wednesday, June 14, 2023 2:59 AM
>> >
>> >On Wed, 14 Jun 2023 01:17:09 +0200 Arkadiusz Kubalewski wrote:
>> >> Including ynl generated uapi header files into source kerneldocs
>> >> (rst files in Documentation/) produces warnings during documentation
>> >> builds (i.e. make htmldocs)
>> >>
>> >> Prevent warnings by generating also description for enums where
>> >> rander_max was selected.
>> >
>> >Do you reckon that documenting the meta-values makes sense, or should
>> >we throw a:
>> >
>> >/* private: */
>> >
>>
>> Most probably it doesn't..
>> Tried this:
>> /*
>> [ other values description ]
>> * private:
>> * @__<NAME>_MAX
>> */
>> and this:
>> /*
>> [ other values description ]
>> * private: @__<NAME>_MAX
>> */
>>
>> Both are not working as we would expect.
>>
>> Do you mean to have double comments for enums? like:
>> /*
>> [ other values description ]
>> */
>> /*
>> * private:
>> * @__<NAME>_MAX
>> */
>>
>> >comment in front of them so that kdoc ignores them? Does user space
>> >have any use for those? If we want to document them...
>>
>> Hmm, do you recall where I can find proper format of such ignore enum
>comment
>> for kdoc generation?
>> Or maybe we need to also submit patch to some kdoc build process to
>actually
>> change the current behavior?
>
>It's explained in the kdoc documentation :(
>https://docs.kernel.org/doc-guide/kernel-doc.html#members


Thanks for pointing this, but it doesn't work :/

I tried described format but still ./scripts/kernel-doc warns about it.
Same as 'make htmldocs' does, as it uses ./scripts/kernel-doc

Also, if the enum is not described in the header, the docs produced by
the 'make htmldocs' would list the enum with the comment "undescribed".

It seems we need fixing:
- prevent warning from ./scripts/kernel-doc, so enums marked as "private:"
would not warn
- generate __<ENUM_NAME>_MAX while marking them as "/* private: */"
- add some kind of "pattern exclude" directive/mechanics for generating
docs with sphinx

Does it make sense?
TBH, not yet sure if all above are possible..

Thank you!
Arkadiusz

2023-06-15 04:28:15

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next] tools: ynl-gen: generate docs for <name>_max/_mask enums

On Wed, 14 Jun 2023 22:11:38 +0000 Kubalewski, Arkadiusz wrote:
> Thanks for pointing this, but it doesn't work :/
>
> I tried described format but still ./scripts/kernel-doc warns about it.
> Same as 'make htmldocs' does, as it uses ./scripts/kernel-doc
>
> Also, if the enum is not described in the header, the docs produced by
> the 'make htmldocs' would list the enum with the comment "undescribed".

Oh, you're right :S Looks like private: does not work for enums.

> It seems we need fixing:
> - prevent warning from ./scripts/kernel-doc, so enums marked as "private:"
> would not warn
> - generate __<ENUM_NAME>_MAX while marking them as "/* private: */"
> - add some kind of "pattern exclude" directive/mechanics for generating
> docs with sphinx
>
> Does it make sense?
> TBH, not yet sure if all above are possible..

Let's ask Jon, and wait for him to chime in, I don't think these
warnings should be a blocker for new families.

Jon, we have some "meta" entries in the uAPI enums in netlink
to mark the number of attributes, eg:

enum {
NETDEV_A_DEV_IFINDEX = 1,
NETDEV_A_DEV_PAD,
NETDEV_A_DEV_XDP_FEATURES,
/* private: */
__NETDEV_A_DEV_MAX, // this
NETDEV_A_DEV_MAX = (__NETDEV_A_DEV_MAX - 1) // and this
};

Also masks of all flags like:

enum netdev_xdp_act {
NETDEV_XDP_ACT_BASIC = 1,
NETDEV_XDP_ACT_REDIRECT = 2,
NETDEV_XDP_ACT_NDO_XMIT = 4,
NETDEV_XDP_ACT_XSK_ZEROCOPY = 8,
NETDEV_XDP_ACT_HW_OFFLOAD = 16,
NETDEV_XDP_ACT_RX_SG = 32,
NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
/* private: */
NETDEV_XDP_ACT_MASK = 127, // this
};

which user space should not care about.

I was hoping we can mark them as /* private: */ but that doesn't
work, when we add kdocs without documenting those - there's a warning.
Is this a known problem? Is it worth fixing?
Do we need to fix both kernel-doc and sphinx or just the former?