linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Performance Regression since v6.15] empty docs build with O= option
@ 2025-07-14 10:42 Akira Yokosawa
  2025-07-17 11:09 ` Mauro Carvalho Chehab
  0 siblings, 1 reply; 2+ messages in thread
From: Akira Yokosawa @ 2025-07-14 10:42 UTC (permalink / raw)
  To: Jonathan Corbet, Mauro Carvalho Chehab
  Cc: linux-doc, Akira Yokosawa, Donald Hunter

Hi all,

Here is a follow-up to my message at:
https://lore.kernel.org/d12fb63e-b346-4094-b9d6-aa6823aea541@gmail.com/

Quoting relevant parts for your convenience:

Akira wrote:
> As a matter of fact, I'm seeing weird performance regression of empty
> documentation builds when the O=<somedir> option is used.
>
> It appeared in v6.15, which has your conversion of get_abi.pl into
> get_abi.py.  Will send a report once the time-consuming bisection
> completes.

Answer to Mauro's question at:
https://lore.kernel.org/20250711130446.1b761538@foz.lan/

Mauro wrote:
> Did you try with docs-next instead? I remember Jon caught one
> issue causing the doctree cache to expire. Can't remember if this
> was on 6.15 or at docs-next, but the fixes should be applied there.

Jon's complaint at https://lore.kernel.org/87frfsdfgc.fsf@trenco.lwn.net/
was against Mauro's v2 series.

Jon has applied the v3 series with the issue fixed at:
https://lore.kernel.org/cover.1750571906.git.mchehab+huawei@kernel.org/

, so the issue has never been in docs-next.

I'm not a python person and bisection is all I could do.

TL;DR

2nd run of "make O=$HOME/output htmldocs" takes much longer since kernel
release v6.15.

2nd run is an empty build and should finish in a matter of 10 seconds.

"make htmldocs" without the O= option doesn't show this symptom.

Here is a summary table.

Note:
    Numbers shown as (x) [y] mean 2nd "make O=$HOME/output htmldocs" run
    takes x seconds, while 2nd "make htmldocs" run takes y seconds
    (rounded up).

       ----------------------------------------
Sphinx      8.2.3 venv       8.1.3     7.2.6 
       ------------------- --------- ----------
Distro    f42      noble      f42      noble 
       --------- --------- --------- ----------
Good   (13) [13] (16) [16] ( 6) [ 6] (  9) [ 9] v6.14
Bad            ---         (72) [ 6] (349) [11] v6.15
Bad            ---         (72) [ 6] (365) [11] v6.16-rc1 + [1]
Bad            ---         (72) [ 7] (342) [10] docs-next (2025.07.11) + [1]
Bad    (77) [14] (82) [15] (73) [ 8] (347) [11] docs-next (2025.07.11) + [1,2,3]
       --------- --------- --------- ----------

[1]: cherry-pick 553ab30a1810 ("Documentation: nouveau: Update GSP message
     queue kernel-doc reference"), to suppress noise of error handling within
     Sphinx.
[2]: Mauro's ynl series v9 at https://lore.kernel.org/cover.1752076293.git.mchehab+huawei@kernel.org/
     (14/13 applied)
[3]: Jon's kdoc series v2 at https://lore.kernel.org/20250710233142.246524-1-corbet@lwn.net/
     (12/12 as is)

f42: python 3.13.5, noble: 3.12.3

* Bisection result

Sphinx 8.2.3 (venv) on top of ubuntu:noble (python 3.12.3):

Last good commit:
(16) 6b48bea16848 ("scripts/get_abi.py: add support for symbol search")

First bad commit:
(48) 9d7ec8867960 ("docs: use get_abi.py for ABI generation")

Merged into Jon's docs-mw branch at:
(82) 1ce8294cfefb ("Merge branch 'mauro' into docs-mw")

Pre merge commits of 1ce8294cfefb:
(15) 2b087edf588c ("docs/zh_CN: Add secrets index Chinese translation")
(82) 1c7e66bc5d20 ("scripts/get_abi.pl: drop now obsoleted script")

Again, The numbers enclosed in () indicate the elapsed times (in seconds,
rounded up) of 2nd "make O=$HOME/output htmldocs" runs.

Sphinx 8.2.3 takes longer than 8.1.3 for empty builds, but it is likely
an independent issue on Sphinx side.

Mauro, I'd like you to have a look into this regression.

        Thanks, Akira





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

* Re: [Performance Regression since v6.15] empty docs build with O= option
  2025-07-14 10:42 [Performance Regression since v6.15] empty docs build with O= option Akira Yokosawa
@ 2025-07-17 11:09 ` Mauro Carvalho Chehab
  0 siblings, 0 replies; 2+ messages in thread
