mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: "Linus Torvalds" <torvalds@linux-foundation.org>,
	"Nathan Chancellor" <nathan@kernel.org>,
	"Nicolas Schier" <nsc@kernel.org>,
	"Nick Desaulniers" <ndesaulniers@google.com>,
	"Bill Wendling" <morbo@google.com>,
	"Justin Stitt" <justinstitt@google.com>,
	"Masahiro Yamada" <masahiroy@kernel.org>,
	"Alexey Gladkov" <legion@kernel.org>,
	"Thomas Gleixner" <tglx@kernel.org>,
	"Ingo Molnar" <mingo@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	"Paul Walmsley" <pjw@kernel.org>,
	"Palmer Dabbelt" <palmer@dabbelt.com>,
	"Albert Ou" <aou@eecs.berkeley.edu>,
	"Alexandre Ghiti" <alex@ghiti.fr>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Will Deacon" <will@kernel.org>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"Ard Biesheuvel" <ardb@kernel.org>,
	"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
	"Josh Poimboeuf" <jpoimboe@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Daniel Almeida" <daniel.almeida@collabora.com>,
	"Tamir Duberstein" <tamird@kernel.org>,
	"Alexandre Courbot" <acourbot@nvidia.com>,
	"Onur Özkan" <work@onurozkan.dev>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Randy Dunlap" <rdunlap@infradead.org>,
	"Kees Cook" <kees@kernel.org>,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
	 llvm@lists.linux.dev, linux-riscv@lists.infradead.org,
	linux-arch@vger.kernel.org,
	 linux-arm-kernel@lists.infradead.org, linux-efi@vger.kernel.org,
	rust-for-linux@vger.kernel.org,  linux-doc@vger.kernel.org,
	Jens Axboe <axboe@kernel.dk>,
	linux-hardening@vger.kernel.org,
	 Petr Pavlu <petr.pavlu@suse.com>
Subject: Re: [PATCH v3 14/20] kbuild: batch module finalisation
Date: Mon, 21 Sep 2026 13:22:51 +0100	[thread overview]
Message-ID: <arEhI9mP0S6L6JV7@gremlin> (raw)
In-Reply-To: <20260917-build-speedup-v3-14-9ecf4163ff36@kernel.org>

+cc Petr

FYI that were some discussion on this in the v2 thread at [0], which will result
in some changes for v4.

[0]:https://lore.kernel.org/all/arEZrFmXeCO4hZpP@gremlin

