diff mbox series

[v3] moduleparam: Save information about built-in modules in separate file

Message ID 20190429090854.GU9023@dhcp129-178.brq.redhat.com (mailing list archive)
State New, archived
Headers show
Series [v3] moduleparam: Save information about built-in modules in separate file | expand

Commit Message

Alexey Gladkov April 29, 2019, 9:08 a.m. UTC
Problem:

When a kernel module is compiled as a separate module, some important
information about the kernel module is available via .modinfo section of
the module.  In contrast, when the kernel module is compiled into the
kernel, that information is not available.

Information about built-in modules is necessary in the following cases:

1. When it is necessary to find out what additional parameters can be
passed to the kernel at boot time.

2. When you need to know which module names and their aliases are in
the kernel. This is very useful for creating an initrd image.

Proposal:

The proposed patch does not remove .modinfo section with module
information from the vmlinux at the build time and saves it into a
separate file after kernel linking. So, the kernel does not increase in
size and no additional information remains in it. Information is stored
in the same format as in the separate modules (null-terminated string
array). Because the .modinfo section is already exported with a separate
modules, we are not creating a new API.

It can be easily read in the userspace:

$ tr '\0' '\n' < kernel.builtin
ext4.softdep=pre: crc32c
ext4.license=GPL
ext4.description=Fourth Extended Filesystem
ext4.author=Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
ext4.alias=fs-ext4
ext4.alias=ext3
ext4.alias=fs-ext3
ext4.alias=ext2
ext4.alias=fs-ext2
md_mod.alias=block-major-9-*
md_mod.alias=md
md_mod.description=MD RAID framework
md_mod.license=GPL
md_mod.parmtype=create_on_open:bool
md_mod.parmtype=start_dirty_degraded:int
...

v2:
 * Extract modinfo from vmlinux.o as suggested by Masahiro Yamada;
 * Rename output file to kernel.builtin;
 * Add MODULE_VERSION to modinfo that is saved to the kernel.builtin;
 * Fix build warnings on powerpc.

v3:
 * Rename output file to modules.builtin.modinfo as suggested by Masahiro Yamada;
 * Update Documentation/dontdiff, Documentation/kbuild/kbuild.txt.

Co-Developed-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
Signed-off-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
---
 .gitignore                        |  1 +
 Documentation/dontdiff            |  1 +
 Documentation/kbuild/kbuild.txt   |  5 +++++
 Makefile                          |  2 ++
 include/asm-generic/vmlinux.lds.h |  1 +
 include/linux/module.h            |  1 +
 include/linux/moduleparam.h       | 12 +++++-------
 scripts/link-vmlinux.sh           |  4 ++++
 8 files changed, 20 insertions(+), 7 deletions(-)

Comments

Jessica Yu April 29, 2019, 2:21 p.m. UTC | #1
+++ Alexey Gladkov [29/04/19 11:08 +0200]:
>Problem:
>
>When a kernel module is compiled as a separate module, some important
>information about the kernel module is available via .modinfo section of
>the module.  In contrast, when the kernel module is compiled into the
>kernel, that information is not available.
>
>Information about built-in modules is necessary in the following cases:
>
>1. When it is necessary to find out what additional parameters can be
>passed to the kernel at boot time.
>
>2. When you need to know which module names and their aliases are in
>the kernel. This is very useful for creating an initrd image.
>
>Proposal:
>
>The proposed patch does not remove .modinfo section with module
>information from the vmlinux at the build time and saves it into a
>separate file after kernel linking. So, the kernel does not increase in
>size and no additional information remains in it. Information is stored
>in the same format as in the separate modules (null-terminated string
>array). Because the .modinfo section is already exported with a separate
>modules, we are not creating a new API.
>
>It can be easily read in the userspace:
>
>$ tr '\0' '\n' < kernel.builtin

s/kernel.builtin/modules.builtin.modinfo/

Otherwise, for module.h and moduleparam.h:

Acked-by: Jessica Yu <jeyu@kernel.org>

And it would be great if Lucas can confirm if the file format and name
would be OK for kmod.

Thanks!

