From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Randy Dunlap <rdunlap@infradead.org>
Cc: Linux Doc Mailing List <linux-doc@vger.kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] kernel-doc: add support for handling global variables
Date: Tue, 9 Sep 2025 22:37:43 +0200 [thread overview]
Message-ID: <20250909223743.0dd33b1d@foz.lan> (raw)
In-Reply-To: <d73e68e9-321e-4685-b4fe-633cd282f526@infradead.org>
Em Tue, 9 Sep 2025 11:20:31 -0700
Randy Dunlap <rdunlap@infradead.org> escreveu:
> On 9/9/25 9:18 AM, Mauro Carvalho Chehab wrote:
> > On Tue, Sep 09, 2025 at 08:57:07AM -0700, Randy Dunlap wrote:
> >> Hi Mauro,
> >>
> >> On 9/9/25 12:27 AM, Randy Dunlap wrote:
> >>> Hi Mauro,
> >>>
> >>> I have a few patch nits below, then some testing info.
> >>>
> >>>
> >>> On 9/7/25 9:22 AM, Mauro Carvalho Chehab wrote:
> >>>> Specially on kAPI, sometimes it is desirable to be able to
> >>>> describe global variables that are part of kAPI.
> >>>>
> >>>> Documenting vars with Sphinx is simple, as we don't need
> >>>> to parse a data struct. All we need is the variable
> >>>> declaration and use natice C domain ::c:var: to format it
> >>>> for us.
> >>>>
> >>>> Add support for it.
> >>>>
> >>>> Link: https://lore.kernel.org/linux-doc/491c3022-cef8-4860-a945-c9c4a3b63c09@infradead.org/T/#m947c25d95cb1d96a394410ab1131dc8e9e5013f1
> >>>> Suggested-by: Randy Dunlap <rdunlap@infradead.org>
> >>>> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
> >>>> ---
> >>>> scripts/lib/kdoc/kdoc_output.py | 31 +++++++++++++++++++++++++++++++
> >>>> scripts/lib/kdoc/kdoc_parser.py | 25 ++++++++++++++++++++++++-
> >>>> 2 files changed, 55 insertions(+), 1 deletion(-)
> >>>>
> >>
> >>
> >>> So, I grabbed some global data from 6-8 places in the kernel and put them intoinit/kdoc-globals-test.c. Then I modified Documentation/core-api/kernel-api.rst
> >>> like this at the end of that file:
> >>>
> >>> +
> >>> +Kernel Globals
> >>> +==========================
> >>> +
> >>> +.. kernel-doc:: init/kdoc-globals-test.c
> >>> + :identifiers:
> >>>
> >>> The html output says
> >>> "Kernel Globals"
> >>> but nothing else.
> >>>
> >>> My test files are attached. I dumbed down (simplified) a few
> >>> of the globals from fancy types to just unsigned long, but that
> >>> didn't help the output results any.
> >>>
> >>> What's happening?
> >>> Thanks.
> >>>
> >>
> >> My problems here could be from a patch mis-merge.
> >> Maybe your patch was against a tree or previous patches that I don't have.
> >>
> >> You could supply an updated patch or I can just wait until all
> >> the patches are synchronized for further testing.
> >> Or you could just take my sample and keep testing it.
> >
> > I applied it after my sphinx-build-wrapper patch series,
> > but it doesn't touch kernel-doc. I did a rebase just to make
> > sure, on the top of docs-next branch from Jon's tree, e.g.
> > on the top of:
> >
> > git://git.lwn.net/linux.git docs-next
> >
> > e.g. applying it after:
> >
> > 7e5a0fe4e8ae ("doc: filesystems: proc: remove stale information from intro")
> >
> > Patch applied cleanly.
> >
> > Notice that it probably depends on some changes that Jon
> > applied for kernel-doc after -rc1.
> >
> > If you prefer, the patch is here at global_vars branch:
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-docs.git/log/?h=global_vars
>
> Yes, this is much better.
>
> For the simplified global data, it's very good. It produces
> 2 complaints but the html output is still good:
>
> linux-next-20250909/Documentation/core-api/kernel-api:435: ../init/kdoc-globals-test.c:10: WARNING: Invalid C declaration: Expected end of definition. [error at 32]
> enum system_states system_state __read_mostly;
> --------------------------------^
> linux-next-20250909/Documentation/core-api/kernel-api:435: ../init/kdoc-globals-test.c:20: WARNING: Invalid C declaration: Expected end of definition. [error at 25]
> char *saved_command_line __ro_after_init;
> -------------------------^
>
> I suspect that this is not a surprise to you.
Not a surprise. The C domain parser is very strict with regards to
C syntax.
On the above examples, __read_mostly and __ro_after_init are
macros. Sphinx has no clue about what to do with them.
We'll need something similar to what we do on structs and functions
to strip things like this:
sub_prefixes = [
...
(r"__deprecated +", "", 0),
(r"__flatten +", "", 0),
(r"__meminit +", "", 0),
...
]
for search, sub, flags in sub_prefixes:
prototype = KernRe(search, flags).sub(sub, prototype)
to strip them for the prototype that will be used for .. :c::var.
I guess we have three alternatives here:
1. use the simplified version only, after being converted into a pure
C code without macros;
2. use simplified version for :c::var: and print the complete one
ourselves (this is how structs are printed);
3. use another c domain type that would just get a name. Then
output ourselves the var prototype, captured as-is.
IMHO, from the above, (3) is better, but looking at:
https://www.sphinx-doc.org/en/master/usage/domains/c.html
It would likely mean we'll need to use :c:macro:
> For the non-simplified global data, a few of the global items are
> completely omitted from the html output. This is the html production:
>
> Kernel Globals
> dev_t ROOT_DEV;
> system root device
>
> enum system_states system_state __read_mostly;
> system state used during boot or suspend/hibernate/resume
>
> char *saved_command_line __ro_after_init;
> kernel’s command line, saved from use at any later time in the kernel.
>
> unsigned long preset_lpj;
> lpj (loops per jiffy) value set from kernel command line using “lpj=VALUE”
>
> static atomic64_t diskseq;
> unique sequence number for block device instances
>
>
> so these are completely missing/dropped: (they have
> initializers or use DEFINE_MUTEX())
Yeah, the regex is not capturing initializers nor handling macros.
We'll need to improve it.
things like DEFINE_MUTEX() would require either a sub pattern or
some regexes to detect them.
>
> /**
> * global loop_per_jiffy - calculated loop count needed to consume one jiffy
> * of time
> */
> unsigned long loops_per_jiffy = (1<<12);
>
> // from init/version.c:
> /**
> * global linux_proc_banner - text used from /proc/version file
> *
> * * first %s is sysname (e.g., "Linux")
> * * second %s is release
> * * third %s is version
> */
> const char linux_proc_banner[] =
> "%s version %s"
> " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
> " (" LINUX_COMPILER ") %s\n";
> //char linux_proc_banner[];
>
> // from init/version-timestamp.c:
> /**
> * global linux_banner - Linux boot banner, usually printed at boot time
> */
> const char linux_banner[] =
> "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
> LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
> //const char linux_banner[];
>
> // from net/core/rtnetlink.c:
> /**
> * global rtnl_mutex - historical global lock for networking control operations.
> *
> * @rtnl_mutex is used to serialize rtnetlink requests
> * and protect all kernel internal data structures related to networking.
> *
> * See Documentation/networking/netdevices.rst for details.
> * Often known as the rtnl_lock, although rtnl_lock is a kernel function.
> */
> static DEFINE_MUTEX(rtnl_mutex);
>
>
> It's looking good. Thanks.
Agreed.
Thanks,
Mauro
next prev parent reply other threads:[~2025-09-09 20:37 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-07 16:22 [PATCH] kernel-doc: add support for handling global variables Mauro Carvalho Chehab
2025-09-07 21:34 ` Mauro Carvalho Chehab
2025-09-09 6:22 ` Randy Dunlap
2025-09-09 20:12 ` Mauro Carvalho Chehab
2025-09-09 7:27 ` Randy Dunlap
2025-09-09 15:57 ` Randy Dunlap
2025-09-09 16:18 ` Mauro Carvalho Chehab
2025-09-09 18:20 ` Randy Dunlap
2025-09-09 20:37 ` Mauro Carvalho Chehab [this message]
2025-09-09 19:58 ` Mauro Carvalho Chehab
2025-09-09 20:09 ` Mauro Carvalho Chehab
2025-09-09 21:06 ` Randy Dunlap
2025-09-09 23:09 ` Mauro Carvalho Chehab
2025-09-09 23:49 ` Randy Dunlap
2025-09-09 23:50 ` Randy Dunlap
2025-09-10 0:02 ` Randy Dunlap
2025-09-10 4:23 ` Mauro Carvalho Chehab
2025-09-10 5:59 ` Randy Dunlap
2025-09-10 6:13 ` Randy Dunlap
2025-09-10 8:54 ` Mauro Carvalho Chehab
2025-11-15 0:50 ` Randy Dunlap
2025-11-16 10:28 ` Mauro Carvalho Chehab
2025-11-16 19:46 ` Randy Dunlap
2025-11-17 9:45 ` Mauro Carvalho Chehab
2025-11-17 17:45 ` Randy Dunlap
2025-09-10 9:24 ` Jani Nikula
2025-09-10 12:13 ` Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250909223743.0dd33b1d@foz.lan \
--to=mchehab+huawei@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rdunlap@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.