On Thu, Sep 17, 2026 at 05:06:24PM +0100, Lorenzo Stoakes (ARM) wrote:
> With the .mod.S change in place, module finalisation on allmodconfig builds
> consists of a large number of very short-lived jobs.
>
> For allmodconfig x86-64 this can be on the order of ~22,000 jobs of a few
> milliseconds in duration each.
>
> Each job entails processing ~22k .cmd files, so the combination of heavy
> overhead and small individual job results in a lot of unnecessary and
> repeated work even with all cores being utilised.
>
> The solution is to batch by a number of jobs. Determining which value makes
> sense was done empirically.
>
> On a 128-thread threadripper box doing an allmodconfig build, best of
> 2, *.ko, *.mod.o deleted each time:
>
>     modules per chunk    instances    wall
>     -----------------    ---------    ------
>                     1        11171    10.22s
>                     2         5586     6.72s
>                     4         2793     4.97s
>                     8         1397     4.26s
>                    16          699     4.05s
>                    32          350     4.05s
>                    64          175     4.07s
>                   128           88     4.05s
>                   256           44     4.03s
>                   512           22     4.18s
>
> Wall time flattens for 16-256 module batches.
>
> A slower/lower core machine will do better with fewer modules-per-batch, a
> faster/higher core machine will do better with more modules-per-batch.
>
> Therefore, take the midpoint which works in the most margin in either
> direction - 128 modules per batch.
>
> This naturally scales with module count too as the optimum gains are
> obtained with higher module count, so fewer batches in this case costs less
> overhead.
>
> Each instance holds only its own modules' variables and the top-level one
> reads no per-module .cmd files at all, the same rules serve both levels,
> and an instance is told its chunk with modfinal-first=<index>.
>
> Only the top-level instance builds .module-common.o, to the chunks it is a
> plain prerequisite, so no two instances ever write it.
>
> "make modules" with every *.mod.o and *.ko deleted goes from 28.9s to 15.9s
> with clang 22. No-op "make modules" goes from 5.6s to 4.8s, as checking the
> 22,000 targets is spread over the chunks too.
>
> Whole build, 128-thread Threadripper 9980X, best of N runs:
>
>                                          before   after     delta
>                                          -------------------------------
>   x86 allmodconfig, no-op make, gcc         2.3s     1.4s    -0.85s (-38%)
>   x86 allmodconfig, no-op make, clang       2.8s     1.8s    -0.94s (-34%)
>   x86 allmodconfig, clean, gcc            306.6s   294.1s     -12.6s (-4%)
>   x86 allmodconfig, clean, clang          290.2s   283.9s     -6.4s (-2%)
>
> Assisted-by: LLM
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> ---
>  scripts/Makefile.modfinal | 30 +++++++++++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
> index 75e9effdf02c..4d5e6e1a0ff9 100644
> --- a/scripts/Makefile.modfinal
> +++ b/scripts/Makefile.modfinal
> @@ -13,9 +13,30 @@ include $(srctree)/scripts/Makefile.lib
>  # find all modules listed in modules.order
>  modules := $(call read-file, modules.order)
>
> +modfinal-chunk-size := 128
> +
> +ifdef modfinal-first
> +
> +# this instance handles the chunk of modules.order starting at $(modfinal-first)
> +modules := $(wordlist $(modfinal-first), $(words $(modules)), $(modules))
> +modules := $(wordlist 1, $(modfinal-chunk-size), $(modules))
> +
>  __modfinal: $(modules:%.o=%.ko)
>  	@:
>
> +else
> +
> +modfinal-chunks := $(addprefix chunk-, $(shell seq 1 $(modfinal-chunk-size) $(words $(modules))))
> +
> +PHONY += $(modfinal-chunks)
> +$(modfinal-chunks): .module-common.o
> +	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal modfinal-first=$(@:chunk-%=%)
> +
> +__modfinal: $(modfinal-chunks)
> +	@:
> +
> +endif
> +
>  # modname and part-of-module are set to make c_flags define proper module flags
>  modname = $(notdir $(@:.mod.o=))
>  part-of-module = y
> @@ -29,8 +50,11 @@ quiet_cmd_as_mod_o = AS [M]  $@
>  %.mod.o: %.mod.S FORCE
>  	$(call if_changed,as_mod_o)
>
> +# Built by the top-level instance alone, the chunks take it as a plain file.
> +ifndef modfinal-first
>  .module-common.o: $(srctree)/scripts/module-common.c FORCE
>  	$(call if_changed_rule,cc_o_c)
> +endif
>
>  ifneq ($(WARN_ON_UNUSED_TRACEPOINTS),)
>  cmd_check_tracepoint = $(objtree)/scripts/tracepoint-update --module $<;
> @@ -58,7 +82,11 @@ ifdef CONFIG_DEBUG_INFO_BTF_MODULES
>  endif
>  	+$(call cmd,check_tracepoint)
>
> -targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o) .module-common.o
> +ifdef modfinal-first
> +targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o)
> +else
> +targets += .module-common.o
> +endif
>
>  # Add FORCE to the prerequisites of a target to force it to be always rebuilt.
>  # ---------------------------------------------------------------------------
>
> --
> 2.55.0
>

--
Cheers, Lorenzo

  parent reply	other threads:[~2026-09-21 12:23 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-17 16:06 [PATCH v3 00/20] kbuild: significantly speed up kernel builds Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 01/20] kbuild: do not allocate .modinfo in vmlinux Lorenzo Stoakes (ARM)
