Re: [PATCH RFC] modpost: compile constant module information only once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Sep 2, 2024 at 12:33 AM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote:
>
> On Sun, Aug 25, 2024 at 2:44 AM Thomas Weißschuh <linux@xxxxxxxxxxxxxx> wrote:
> >
> > Various information about modules is compiled into the info sections.
> > For that a dedicated .mod.c file is generated by modpost for each module
> > and then linked into the module.
> > However most of the information in the .mod.c is the same for all
> > modules, internal and external.
> > Split the shared information into a dedicated source file that is
> > compiled once and then linked into all modules.
> >
> > This avoids frequent rebuilds for all .mod.c files when using
> > CONFIG_LOCALVERSION_AUTO because the local version ends up in .mod.c
> > through UTS_RELEASE and VERMAGIC_STRING.
> > The modules are still relinked in this case.
> >
> > The code is also easier to maintain as it's now in a proper source file
> > instead of an inline string literal.
> >
> > Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>
> > ---
> > I came up with this while investigating something different.
> > Not sure it's worth the effort.
> > ---
> >  scripts/Makefile.modfinal            |  9 +++++++--
> >  scripts/mod/modinfo.c                | 25 +++++++++++++++++++++++++
> >  scripts/mod/modpost.c                | 23 -----------------------
> >  scripts/package/install-extmod-build |  3 ++-
> >  4 files changed, 34 insertions(+), 26 deletions(-)
> >
> > diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
> > index 306a6bb86e4d..dde09dc4ba11 100644
> > --- a/scripts/Makefile.modfinal
> > +++ b/scripts/Makefile.modfinal
> > @@ -30,6 +30,11 @@ quiet_cmd_cc_o_c = CC [M]  $@
> >  %.mod.o: %.mod.c FORCE
> >         $(call if_changed_dep,cc_o_c)
> >
> > +ifeq ($(KBUILD_EXTMOD),)
> > +scripts/mod/modinfo.o: scripts/mod/modinfo.c FORCE
> > +       $(call if_changed_dep,cc_o_c)
> > +endif
> > +
> >  quiet_cmd_ld_ko_o = LD [M]  $@
> >        cmd_ld_ko_o +=                                                   \
> >         $(LD) -r $(KBUILD_LDFLAGS)                                      \
> > @@ -54,13 +59,13 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check),      \
> >         printf '%s\n' 'savedcmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
> >
> >  # Re-generate module BTFs if either module's .ko or vmlinux changed
> > -%.ko: %.o %.mod.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
> > +%.ko: %.o %.mod.o scripts/module.lds scripts/mod/modinfo.o $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
> >         +$(call if_changed_except,ld_ko_o,vmlinux)
> >  ifdef CONFIG_DEBUG_INFO_BTF_MODULES
> >         +$(if $(newer-prereqs),$(call cmd,btf_ko))
> >  endif
> >
> > -targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o)
> > +targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o) scripts/mod/modinfo.o
> >
> >  # Add FORCE to the prerequisites of a target to force it to be always rebuilt.
> >  # ---------------------------------------------------------------------------
> > diff --git a/scripts/mod/modinfo.c b/scripts/mod/modinfo.c
> > new file mode 100644
> > index 000000000000..12fbc6d3aae8
> > --- /dev/null
> > +++ b/scripts/mod/modinfo.c
> > @@ -0,0 +1,25 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +
> > +#include <linux/module.h>
> > +/*
> > + * Include build-salt.h after module.h in order to
> > + * inherit the definitions.
> > + */
> > +#define INCLUDE_VERMAGIC
> > +#include <linux/build-salt.h>
> > +#include <linux/elfnote-lto.h>
> > +#include <linux/vermagic.h>
> > +
> > +#ifdef CONFIG_UNWINDER_ORC
> > +#include <asm/orc_header.h>
> > +ORC_HEADER;
> > +#endif
> > +
> > +BUILD_SALT;
> > +BUILD_LTO_INFO;
> > +
> > +MODULE_INFO(vermagic, VERMAGIC_STRING);
> > +
> > +#ifdef CONFIG_MITIGATION_RETPOLINE
> > +MODULE_INFO(retpoline, "Y");
> > +#endif
> > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> > index c8cd5d822bb6..107393a8c48a 100644
> > --- a/scripts/mod/modpost.c
> > +++ b/scripts/mod/modpost.c
> > @@ -1755,26 +1755,9 @@ static void check_modname_len(struct module *mod)
> >  static void add_header(struct buffer *b, struct module *mod)
> >  {
> >         buf_printf(b, "#include <linux/module.h>\n");
> > -       /*
> > -        * Include build-salt.h after module.h in order to
> > -        * inherit the definitions.
> > -        */
> > -       buf_printf(b, "#define INCLUDE_VERMAGIC\n");
> > -       buf_printf(b, "#include <linux/build-salt.h>\n");
> > -       buf_printf(b, "#include <linux/elfnote-lto.h>\n");
> >         buf_printf(b, "#include <linux/export-internal.h>\n");
> > -       buf_printf(b, "#include <linux/vermagic.h>\n");
> >         buf_printf(b, "#include <linux/compiler.h>\n");
> >         buf_printf(b, "\n");
> > -       buf_printf(b, "#ifdef CONFIG_UNWINDER_ORC\n");
> > -       buf_printf(b, "#include <asm/orc_header.h>\n");
> > -       buf_printf(b, "ORC_HEADER;\n");
> > -       buf_printf(b, "#endif\n");
> > -       buf_printf(b, "\n");
> > -       buf_printf(b, "BUILD_SALT;\n");
> > -       buf_printf(b, "BUILD_LTO_INFO;\n");
> > -       buf_printf(b, "\n");
> > -       buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
> >         buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
> >         buf_printf(b, "\n");
> >         buf_printf(b, "__visible struct module __this_module\n");
> > @@ -1792,12 +1775,6 @@ static void add_header(struct buffer *b, struct module *mod)
> >         if (!external_module)
> >                 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
> >
> > -       buf_printf(b,
> > -                  "\n"
> > -                  "#ifdef CONFIG_MITIGATION_RETPOLINE\n"
> > -                  "MODULE_INFO(retpoline, \"Y\");\n"
> > -                  "#endif\n");
> > -
> >         if (strstarts(mod->name, "drivers/staging"))
> >                 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
> >
> > diff --git a/scripts/package/install-extmod-build b/scripts/package/install-extmod-build
> > index d2c9cacecc0c..15fab6d5dd56 100755
> > --- a/scripts/package/install-extmod-build
> > +++ b/scripts/package/install-extmod-build
> > @@ -37,6 +37,7 @@ mkdir -p "${destdir}"
> >         echo include/config/auto.conf
> >         echo include/config/kernel.release
> >         echo include/generated
> > +       echo scripts/mod/modinfo.o
> >         find_in_scripts
> >
> >         if is_enabled CONFIG_GCC_PLUGINS; then
> > @@ -78,4 +79,4 @@ if [ "${CC}" != "${HOSTCC}" ] && is_enabled CONFIG_CC_CAN_LINK; then
> >         rm -f "${destdir}/Kbuild" "${destdir}/scripts/Kbuild"
> >  fi
> >
> > -find "${destdir}" \( -name '.*.cmd' -o -name '*.o' \) -delete
> > +find "${destdir}" \( -name '.*.cmd' -o \( -name '*.o' -a -! -path '*/scripts/mod/modinfo.o' \) \) -delete
>
>
> This is not an enough hack because scripts/mod/modinfo.o
> is a new requirement for building external modules.
>
> 'make clean' would need a similar treatment.
>
> 'make help' goes:
>
>   clean   - Remove most generated files but keep the config and
>             enough build support to build external modules
>
>
>
>
>
>
> Or, another approach is to generate a different object
> when building external modules.
>
> A patch attached (on top of this).



The previous one was buggy.

Re-attached.



-- 
Best Regards
Masahiro Yamada
From a2fbc79c88f424696a3201120290e8600bd05dda Mon Sep 17 00:00:00 2001
From: Masahiro Yamada <masahiroy@xxxxxxxxxx>
Date: Sun, 1 Sep 2024 21:22:28 +0900
Subject: [PATCH] fix

Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx>
---
 scripts/Makefile.modfinal                  | 8 +++-----
 scripts/{mod/modinfo.c => module-common.c} | 0
 scripts/package/install-extmod-build       | 3 +--
 3 files changed, 4 insertions(+), 7 deletions(-)
 rename scripts/{mod/modinfo.c => module-common.c} (100%)

diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
index dde09dc4ba11..6b1b72257b29 100644
--- a/scripts/Makefile.modfinal
+++ b/scripts/Makefile.modfinal
@@ -30,10 +30,8 @@ quiet_cmd_cc_o_c = CC [M]  $@
 %.mod.o: %.mod.c FORCE
 	$(call if_changed_dep,cc_o_c)
 
-ifeq ($(KBUILD_EXTMOD),)
-scripts/mod/modinfo.o: scripts/mod/modinfo.c FORCE
+$(extmod_prefix).module-common.o: $(srctree)/scripts/module-common.c FORCE
 	$(call if_changed_dep,cc_o_c)
-endif
 
 quiet_cmd_ld_ko_o = LD [M]  $@
       cmd_ld_ko_o +=							\
@@ -59,13 +57,13 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check),      \
 	printf '%s\n' 'savedcmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
 
 # Re-generate module BTFs if either module's .ko or vmlinux changed
