From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Petr Pavlu <petr.pavlu@suse.com>
Cc: "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>,
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
Subject: Re: [PATCH v2 13/21] modpost: emit module descriptors as assembly
Date: Mon, 21 Sep 2026 12:57:57 +0100 [thread overview]
Message-ID: <arEZrFmXeCO4hZpP@gremlin> (raw)
In-Reply-To: <95baacfb-d8d9-4d2f-bc89-592df6f6f8e3@suse.com>
(note there's a v3 see [0])
[0]: https://lore.kernel.org/linux-kbuild/20260917-build-speedup-v3-0-9ecf4163ff36@kernel.org/
On Mon, Sep 21, 2026 at 01:25:09PM +0200, Petr Pavlu wrote:
> On 9/14/26 11:22 AM, Lorenzo Stoakes (ARM) wrote:
> > modpost generates a descriptor for every module in the form of a
> > <module>.mod.c file with .modinfo strings, the __this_module descriptor,
> > exported symbol tables and (with CONFIG_MODVERSIONS set), the CRC of
> > imported symbols.
> >
> > These files are compiled like any other kernel C file with all of the
> > -include preamble, as well as including linux/module.h, header dependencies
> > generated by fixdep of a few hundred headers, an objtool run and if LTO is
> > being performed, a link is performed to generate native code.
>
> As a side note, I'm currently working on cleaning up what linux/module.h
> includes. This was also originally motivated by an effort to reduce the
> compilation time of .mod.c files, though cleaning up that header makes
> sense in general, since it is the most explicitly included file in the
> kernel.
Nice :) and yeah it seems like that would be useful more generally.
>
> >
> > On an x86-64 allmodconfig build 11,189 *.mod.c files are built, each
> > taking ~0.24s of CPU time to compile, and module finalisation as a whole
> > 6,300 CPU seconds, or 64 seconds of wall time when run over 128 threads.
> >
> > It also generates ~1.3 GiB of *.mod.o.cmd files that every subsequent build
> > has to read back.
> >
> > Avoid all this by emitting the descriptors as assembly instead.
> >
> > The layout required (size and alignment of struct module, struct
> > modversion_info, the module's name offsets, init, and exit fields and
> > whether the architecture uses PREL32 ksymtab references) can all be derived
> > from scripts/mod/module-offsets.h.
> >
> > The fields of __this_module are emitted in offset order rather than
> > declaration order, as CONFIG_RANDSTRUCT shuffles struct module so the name,
> > init and exit fields can land anywhere.
> >
> > An assembly file avoids all of the issues previously mentioned so this
> > conversion results in a very significant performance win on kernel build.
> >
> > As a consequence of this change, since module-offsets.c includes
> > linux/module.h, scripts/mod is now built after the generated headers in
> > prepare0, rather than before.
> >
> > Also update .gitignore and make clean to handle .mod.S files, but keep
> > .mod.c files there to ensure that users do not end up with untracked
> > changes/dirty trees after the change takes effect.
> >
> > The sections were confirmed to be byte-for-byte identical to the C version
> > produced - each of .modinfo, .gnu.linkonce.this_module, __ksymtab*,
> > __ksymtab_strings, __kcrctab*, __kflagstab*, __versions,
> > __version_ext_crcs, __version_ext_names and their relocations - for all
> > 8,135 modules of a clang allmodconfig build with CONFIG_COMPILE_TEST off
> > and CONFIG_MODVERSIONS, CONFIG_EXTENDED_MODVERSIONS and
> > CONFIG_MODULE_SRCVERSION_ALL on, and for a sample built with gcc.
>
> Lowering the data to assembly loses debug information for __this_module,
> specifically that it has type `struct module`. It might be worth
No, it keeps it - every module includes linux/module.h, and the extern
declaration of __this_module carries the type, so all of the stuff gdb
needs (e.g. ptype, p & field access), DWARF etc. is all there in the same
way as with .mod.c.
Have confirmed locally.
> restoring that information in same way. A small hack would be to add
> something like the following to scripts/module-common.c:
>
> __weak __section(".discard.this_module") struct module __this_module;
That isn't necessary it turns out given the above.
>
> > diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
> > index 01a37ec872b9..75e9effdf02c 100644
> > --- a/scripts/Makefile.modfinal
> > +++ b/scripts/Makefile.modfinal
> > @@ -20,10 +20,14 @@ __modfinal: $(modules:%.o=%.ko)
> > modname = $(notdir $(@:.mod.o=))
> > part-of-module = y
> > GCOV_PROFILE := n
> > -ccflags-remove-y := $(CC_FLAGS_CFI)
> >
> > -%.mod.o: %.mod.c FORCE
> > - $(call if_changed_rule,cc_o_c)
> > +# modpost lays the <module>.mod.S out completely (write_mod_S_file()), so it
> > +# needs only the assembler and no dependency tracking.
> > +quiet_cmd_as_mod_o = AS [M] $@
> > + cmd_as_mod_o = $(CC) $(_a_flags) $(modkern_aflags) -c -o $@ $<
> > +
> > +%.mod.o: %.mod.S FORCE
> > + $(call if_changed,as_mod_o)
> >
> > .module-common.o: $(srctree)/scripts/module-common.c FORCE
> > $(call if_changed_rule,cc_o_c)
>
> If the <module>.mod.S files are fully self-contained and do not even use
> something like KBUILD_MODNAME, would it be possible to name them
> <module>.mod.s and skip the C preprocessor as well?
Ack will do for v4!
>
> > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> > index 0fd43c8a89ea..b4550b545330 100644
> > --- a/scripts/mod/modpost.c
> > +++ b/scripts/mod/modpost.c
> > @@ -2191,30 +2042,483 @@ static void write_vmlinux_export_c_file(struct module *mod)
> > free(buf.p);
> > }
> >
> > -/* do sanity checks, and generate *.mod.c file */
> > -static void write_mod_c_file(struct module *mod)
> > +#if MOD_SIZEOF_LONG == 8
> > +#define MOD_PTR_DIRECTIVE ".quad"
> > +#else
> > +#define MOD_PTR_DIRECTIVE ".long"
> > +#endif
> > +
> > +/* See KSYM_FUNC() in include/linux/export-internal.h. */
> > +#if MOD_FUNC_PLABEL
> > +#define MOD_FUNC_PREFIX "P%"
> > +#else
> > +#define MOD_FUNC_PREFIX ""
> > +#endif
> > +
> > +/* See __KSYM_ALIGN in include/linux/export-internal.h. */
> > +#if MOD_PREL32_RELOCATIONS || MOD_SIZEOF_LONG == 4
> > +#define KSYM_ALIGN 4
> > +#else
> > +#define KSYM_ALIGN 8
> > +#endif
> > +
> > +/* Append the body of an assembler string literal, escaped as needed. */
> > +static void buf_escaped(struct buffer *buf, const char *str)
> > +{
> > + unsigned char chr;
> > +
> > + while ((chr = *str++)) {
> > + if (chr == '"' || chr == '\\')
> > + buf_printf(buf, "\\%c", chr);
> > + else if (isprint(chr))
> > + buf_printf(buf, "%c", chr);
> > + else
> > + buf_printf(buf, "\\%03o", chr);
> > + }
> > +}
> > +
> > +static void buf_asciz(struct buffer *buf, const char *str)
> > {
> > - struct buffer buf = { };
> > - struct module_alias *alias, *next;
> > - char fname[PATH_MAX];
> > - int ret;
> > + buf_printf(buf, "\t.asciz \"");
> > + buf_escaped(buf, str);
> > + buf_printf(buf, "\"\n");
> > +}
> >
> > - add_header(&buf, mod);
> > - add_exported_symbols(&buf, mod);
> > - add_versions(&buf, mod);
> > - add_extended_versions(&buf, mod);
> > - add_depends(&buf, mod);
> > +/* The equivalent of MODULE_INFO(tag, info). */
> > +static void add_asm_modinfo(struct buffer *buf, const char *tag,
> > + const char *info)
> > +{
> > + buf_printf(buf, "\t.section .modinfo,\"a\",%%progbits\n");
> > + buf_printf(buf, "\t.asciz \"%s=", tag);
> > + buf_escaped(buf, info);
> > + buf_printf(buf, "\"\n");
> > +}
> >
> > - buf_printf(&buf, "\n");
> > +/* See __KSYM_REF() in include/linux/export-internal.h. */
> > +static void add_asm_ksym_ref(struct buffer *buf, const char *prefix,
> > + const char *sym)
> > +{
> > +#if MOD_PREL32_RELOCATIONS
> > + buf_printf(buf, "\t.long %s%s - .\n", prefix, sym);
> > +#else
> > + buf_printf(buf, "\t" MOD_PTR_DIRECTIVE " %s%s\n", prefix, sym);
> > +#endif
> > +}
> > +
> > +/* The name and namespace strings a ksymtab entry refers to. */
> > +static void add_asm_kstrtab(struct buffer *buf, const struct symbol *sym)
> > +{
> > + buf_printf(buf, "\t.section \"__ksymtab_strings\",\"aMS\",%%progbits,1\n");
> > + buf_printf(buf, "__kstrtab_%s:\n", sym->name);
> > + buf_asciz(buf, sym->name);
> > + buf_printf(buf, "__kstrtabns_%s:\n", sym->name);
> > + buf_asciz(buf, sym->namespace);
> > + buf_printf(buf, "\t.previous\n");
> > +}
> > +
> > +/* The equivalent of SYMBOL_FLAGS(). */
> > +static void add_asm_kflagstab(struct buffer *buf, const struct symbol *sym)
> > +{
> > + buf_printf(buf, "\t.section \"___kflagstab+%s\", \"a\"\n", sym->name);
> > + buf_printf(buf, "__flags_%s:\n", sym->name);
> > + buf_printf(buf, "\t.byte 0x%02x\n", get_symbol_flags(sym));
> > + buf_printf(buf, "\t.previous\n");
> > +}
> > +
> > +/* The equivalent of KSYMTAB_FUNC()/KSYMTAB_DATA(). */
> > +static void add_asm_ksymtab(struct buffer *buf, const struct symbol *sym)
> > +{
> > + const char *name = sym->name;
> > +
> > + add_asm_kstrtab(buf, sym);
> > +
> > + buf_printf(buf, "\t.section \"___ksymtab+%s\", \"a\"\n", name);
> > + buf_printf(buf, "\t.balign %d\n", KSYM_ALIGN);
> > + buf_printf(buf, "__ksymtab_%s:\n", name);
> > + add_asm_ksym_ref(buf, sym->is_func ? MOD_FUNC_PREFIX : "", name);
> > + add_asm_ksym_ref(buf, "__kstrtab_", name);
> > + add_asm_ksym_ref(buf, "__kstrtabns_", name);
> > + buf_printf(buf, "\t.previous\n");
> > +
> > + add_asm_kflagstab(buf, sym);
> > +}
> > +
> > +/* The equivalent of SYMBOL_CRC(). */
> > +static void add_asm_crc(struct buffer *buf, const struct symbol *sym)
> > +{
> > + buf_printf(buf, "\t.section \"___kcrctab+%s\",\"a\"\n", sym->name);
> > + buf_printf(buf, "\t.balign 4\n");
> > + buf_printf(buf, "__crc_%s:\n", sym->name);
> > + buf_printf(buf, "\t.long 0x%08x\n", sym->crc);
> > + buf_printf(buf, "\t.previous\n");
> > +}
>
> It would be good to avoid duplicating these symbol-related
> implementations in include/linux/export-internal.h and
> scripts/mod/modpost.c. Perhaps .vmlinux.export.c could also be lowered
> to assembly, so the implementation in include/linux/export-internal.h
> can be removed and scripts/mod/modpost.c becomes the only source of
> truth.
Ack, sounds reasonable, but seems sensible as a follow-up I think?
>
> > +
> > +static bool export_is_kept(const struct symbol *sym)
> > +{
> > + return !trim_unused_exports || sym->used;
> > +}
> > +
> > +/* Record the CRCs of the exported symbols. */
> > +static void add_asm_crcs(struct buffer *buf, struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + list_for_each_entry(sym, &mod->exported_symbols, list) {
> > + if (!export_is_kept(sym))
> > + continue;
> > +
> > + if (!sym->crc_valid)
> > + mod_warn(mod, "EXPORT symbol '%s' version generation failed, symbol will not be versioned.\n"
> > + "Is '%s' prototyped in <asm/asm-prototypes.h>?\n",
> > + sym->name, sym->name);
> > + add_asm_crc(buf, sym);
> > + }
> > +}
> > +
> > +static void add_asm_exported_symbols(struct buffer *buf, struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + list_for_each_entry(sym, &mod->exported_symbols, list) {
> > + if (export_is_kept(sym))
> > + add_asm_ksymtab(buf, sym);
> > + }
> > +
> > + if (modversions)
> > + add_asm_crcs(buf, mod);
> > +}
>
> Nit: This could be kept shorter as a single function, similarly to how
> the original C version was implemented solely as add_exported_symbols().
>
> static void add_asm_exported_symbols(struct buffer *buf, struct module *mod)
> {
> struct symbol *sym;
>
> list_for_each_entry(sym, &mod->exported_symbols, list) {
> if (trim_unused_exports && !sym->used)
> continue;
>
> add_asm_ksymtab(buf, sym);
>
> if (!modversions)
> continue;
>
> if (!sym->crc_valid)
> mod_warn(mod, "EXPORT symbol '%s' version generation failed, symbol will not be versioned.\n"
> "Is '%s' prototyped in <asm/asm-prototypes.h>?\n",
> sym->name, sym->name);
> add_asm_crc(buf, sym);
> }
> }
Ack will do for v4.
>
> > +/*
> > + * An unresolved symbol without a module is not versioned; one without a CRC
> > + * cannot be, so warn about it.
> > + */
> > +static bool skip_unversioned(struct module *mod, const struct symbol *sym)
> > +{
> > + if (!sym->module)
> > + return true;
> > + if (sym->crc_valid)
> > + return false;
> > +
> > + mod_warn(mod, "symbol '%s' has no CRC!\n", sym->name);
> > + return true;
> > +}
> > +
> > +/* One struct modversion_info: the CRC, then the name padded to the end. */
> > +static void add_asm_version(struct buffer *buf, const struct symbol *sym)
> > +{
> > + buf_printf(buf, "\t" MOD_PTR_DIRECTIVE " 0x%08x\n", sym->crc);
> > + buf_printf(buf, "\t.ascii \"%s\"\n", sym->name);
> > + buf_printf(buf, "\t.skip %zu\n", MOD_SIZEOF_struct_modversion_info -
> > + MOD_OFF_modversion_info_name - strlen(sym->name));
> > +}
> > +
> > +/*
> > + * The equivalent of:
> > + *
> > + * static const struct modversion_info ____versions[]
> > + * __used __section("__versions") = { { crc, "name" }, ... };
> > + *
> > + * for unresolved symbols.
> > + */
> > +static void add_asm_versions(struct buffer *buf, struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + if (!basic_modversions)
> > + return;
> > +
> > + buf_printf(buf, "\n\t.section __versions,\"a\",%%progbits\n");
> > + buf_printf(buf, "\t.balign %d\n", MOD_ALIGNOF_struct_modversion_info);
> > + list_for_each_entry(sym, &mod->unresolved_symbols, list) {
> > + if (skip_unversioned(mod, sym))
> > + continue;
> > +
> > + if (strlen(sym->name) >= MOD_NAME_LEN) {
> > + /* Only the extended table can hold it. */
> > + if (extended_modversions)
> > + continue;
> > +
> > + mod_error(mod, "too long symbol '%s'\n", sym->name);
> > + break;
> > + }
> > +
> > + add_asm_version(buf, sym);
> > + }
> > +}
> > +
> > +static void add_asm_version_ext_crcs(struct buffer *buf, struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + buf_printf(buf, "\n\t.section __version_ext_crcs,\"a\",%%progbits\n");
> > + buf_printf(buf, "\t.balign 4\n");
> > + list_for_each_entry(sym, &mod->unresolved_symbols, list) {
> > + if (skip_unversioned(mod, sym))
> > + continue;
> > +
> > + buf_printf(buf, "\t.long 0x%08x\n", sym->crc);
> > + }
> > +}
> > +
> > +/*
> > + * A symbol without a CRC was warned about with the CRCs, and is skipped here
> > + * too so that the names line up with them.
> > + */
> > +static void add_asm_version_ext_names(struct buffer *buf, struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + buf_printf(buf, "\t.section __version_ext_names,\"a\",%%progbits\n");
> > + list_for_each_entry(sym, &mod->unresolved_symbols, list) {
> > + if (!sym->module || !sym->crc_valid)
> > + continue;
> > +
> > + buf_asciz(buf, sym->name);
> > + }
> > + /* The terminator of the string literal this used to be. */
> > + buf_printf(buf, "\t.byte 0\n");
>
> This is ok since the conversion aims to be byte-identical. In the
> future, I believe the extra NUL byte should be removed and
> elf_validity_cache_index_versions() also be updated to report when
> __version_ext_names contains more names than there are CRCs in
> __version_ext_crcs.
Ack, I agree one for a follow up!
>
> > +}
> > +
> > +/*
> > + * The equivalent of:
> > + * static const u32 ____version_ext_crcs[] __section("__version_ext_crcs") = { crc, ... };
> > + * static const char ____version_ext_names[] __section("__version_ext_names") = "name\0" ...;
> > + *
> > + * for unresolved symbols.
> > + */
> > +static void add_asm_extended_versions(struct buffer *buf, struct module *mod)
> > +{
> > + if (!extended_modversions)
> > + return;
> > +
> > + add_asm_version_ext_crcs(buf, mod);
> > + add_asm_version_ext_names(buf, mod);
> > +}
>
> Nit: add_asm_version_ext_crcs() and add_asm_version_ext_names() are both
> fairly short and are called only from add_asm_extended_versions(), so
> I think they could be inlined into that function. This would be similar
> to the original implementation, which does all the work in
> add_extended_versions().
Ack will do for v4!
>
> > +
> > +/* Clear ->seen of the modules that own symbols this one needs. */
> > +static void clear_seen_dependencies(struct module *mod)
> > +{
> > + struct symbol *sym;
> > +
> > + list_for_each_entry(sym, &mod->unresolved_symbols, list) {
> > + if (sym->module)
> > + sym->module->seen = sym->module->is_vmlinux;
> > + }
> > +}
> > +
> > +/* The modules this one depends on, each once, comma separated. */
> > +static void collect_dependencies(struct module *mod, struct buffer *deps)
> > +{
> > + struct symbol *sym;
> > + bool first = true;
> > +
> > + clear_seen_dependencies(mod);
> > +
> > + list_for_each_entry(sym, &mod->unresolved_symbols, list) {
> > + struct module *owner = sym->module;
> > +
> > + if (!owner || owner->seen)
> > + continue;
> > +
> > + owner->seen = true;
> > + buf_printf(deps, "%s%s", first ? "" : ",",
> > + get_basename(owner->name));
> > + first = false;
> > + }
> > + buf_write(deps, "", 1);
> > +}
> > +
> > +static void add_asm_depends(struct buffer *buf, struct module *mod)
> > +{
> > + struct buffer deps = { };
> > +
> > + collect_dependencies(mod, &deps);
> > + buf_printf(buf, "\n");
> > + add_asm_modinfo(buf, "depends", deps.p);
> > + free(deps.p);
> > +}
>
> Nit: Same here. I think this would be more straightforward if
> collect_dependencies() and clear_seen_dependencies() were inlined into
> add_asm_depends(), matching the original add_depends().
Ack one for v4 too! :)
>
> --
> Thanks,
> Petr
--
Cheers, Lorenzo
next prev parent reply other threads:[~2026-09-21 11:58 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 9:21 [PATCH v2 00/21] kbuild: significantly speed up kernel builds Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 01/21] kbuild: do not allocate .modinfo in vmlinux Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 02/21] kallsyms: index symbols by token to speed up table compression Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 03/21] kallsyms: output binary data to speed output and kallsyms assembly Lorenzo Stoakes (ARM)
2026-09-14 20:16 ` Markus Elfring
2026-09-14 21:44 ` David Laight
2026-09-15 7:10 ` [v2 " Markus Elfring
2026-09-14 9:22 ` [PATCH v2 04/21] kbuild: do not sort nm output where the order is irrelevant Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 05/21] kbuild: only emit vmlinux relocations when required Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 06/21] elf-parse: add section flags, symbol binding and a read-only mapping Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 07/21] kallsyms: reimplement mksysmap in C Lorenzo Stoakes (ARM)
2026-09-14 16:33 ` Markus Elfring
2026-09-14 16:54 ` Markus Elfring
2026-09-14 17:01 ` Markus Elfring
2026-09-14 9:22 ` [PATCH v2 08/21] kbuild: cache list, composite object state per object Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 09/21] kbuild: implement and use depcheck to check dependency timestamps Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 10/21] kbuild: move the toolchain checks into init/Kconfig.toolchain Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 11/21] kbuild: avoid re-running compiler and linker probes Lorenzo Stoakes (ARM)
2026-09-14 15:02 ` John Stoffel
2026-09-14 15:24 ` Lorenzo Stoakes (ARM)
2026-09-15 11:01 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 12/21] modpost: cache section relocation mismatch state Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 13/21] modpost: emit module descriptors as assembly Lorenzo Stoakes (ARM)
2026-09-21 11:25 ` Petr Pavlu
2026-09-21 11:57 ` Lorenzo Stoakes (ARM) [this message]
2026-09-21 12:36 ` Petr Pavlu
2026-09-21 12:48 ` Lorenzo Stoakes (ARM)
2026-09-21 13:50 ` Petr Pavlu
2026-09-21 14:05 ` Lorenzo Stoakes (ARM)
2026-09-22 13:09 ` Lorenzo Stoakes (ARM)
2026-09-21 12:09 ` Jani Nikula
2026-09-14 9:22 ` [PATCH v2 14/21] kbuild: batch module finalisation Lorenzo Stoakes (ARM)
2026-09-14 18:00 ` Kees Cook
2026-09-15 10:44 ` Lorenzo Stoakes (ARM)
2026-09-15 16:49 ` Kees Cook
2026-09-15 17:54 ` Lorenzo Stoakes (ARM)
2026-09-15 17:56 ` Nick Desaulniers
2026-09-16 14:30 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 15/21] objtool: cache relocations, do less work Lorenzo Stoakes (ARM)
2026-09-14 19:44 ` Josh Poimboeuf
2026-09-14 20:06 ` Linus Torvalds
2026-09-14 22:23 ` Josh Poimboeuf
2026-09-14 22:30 ` Linus Torvalds
2026-09-15 12:24 ` Lorenzo Stoakes (ARM)
2026-09-15 12:19 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 16/21] objtool: size the instruction hash to the text Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 17/21] objtool: decode instructions and resolve branch targets in parallel Lorenzo Stoakes (ARM)
2026-09-14 18:20 ` Kees Cook
2026-09-15 10:09 ` Lorenzo Stoakes (ARM)
2026-09-15 11:29 ` David Laight
2026-09-15 15:04 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 18/21] kbuild: rust: optionally parallelise rustc front end Lorenzo Stoakes (ARM)
2026-09-14 18:32 ` Kees Cook
2026-09-15 11:09 ` Lorenzo Stoakes (ARM)
2026-09-15 11:16 ` Lorenzo Stoakes (ARM)
2026-09-15 6:32 ` Miguel Ojeda
2026-09-15 11:15 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 19/21] rust: make exports.o depend on the headers generated for it Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 20/21] kbuild: build rust crates in parallel with the rest of the build Lorenzo Stoakes (ARM)
2026-09-14 18:37 ` Kees Cook
2026-09-15 11:58 ` Lorenzo Stoakes (ARM)
2026-09-15 16:52 ` Kees Cook
2026-09-16 14:04 ` Lorenzo Stoakes (ARM)
2026-09-16 7:42 ` Gary Guo
2026-09-16 14:03 ` Lorenzo Stoakes (ARM)
2026-09-14 9:22 ` [PATCH v2 21/21] kbuild: use pigz for gzip compression if available Lorenzo Stoakes (ARM)
2026-09-14 16:39 ` Kees Cook
2026-09-14 16:49 ` H. Peter Anvin
2026-09-14 17:50 ` Kees Cook
2026-09-15 14:30 ` Lorenzo Stoakes (ARM)
2026-09-15 17:31 ` Kees Cook
2026-09-15 17:47 ` Nick Desaulniers
2026-09-15 18:02 ` Arnd Bergmann
2026-09-16 14:33 ` Lorenzo Stoakes (ARM)
2026-09-16 14:40 ` Lorenzo Stoakes (ARM)
2026-09-16 1:06 ` Kees Cook
2026-09-16 6:38 ` Arnd Bergmann
2026-09-16 15:08 ` Lorenzo Stoakes (ARM)
2026-09-16 15:27 ` Kees Cook
2026-09-17 14:32 ` Lorenzo Stoakes (ARM)
2026-09-16 15:03 ` Lorenzo Stoakes (ARM)
2026-09-16 15:09 ` Kees Cook
2026-09-16 15:26 ` Lorenzo Stoakes (ARM)
2026-09-14 15:41 ` [PATCH v2 00/21] kbuild: significantly speed up kernel builds Kees Cook
2026-09-14 15:53 ` Linus Torvalds
2026-09-15 8:53 ` Arnd Bergmann
2026-09-15 11:35 ` Lorenzo Stoakes (ARM)
2026-09-14 18:25 ` Lorenzo Stoakes (ARM)
2026-09-14 18:43 ` Kees Cook
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=arEZrFmXeCO4hZpP@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®