Jessica
Masahiro Yamada April 29, 2019, 3:08 p.m. UTC | #2
On Mon, Apr 29, 2019 at 6:09 PM Alexey Gladkov <gladkov.alexey@gmail.com> wrote:
>
> Problem:
>
> When a kernel module is compiled as a separate module, some important
> information about the kernel module is available via .modinfo section of
> the module.  In contrast, when the kernel module is compiled into the
> kernel, that information is not available.
>
> Information about built-in modules is necessary in the following cases:
>
> 1. When it is necessary to find out what additional parameters can be
> passed to the kernel at boot time.
>
> 2. When you need to know which module names and their aliases are in
> the kernel. This is very useful for creating an initrd image.
>
> Proposal:
>
> The proposed patch does not remove .modinfo section with module
> information from the vmlinux at the build time and saves it into a
> separate file after kernel linking. So, the kernel does not increase in
> size and no additional information remains in it. Information is stored
> in the same format as in the separate modules (null-terminated string
> array). Because the .modinfo section is already exported with a separate
> modules, we are not creating a new API.
>
> It can be easily read in the userspace:
>
> $ tr '\0' '\n' < kernel.builtin
> ext4.softdep=pre: crc32c
> ext4.license=GPL
> ext4.description=Fourth Extended Filesystem
> ext4.author=Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
> ext4.alias=fs-ext4
> ext4.alias=ext3
> ext4.alias=fs-ext3
> ext4.alias=ext2
> ext4.alias=fs-ext2
> md_mod.alias=block-major-9-*
> md_mod.alias=md
> md_mod.description=MD RAID framework
> md_mod.license=GPL
> md_mod.parmtype=create_on_open:bool
> md_mod.parmtype=start_dirty_degraded:int
> ...
>
> v2:
>  * Extract modinfo from vmlinux.o as suggested by Masahiro Yamada;
>  * Rename output file to kernel.builtin;
>  * Add MODULE_VERSION to modinfo that is saved to the kernel.builtin;
>  * Fix build warnings on powerpc.
>
> v3:
>  * Rename output file to modules.builtin.modinfo as suggested by Masahiro Yamada;
>  * Update Documentation/dontdiff, Documentation/kbuild/kbuild.txt.
>
> Co-Developed-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
> Signed-off-by: Gleb Fotengauer-Malinovskiy <glebfm@altlinux.org>
> Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
> ---
>  .gitignore                        |  1 +
>  Documentation/dontdiff            |  1 +
>  Documentation/kbuild/kbuild.txt   |  5 +++++
>  Makefile                          |  2 ++
>  include/asm-generic/vmlinux.lds.h |  1 +
>  include/linux/module.h            |  1 +
>  include/linux/moduleparam.h       | 12 +++++-------
>  scripts/link-vmlinux.sh           |  4 ++++
>  8 files changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/.gitignore b/.gitignore
> index a20ac26aa2f5..8ef2c87703b3 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -45,6 +45,7 @@
>  *.xz
>  Module.symvers
>  modules.builtin
> +modules.builtin.modinfo
>
>  #
>  # Top-level generic files


