From: Petr Pavlu <petr.pavlu@suse.com>
To: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
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 13:25:09 +0200 [thread overview]
Message-ID: <95baacfb-d8d9-4d2f-bc89-592df6f6f8e3@suse.com> (raw)
In-Reply-To: <20260914-build-speedup-v2-13-39817ec5db23@kernel.org>
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.
>
> 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
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;
> 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?
> 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.
> +
> +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);
}
}
> +/*
> + * 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.
> +}
> +
> +/*
> + * 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().
> +
> +/* 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().
--
Thanks,
Petr
next prev parent reply other threads:[~2026-09-21 11:25 UTC|newest]
Thread overview: 88+ 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 [this message]
2026-09-21 11:57 ` Lorenzo Stoakes (ARM)
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-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=95baacfb-d8d9-4d2f-bc89-592df6f6f8e3@suse.com \
--to=petr.pavlu@suse.com \
--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=ljs@kernel.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=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®