From: Mauro Carvalho Chehab @ 2025-07-17 11:09 UTC (permalink / raw)
  To: Akira Yokosawa
  Cc: Jonathan Corbet, Mauro Carvalho Chehab, linux-doc, Donald Hunter

Hi Akira,

Em Mon, 14 Jul 2025 19:42:49 +0900
Akira Yokosawa <akiyks@gmail.com> escreveu:

> Hi all,
> 
> Here is a follow-up to my message at:
> https://lore.kernel.org/d12fb63e-b346-4094-b9d6-aa6823aea541@gmail.com/
> 
> Quoting relevant parts for your convenience:
> 
> Akira wrote:
> > As a matter of fact, I'm seeing weird performance regression of empty
> > documentation builds when the O=<somedir> option is used.
> >
> > It appeared in v6.15, which has your conversion of get_abi.pl into
> > get_abi.py.  Will send a report once the time-consuming bisection
> > completes.  
> 
> Answer to Mauro's question at:
> https://lore.kernel.org/20250711130446.1b761538@foz.lan/
> 
> Mauro wrote:
> > Did you try with docs-next instead? I remember Jon caught one
> > issue causing the doctree cache to expire. Can't remember if this
> > was on 6.15 or at docs-next, but the fixes should be applied there.  
> 
> Jon's complaint at https://lore.kernel.org/87frfsdfgc.fsf@trenco.lwn.net/
> was against Mauro's v2 series.
> 
> Jon has applied the v3 series with the issue fixed at:
> https://lore.kernel.org/cover.1750571906.git.mchehab+huawei@kernel.org/
> 
> , so the issue has never been in docs-next.
> 
> I'm not a python person and bisection is all I could do.

This is probably not a python issue itself, but instead, some
weirdness at the way Sphinx cache is stored.