2026-09-17 16:52   ` Kees Cook
2026-09-17 17:41     ` Lorenzo Stoakes (ARM)
2026-09-18  0:51     ` Nathan Chancellor
2026-09-18 17:09       ` Nicolas Schier
2026-09-18 21:44         ` Nathan Chancellor
2026-09-19 14:39           ` Lorenzo Stoakes (ARM)
2026-09-17 17:05   ` Kees Cook
2026-09-17 17:39     ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 02/20] kallsyms: index symbols by token to speed up table compression Lorenzo Stoakes (ARM)
2026-09-17 17:27   ` Kees Cook
2026-09-17 17:45     ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 03/20] kallsyms: output binary data to speed output and kallsyms assembly Lorenzo Stoakes (ARM)
2026-09-17 17:36   ` Kees Cook
2026-09-17 16:06 ` [PATCH v3 04/20] kbuild: do not sort nm output where the order is irrelevant Lorenzo Stoakes (ARM)
2026-09-17 17:38   ` Kees Cook
2026-09-18 19:14   ` Nicolas Schier
2026-09-17 16:06 ` [PATCH v3 05/20] kbuild: only emit vmlinux relocations when required Lorenzo Stoakes (ARM)
2026-09-17 17:41   ` Kees Cook
2026-09-17 17:48     ` Lorenzo Stoakes (ARM)
2026-09-18 19:27   ` Nicolas Schier
2026-09-17 16:06 ` [PATCH v3 06/20] elf-parse: add section flags, symbol binding and a read-only mapping Lorenzo Stoakes (ARM)
2026-09-17 17:44   ` Kees Cook
2026-09-17 16:06 ` [PATCH v3 07/20] kallsyms: reimplement mksysmap in C Lorenzo Stoakes (ARM)
2026-09-17 18:07   ` Kees Cook
2026-09-19 16:24     ` Lorenzo Stoakes (ARM)
2026-09-19 16:25       ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 08/20] kbuild: cache list, composite object state per object Lorenzo Stoakes (ARM)
2026-09-17 18:11   ` Kees Cook
2026-09-18 19:51     ` Nicolas Schier
2026-09-19 14:48       ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 09/20] kbuild: implement and use depcheck to check dependency timestamps Lorenzo Stoakes (ARM)
2026-09-17 18:42   ` Kees Cook
2026-09-17 20:59     ` Kees Cook
2026-09-19 17:02       ` Lorenzo Stoakes (ARM)
2026-09-20  3:46         ` Kees Cook
2026-09-19 16:57     ` Lorenzo Stoakes (ARM)
2026-09-19 17:06       ` Lorenzo Stoakes (ARM)
2026-09-20  3:48       ` Kees Cook
2026-09-17 16:06 ` [PATCH v3 10/20] kbuild: move the toolchain checks into init/Kconfig.toolchain Lorenzo Stoakes (ARM)
2026-09-17 18:53   ` Kees Cook
2026-09-18  1:07     ` Nathan Chancellor
2026-09-18 14:35       ` Lorenzo Stoakes (ARM)
2026-09-18 19:54         ` Nicolas Schier
2026-09-18 21:12           ` Nathan Chancellor
2026-09-19 14:45             ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 11/20] kbuild: avoid re-running compiler and linker probes Lorenzo Stoakes (ARM)
2026-09-17 19:26   ` Kees Cook
2026-09-18  1:21     ` Nathan Chancellor
2026-09-18  4:44       ` Kees Cook
2026-09-18  5:40         ` Nathan Chancellor
2026-09-19 17:31           ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 12/20] modpost: cache section relocation mismatch state Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 13/20] modpost: emit module descriptors as assembly Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 14/20] kbuild: batch module finalisation Lorenzo Stoakes (ARM)
2026-09-17 17:01   ` Kees Cook
2026-09-21 12:22   ` Lorenzo Stoakes (ARM) [this message]
2026-09-17 16:06 ` [PATCH v3 15/20] objtool: cache relocations, do less work, eliminate relocation hash Lorenzo Stoakes (ARM)
2026-09-22  4:16   ` Josh Poimboeuf
2026-09-22  9:05     ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 16/20] objtool: size the instruction hash to the text Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 17/20] objtool: decode instructions and resolve branch targets in parallel Lorenzo Stoakes (ARM)
2026-09-22  4:27   ` Josh Poimboeuf
2026-09-22  9:43     ` Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 18/20] rust: make exports.o depend on the headers generated for it Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 19/20] kbuild: build rust crates in parallel with the rest of the build Lorenzo Stoakes (ARM)
2026-09-17 16:06 ` [PATCH v3 20/20] kbuild: compress the kernel with pigz if available Lorenzo Stoakes (ARM)
2026-09-17 16:58   ` Kees Cook
2026-09-19 17:43     ` Lorenzo Stoakes (ARM)
2026-09-18 14:27   ` Manuel Ebner
2026-09-19 17:42     ` Lorenzo Stoakes (ARM)
2026-09-17 17:15 ` [PATCH v3 00/20] kbuild: significantly speed up kernel builds Linus Torvalds
2026-09-17 17:36   ` Lorenzo Stoakes (ARM)
2026-09-17 19:42     ` Lorenzo Stoakes (ARM)
2026-09-17 20:02       ` Nick Desaulniers

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=arEhI9mP0S6L6JV7@gremlin \
    --to=ljs@kernel.org \
    --cc=a.hindborg@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=alex@ghiti.fr \
    --cc=aliceryhl@google.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=axboe@kernel.dk \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=bp@alien8.de \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=gary@garyguo.net \
    --cc=gustavoars@kernel.org \
    --cc=hpa@zytor.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=jpoimboe@kernel.org \
    --cc=justinstitt@google.com \
    --cc=kees@kernel.org \
    --cc=legion@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=llvm@lists.linux.dev \
    --cc=lossin@kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=masahiroy@kernel.org \
    --cc=mingo@redhat.com \
    --cc=morbo@google.com \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=nsc@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=palmer@dabbelt.com \
    --cc=peterz@infradead.org \
    --cc=petr.pavlu@suse.com \
    --cc=pjw@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tamird@kernel.org \
    --cc=tglx@kernel.org \
    --cc=tmgross@umich.edu \
    --cc=torvalds@linux-foundation.org \
    --cc=will@kernel.org \
    --cc=work@onurozkan.dev \
    --cc=x86@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®