Commit:     551559e13af1ccd19d0525cb2b0f308905170647
Parent:     9e233625fbee1f977929a5406533b96011f1a06b
Author:     Tejun Heo <[EMAIL PROTECTED]>
AuthorDate: Fri Dec 7 21:04:30 2007 +0900
Committer:  Sam Ravnborg <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 23:14:35 2008 +0100

    kbuild: implement modules.order
    When multiple built-in modules (especially drivers) provide the same
    capability, they're prioritized by link order specified by the order
    listed in Makefile.  This implicit ordering is lost for loadable
    When driver modules are loaded by udev, what comes first in
    modules.alias file is selected.  However, the order in this file is
    indeterministic (depends on filesystem listing order of installed
    modules).  This causes confusion.
    The solution is two-parted.  This patch updates kbuild such that it
    generates and installs modules.order which contains the name of
    modules ordered according to Makefile.  The second part is update to
    depmod such that it generates output files according to this file.
    Note that both obj-y and obj-m subdirs can contain modules and
    ordering information between those two are lost from beginning.
    Currently obj-y subdirs are put before obj-m subdirs.
    Sam Ravnborg cleaned up Makefile modifications and suggested using awk
    to remove duplicate lines from modules.order instead of using separate
    C program.
    Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
    Acked-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
    Cc: Bill Nottingham <[EMAIL PROTECTED]>
    Cc: Rusty Russell <[EMAIL PROTECTED]>
    Cc: Kay Sievers <[EMAIL PROTECTED]>
    Cc: Jon Masters <[EMAIL PROTECTED]>
    Signed-off-by: Sam Ravnborg <[EMAIL PROTECTED]>
 Makefile               |    8 +++++++-
 scripts/ |   17 ++++++++++++++++-
 scripts/Makefile.lib   |    6 ++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 344defd..f8d1fd5 100644
--- a/Makefile
+++ b/Makefile
@@ -1021,9 +1021,14 @@ ifdef CONFIG_MODULES
 all: modules
 #      Build modules
+#      A module can be listed more than once in obj-m resulting in
+#      duplicate lines in modules.order files.  Those are removed
+#      using awk while concatenating to the final file.
 PHONY += modules
 modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
+       $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > 
        @echo '  Building modules, stage 2.';
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
@@ -1051,6 +1056,7 @@ _modinst_:
                rm -f $(MODLIB)/build ; \
                ln -s $(objtree) $(MODLIB)/build ; \
+       @cp -f $(objtree)/modules.order $(MODLIB)/
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
 # This depmod is only for convenience to give the initial
@@ -1110,7 +1116,7 @@ clean: archclean $(clean-dirs)
        @find . $(RCS_FIND_IGNORE) \
                \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
-               -o -name '*.symtypes' \) \
+               -o -name '*.symtypes' -o -name 'modules.order' \) \
                -type f -print | xargs rm -f
 # mrproper - Delete all generated files, including .config
diff --git a/scripts/ b/scripts/
index de9836e..db38ef4 100644
--- a/scripts/
+++ b/scripts/
@@ -83,10 +83,12 @@ ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) 
 builtin-target := $(obj)/built-in.o
+modorder-target := $(obj)/modules.order
 # We keep a list of all modules in $(MODVERDIR)
 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
-        $(if $(KBUILD_MODULES),$(obj-m)) \
+        $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
         $(subdir-ym) $(always)
@@ -276,6 +278,19 @@ targets += $(builtin-target)
 endif # builtin-target
+# Rule to create modules.order file
+# Create commands to either record .ko file or cat modules.order from
+# a subdirectory
+modorder-cmds =                                                \
+       $(foreach m, $(modorder),                       \
+               $(if $(filter %/modules.order, $m),     \
+                       cat $m;, echo kernel/$m;))
+$(modorder-target): $(subdir-ym) FORCE
+       $(Q)(cat /dev/null; $(modorder-cmds)) > $@
 # Rule to compile a set of .o files into one .a file
 ifdef lib-target
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 3c5e88b..8e44023 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -25,6 +25,11 @@ lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
 # o if we encounter foo/ in $(obj-m), remove it from $(obj-m) 
 #   and add the directory to the list of dirs to descend into: $(subdir-m)
+# Determine modorder.
+# Unfortunately, we don't have information about ordering between -y
+# and -m subdirs.  Just put -y's first.
+modorder       := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) 
 __subdir-y     := $(patsubst %/,%,$(filter %/, $(obj-y)))
 subdir-y       += $(__subdir-y)
 __subdir-m     := $(patsubst %/,%,$(filter %/, $(obj-m)))
@@ -64,6 +69,7 @@ real-objs-m := $(foreach m, $(obj-m), $(if $(strip 
$($(m:.o=-objs)) $($(m:.o=-y)
 extra-y                := $(addprefix $(obj)/,$(extra-y))
 always         := $(addprefix $(obj)/,$(always))
 targets                := $(addprefix $(obj)/,$(targets))
+modorder       := $(addprefix $(obj)/,$(modorder))
 obj-y          := $(addprefix $(obj)/,$(obj-y))
 obj-m          := $(addprefix $(obj)/,$(obj-m))
 lib-y          := $(addprefix $(obj)/,$(lib-y))
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to