If you know that your kernel modules will only ever be loaded by a newer
kernel, you can disable BASIC_MODVERSIONS to save space. This also
allows easy creation of test modules to seee how tooling will respond to
modules that only have the new format.

Signed-off-by: Matthew Maurer <mmau...@google.com>
---
 kernel/module/Kconfig    | 15 +++++++++++++++
 scripts/Makefile.modpost |  1 +
 scripts/mod/modpost.c    | 19 +++++++++++--------
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/kernel/module/Kconfig b/kernel/module/Kconfig
index 
9568b629a03ce8289d3f3597eefc66fc96445720..5f701391ab12c7d1b3ca496c9b3443c5a76a8745
 100644
--- a/kernel/module/Kconfig
+++ b/kernel/module/Kconfig
@@ -217,6 +217,21 @@ config EXTENDED_MODVERSIONS
          The most likely reason you would enable this is to enable Rust
          support. If unsure, say N.
 
+config BASIC_MODVERSIONS
+       bool "Basic Module Versioning Support"
+       depends on MODVERSIONS
+       default MODVERSIONS
+       help
+         This enables basic MODVERSIONS support, allowing older tools or
+         kernels to potentially load modules.
+
+         Disabling this may cause older `modprobe` or `kmod` to be unable
+         to read MODVERSIONS information from built modules. With this
+         disabled, older kernels may treat this module as unversioned.
+
+         This is enabled by default when MODVERSIONS are enabled.
+         If unsure, say Y.
+
 config MODULE_SRCVERSION_ALL
        bool "Source checksum for all modules"
        help
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 
40426fc6350985780c0092beb49c6cc29b9eff62..d7d45067d08b94a82451d66a64eae29b6826e139
 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -43,6 +43,7 @@ MODPOST = $(objtree)/scripts/mod/modpost
 modpost-args =                                                                 
        \
        $(if $(CONFIG_MODULES),-M)                                              
        \
        $(if $(CONFIG_MODVERSIONS),-m)                                          
        \
+       $(if $(CONFIG_BASIC_MODVERSIONS),-b)                                    
        \
        $(if $(CONFIG_EXTENDED_MODVERSIONS),-x)                                 
        \
        $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                                
        \
        $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                          
        \
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 
c58f08681fc1e37929333ba3a3e0989c4db5a79d..d13d10bf534a4c15fa76fffb2a1dc9832bd0e95a
 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -33,6 +33,8 @@ static bool module_enabled;
 static bool modversions;
 /* Is CONFIG_MODULE_SRCVERSION_ALL set? */
 static bool all_versions;
+/* Is CONFIG_BASIC_MODVERSIONS set? */
+static bool basic_modversions;
 /* Is CONFIG_EXTENDED_MODVERSIONS set? */
 static bool extended_modversions;
 /* If we are modposting external module set to 1 */
@@ -1823,10 +1825,8 @@ static void add_extended_versions(struct buffer *b, 
struct module *mod)
                if (!s->module)
                        continue;
                if (!s->crc_valid) {
-                       /*
-                        * We already warned on this when producing the legacy
-                        * modversions table.
-                        */
+                       warn("\"%s\" [%s.ko] has no CRC!\n",
+                               s->name, mod->name);
                        continue;
                }
                buf_printf(b, "\t%#8x,\n", s->crc);
@@ -1840,8 +1840,8 @@ static void add_extended_versions(struct buffer *b, 
struct module *mod)
                        continue;
                if (!s->crc_valid) {
                        /*
-                        * We already warned on this when producing the legacy
-                        * modversions table.
+                        * We already warned on this when producing the crc
+                        * table.
                         * We need to skip its name too, as the indexes in
                         * both tables need to align.
                         */
@@ -1859,7 +1859,7 @@ static void add_versions(struct buffer *b, struct module 
*mod)
 {
        struct symbol *s;
 
-       if (!modversions)
+       if (!basic_modversions)
                return;
 
        buf_printf(b, "\n");
@@ -2179,7 +2179,7 @@ int main(int argc, char **argv)
        LIST_HEAD(dump_lists);
        struct dump_list *dl, *dl2;
 
-       while ((opt = getopt(argc, argv, "ei:MmnT:to:au:WwENd:x")) != -1) {
+       while ((opt = getopt(argc, argv, "ei:MmnT:to:au:WwENd:xb")) != -1) {
                switch (opt) {
                case 'e':
                        external_module = true;
@@ -2228,6 +2228,9 @@ int main(int argc, char **argv)
                case 'd':
                        missing_namespace_deps = optarg;
                        break;
+               case 'b':
+                       basic_modversions = true;
+                       break;
                case 'x':
                        extended_modversions = true;
                        break;

-- 
2.47.1.613.gc27f4b7a9f-goog


Reply via email to