Let me repeat the same comments as in v2
(https://patchwork.kernel.org/patch/10888207/#22595563)
as you ignored them.



This file is generated only in the top of the tree.

Please add '/' prefix and move it to
the "# Top-level generic files" section.



#
# Top-level generic files
#
/tags
/TAGS
/linux
/vmlinux
/vmlinux.32
/vmlinux-gdb.py
/vmlinuz
/System.map
/Module.markers
/modules.builtin.modinfo




> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index c8cf45362bd6..41ef7cb043c1 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -226,6 +226,10 @@ modpost_link vmlinux.o
>  # modpost vmlinux.o to check for section mismatches
>  ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
>
> +info MODINFO modules.builtin.modinfo
> +"${OBJCOPY}" -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
> +chmod 444 modules.builtin.modinfo


Why is this 'chmod 444' necessary?



> +
>  kallsymso=""
>  kallsyms_vmlinux=""
>  if [ -n "${CONFIG_KALLSYMS}" ]; then
Alexey Gladkov April 29, 2019, 3:35 p.m. UTC | #3
On Tue, Apr 30, 2019 at 12:08:44AM +0900, Masahiro Yamada wrote:
> >  modules.builtin
> > +modules.builtin.modinfo
> >
> >  #
> >  # Top-level generic files
> 
> 
> Let me repeat the same comments as in v2
> (https://patchwork.kernel.org/patch/10888207/#22595563)
> as you ignored them.

I miss it. Sorry about that.

> > diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> > index c8cf45362bd6..41ef7cb043c1 100755
> > --- a/scripts/link-vmlinux.sh
> > +++ b/scripts/link-vmlinux.sh
> > @@ -226,6 +226,10 @@ modpost_link vmlinux.o
> >  # modpost vmlinux.o to check for section mismatches
> >  ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
> >
> > +info MODINFO modules.builtin.modinfo
> > +"${OBJCOPY}" -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
> > +chmod 444 modules.builtin.modinfo
> 
> 
> Why is this 'chmod 444' necessary?

I just wanted to show that this file will never change.
I will remove this line.
diff mbox series

Patch

diff --git a/.gitignore b/.gitignore
index a20ac26aa2f5..8ef2c87703b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,6 +45,7 @@ 
 *.xz
 Module.symvers
 modules.builtin
+modules.builtin.modinfo
 
 #
 # Top-level generic files
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
index 2228fcc8e29f..3d4d5a402b8b 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -179,6 +179,7 @@  mktables
 mktree
 modpost
 modules.builtin
+modules.builtin.modinfo
 modules.order
 modversions.h*
 nconf
diff --git a/Documentation/kbuild/kbuild.txt b/Documentation/kbuild/kbuild.txt
index c9e3d93e7a89..63e118c8c837 100644
--- a/Documentation/kbuild/kbuild.txt
+++ b/Documentation/kbuild/kbuild.txt
@@ -11,6 +11,11 @@  modules.builtin
 This file lists all modules that are built into the kernel. This is used
 by modprobe to not fail when trying to load something builtin.
 
+modules.builtin.modinfo
+--------------------------------------------------
+This file contains modinfo from all modules that are built into the kernel.
+Unlike modinfo of a separate module, all fields are prefixed with module name.
+
 
 Environment variables
 
diff --git a/Makefile b/Makefile
index d5713e7b1e50..5e6657fcf08c 100644
--- a/Makefile
+++ b/Makefile
@@ -1288,6 +1288,7 @@  _modinst_:
 	fi
 	@cp -f $(objtree)/modules.order $(MODLIB)/
 	@cp -f $(objtree)/modules.builtin $(MODLIB)/
+	@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
 
 # This depmod is only for convenience to give the initial
@@ -1328,6 +1329,7 @@  endif # CONFIG_MODULES
 
 # Directories & files removed with 'make clean'
 CLEAN_DIRS  += $(MODVERDIR) include/ksym
+CLEAN_FILES += modules.builtin.modinfo
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config usr/include include/generated          \
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 3d7a6a9c2370..44c724bf7d3a 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -844,6 +844,7 @@ 
 	EXIT_CALL							\
 	*(.discard)							\
 	*(.discard.*)							\
+	*(.modinfo)							\
 	}
 
 /**
diff --git a/include/linux/module.h b/include/linux/module.h
index f5bc4c046461..1cae28b1172a 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -237,6 +237,7 @@  extern typeof(name) __mod_##type##__##name##_device_table		\
 #define MODULE_VERSION(_version) MODULE_INFO(version, _version)
 #else
 #define MODULE_VERSION(_version)					\
+	MODULE_INFO(version, _version);					\
 	static struct module_version_attribute ___modver_attr = {	\
 		.mattr	= {						\
 			.attr	= {					\
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index ba36506db4fb..5ba250d9172a 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -10,23 +10,21 @@ 
    module name. */
 #ifdef MODULE
 #define MODULE_PARAM_PREFIX /* empty */
+#define __MODULE_INFO_PREFIX /* empty */
 #else
 #define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
+/* We cannot use MODULE_PARAM_PREFIX because some modules override it. */
+#define __MODULE_INFO_PREFIX KBUILD_MODNAME "."
 #endif
 
 /* Chosen so that structs with an unsigned long line up. */
 #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
 
-#ifdef MODULE
 #define __MODULE_INFO(tag, name, info)					  \
 static const char __UNIQUE_ID(name)[]					  \
   __used __attribute__((section(".modinfo"), unused, aligned(1)))	  \
-  = __stringify(tag) "=" info
-#else  /* !MODULE */
-/* This struct is here for syntactic coherency, it is not used */
-#define __MODULE_INFO(tag, name, info)					  \
-  struct __UNIQUE_ID(name) {}
-#endif
+  = __MODULE_INFO_PREFIX __stringify(tag) "=" info
+
 #define __MODULE_PARM_TYPE(name, _type)					  \
   __MODULE_INFO(parmtype, name##type, #name ":" _type)
 
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index c8cf45362bd6..41ef7cb043c1 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -226,6 +226,10 @@  modpost_link vmlinux.o
 # modpost vmlinux.o to check for section mismatches
 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
 
+info MODINFO modules.builtin.modinfo
+"${OBJCOPY}" -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
+chmod 444 modules.builtin.modinfo
+
 kallsymso=""
 kallsyms_vmlinux=""
 if [ -n "${CONFIG_KALLSYMS}" ]; then