[RFC PATCH] kbuild: check uniqueness of basename of modules

From: Masahiro Yamada
Date: Wed May 15 2019 - 03:42:10 EST

In the recent build test of linux-next, Stephen saw a build error
caused by a broken .tmp_versions/*.mod file:


drivers/net/phy/asix.ko and drivers/net/usb/asix.ko have the same
basename, and there is a race in generating .tmp_versions/asix.mod

Kbuild has not checked this before, and it occasionally shows up with
obscure error message when this kind of race occurs.

It is not trivial to catch this potential issue by eyes.

Hence, this script.

I compile-tested allmodconfig for the latest kernel as of writing,
it detected the following:

warning: same basename '88pm800.ko' if the following are built as modules:
warning: same basename 'adv7511.ko' if the following are built as modules:
warning: same basename 'asix.ko' if the following are built as modules:
warning: same basename 'coda.ko' if the following are built as modules:
warning: same basename 'realtek.ko' if the following are built as modules:

Reported-by: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx>
Signed-off-by: Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx>

[Alternative fix ? ]

I do not know about the user experience of modprobe etc.
when two different modules have the same name.
It does not matter if this is correctly handled by modules.order?

If this is just a problem of the build system, it is pretty easy to fix.
For example, if we prepend the directory path, parallel build will
never write to the same file simultanously.

asix.mod -> drivers/net/phy/asix.mod
asix.mod -> drivers/net/usb/asix.mod

[Futher discussion]

Linus Torvalds pointed out that it is silly to add the same prefix to
each file since the sub-system is already represented by the directory

See this:

We can keep the basename short enough to distinguish in the subsytem
in theory.

So, I am not surprised to see the same file name in different
directory locations.

On the other hand, a module is named after the file name when
it consists of a single C source file.

Of course, you can always give a different module name.

For example, see

I am not a big fan of it since it looks ugly.

I think we can play it by ear, but I just wanted to point out this
related to the module name uniqueness.

Makefile | 1 +
scripts/modules-check.sh | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
create mode 100755 scripts/modules-check.sh

diff --git a/Makefile b/Makefile
index a61a95b6b38f..30792fec7a12 100644
--- a/Makefile
+++ b/Makefile
@@ -1290,6 +1290,7 @@ modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh

modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
$(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin
diff --git a/scripts/modules-check.sh b/scripts/modules-check.sh
new file mode 100755
index 000000000000..944e68bd22b0
--- /dev/null
+++ b/scripts/modules-check.sh
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: GPL-2.0
+# Warn if two or more modules have the same basename
+ same_name_modules=$(cat modules.order modules.builtin | \
+ xargs basename -a | sort | uniq -d)
+ for m in $same_name_modules
+ do
+ echo "warning: same basename '$m' if the following are built as modules:"
+ grep --no-filename -e /$m modules.order modules.builtin | \
+ sed 's:^kernel/: :'
+ done