> TL;DR
> 
> 2nd run of "make O=$HOME/output htmldocs" takes much longer since kernel
> release v6.15.
> 
> 2nd run is an empty build and should finish in a matter of 10 seconds.
> 
> "make htmldocs" without the O= option doesn't show this symptom.
> 
> Here is a summary table.
> 
> Note:
>     Numbers shown as (x) [y] mean 2nd "make O=$HOME/output htmldocs" run
>     takes x seconds, while 2nd "make htmldocs" run takes y seconds
>     (rounded up).
> 
>        ----------------------------------------
> Sphinx      8.2.3 venv       8.1.3     7.2.6 
>        ------------------- --------- ----------
> Distro    f42      noble      f42      noble 
>        --------- --------- --------- ----------
> Good   (13) [13] (16) [16] ( 6) [ 6] (  9) [ 9] v6.14
> Bad            ---         (72) [ 6] (349) [11] v6.15
> Bad            ---         (72) [ 6] (365) [11] v6.16-rc1 + [1]
> Bad            ---         (72) [ 7] (342) [10] docs-next (2025.07.11) + [1]
> Bad    (77) [14] (82) [15] (73) [ 8] (347) [11] docs-next (2025.07.11) + [1,2,3]
>        --------- --------- --------- ----------
> 
> [1]: cherry-pick 553ab30a1810 ("Documentation: nouveau: Update GSP message
>      queue kernel-doc reference"), to suppress noise of error handling within
>      Sphinx.
> [2]: Mauro's ynl series v9 at https://lore.kernel.org/cover.1752076293.git.mchehab+huawei@kernel.org/
>      (14/13 applied)
> [3]: Jon's kdoc series v2 at https://lore.kernel.org/20250710233142.246524-1-corbet@lwn.net/
>      (12/12 as is)
> 
> f42: python 3.13.5, noble: 3.12.3
> 
> * Bisection result
> 
> Sphinx 8.2.3 (venv) on top of ubuntu:noble (python 3.12.3):
> 
> Last good commit:
> (16) 6b48bea16848 ("scripts/get_abi.py: add support for symbol search")
> 
> First bad commit:
> (48) 9d7ec8867960 ("docs: use get_abi.py for ABI generation")
> 
> Merged into Jon's docs-mw branch at:
> (82) 1ce8294cfefb ("Merge branch 'mauro' into docs-mw")
> 
> Pre merge commits of 1ce8294cfefb:
> (15) 2b087edf588c ("docs/zh_CN: Add secrets index Chinese translation")
> (82) 1c7e66bc5d20 ("scripts/get_abi.pl: drop now obsoleted script")
> 
> Again, The numbers enclosed in () indicate the elapsed times (in seconds,
> rounded up) of 2nd "make O=$HOME/output htmldocs" runs.
> 
> Sphinx 8.2.3 takes longer than 8.1.3 for empty builds, but it is likely
> an independent issue on Sphinx side.
> 
> Mauro, I'd like you to have a look into this regression.
> 
>         Thanks, Akira

To debug it, I added the enclosed code to conf.py. See enclosed. The
logic there uses this from https://www.sphinx-doc.org/en/master/extdev/event_callbacks.html:

	env-get-outdated(app, env, added, changed, removed)

	Emitted when the environment determines which source files have
	changed and should be re-read. added, changed and removed are 
	sets of docnames that the environment has determined. You can 
	return a list of docnames to re-read in addition to these.


Assuming that the issue is during ABI generation, we can check with that
what is the root case.

Running the second time without O= doeesn't require rebuild ABI:

    $ time make SPHINXDIRS=admin-guide htmldocs
    Python version: 3.13.5
    Docutils version: 0.21.2
    make[3]: Nothing to be done for 'html'.
    Using alabaster theme
    source directory: admin-guide
    Using Python kernel-doc

    [OUTDATED]
    Added: set()
    Changed: {'gpio/obsolete', 'gpio/index'}
    Removed: set()
    All docs count: 385
    Found docs count: 385
    /root/Documentation/admin-guide/gpio/index.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/chardev' [toc.not_readable]
    /root/Documentation/admin-guide/gpio/obsolete.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/chardev_v1' [toc.not_readable]
    /root/Documentation/admin-guide/gpio/obsolete.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/sysfs' [toc.not_readable]

    real    0m1,489s
    user    0m1,305s
    sys     0m0,263s

Here, it seems that the root cause is because of a non-resolved
dependency at gpio/obsolete.

Now, running the second time with O=, we have:


    $ make clean; time make O=/tmp/foo SPHINXDIRS=admin-guide htmldocs
    ...

    [OUTDATED]
    Added: set()
    Changed: {'abi-stable', 'abi-testing-files', 'abi-removed', 'gpio/index', 'abi-obsolete-files', 'abi-testing', 'abi-stable-files', 'abi-obsolete', 'gpio/obsolete', 'abi-removed-files', 'abi'}
    Removed: set()
    All docs count: 385
    Found docs count: 385

Basically, Sphinx thinks that abi* files had some changes, but
only when O= is used.

At Documentation/sphinx/kernel_abi.py, the only part we touch the
dependency chain is here:

            if f != old_f:
                # Add the file to Sphinx build dependencies
                env.note_dependency(os.path.abspath(f))

If we comment such code or change the logic to:

    diff --git a/Documentation/sphinx/kernel_abi.py b/Documentation/sphinx/kernel_abi.py
    index db6f0380de94..9f2198eb7af1 100644
    --- a/Documentation/sphinx/kernel_abi.py
    +++ b/Documentation/sphinx/kernel_abi.py
    @@ -146,8 +146,9 @@ class KernelCmd(Directive):
                 n += 1
 
             if f != old_f:
-                # Add the file to Sphinx build dependencies
-                env.note_dependency(os.path.abspath(f))
+                # Add the file to Sphinx build dependencies if the file exists
+                if os.path.isfile(f):
+                    env.note_dependency(os.path.abspath(f))
 
                 old_f = f
 
We get a quick build again:

    [OUTDATED]
    Added: set()
    Changed: {'gpio/index', 'gpio/obsolete'}
    Removed: set()
    All docs count: 385
    Found docs count: 385
    /root/Documentation/admin-guide/gpio/index.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/chardev' [toc.not_readable]
    /root/Documentation/admin-guide/gpio/obsolete.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/chardev_v1' [toc.not_readable]
    /root/Documentation/admin-guide/gpio/obsolete.rst:7: WARNING: toctree contains reference to nonexisting document 'userspace-api/gpio/sysfs' [toc.not_readable]
    make[1]: Leaving directory '/tmp/foo'

   real    0m1,444s
   user    0m1,267s
   sys     0m0,252s

However, that's because it won't add any dependency at all when
O= is used. The problem seems to be related to relative/absolute
patches when adding such dependencies.

Let me try to write a proper fix.

Jon,

Btw, should we add something like the code below to be optionally
used at conf.py when we need to identify cache issues?

Regards,
Mauro


---

This is what I added at the end of conf.py, at setup(app):

Thanks,
Mauro

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

end of thread, other threads:[~2025-07-17 11:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-14 10:42 [Performance Regression since v6.15] empty docs build with O= option Akira Yokosawa
2025-07-17 11:09 ` Mauro Carvalho Chehab

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