-%.ko: %.o %.mod.o scripts/module.lds scripts/mod/modinfo.o $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
+%.ko: %.o %.mod.o $(extmod_prefix).module-common.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
 	+$(call if_changed_except,ld_ko_o,vmlinux)
 ifdef CONFIG_DEBUG_INFO_BTF_MODULES
 	+$(if $(newer-prereqs),$(call cmd,btf_ko))
 endif
 
-targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o) scripts/mod/modinfo.o
+targets += $(modules:%.o=%.ko) $(modules:%.o=%.mod.o) $(extmod_prefix).module-common.o
 
 # Add FORCE to the prerequisites of a target to force it to be always rebuilt.
 # ---------------------------------------------------------------------------
diff --git a/scripts/mod/modinfo.c b/scripts/module-common.c
similarity index 100%
rename from scripts/mod/modinfo.c
rename to scripts/module-common.c
diff --git a/scripts/package/install-extmod-build b/scripts/package/install-extmod-build
index 15fab6d5dd56..d2c9cacecc0c 100755
--- a/scripts/package/install-extmod-build
+++ b/scripts/package/install-extmod-build
@@ -37,7 +37,6 @@ mkdir -p "${destdir}"
 	echo include/config/auto.conf
 	echo include/config/kernel.release
 	echo include/generated
-	echo scripts/mod/modinfo.o
 	find_in_scripts
 
 	if is_enabled CONFIG_GCC_PLUGINS; then
@@ -79,4 +78,4 @@ if [ "${CC}" != "${HOSTCC}" ] && is_enabled CONFIG_CC_CAN_LINK; then
 	rm -f "${destdir}/Kbuild" "${destdir}/scripts/Kbuild"
 fi
 
-find "${destdir}" \( -name '.*.cmd' -o \( -name '*.o' -a -! -path '*/scripts/mod/modinfo.o' \) \) -delete
+find "${destdir}" \( -name '.*.cmd' -o -name '*.o' \) -delete
-- 
2.43.0


[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux