init: Add two-pass module loading 33/318933/5
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 5 Feb 2025 11:59:27 +0000 (12:59 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 20 Feb 2025 13:18:02 +0000 (14:18 +0100)
Try to load from modules partition first, then from hal partition.

This scheme allows providing early modules with kernel image as well
as vendor modules on /hal, which becomes default "/lib/modules" for
the system, if it was provided.

Change-Id: I918a06ed8cfe4a949c80878ef16532474588cf27

data/initrd-file.list
scripts/init.sh

index 09889052ef981cc3b6cb6e820c833571d65705b8..e402e1b955faee2e6f46b8d02c8bac380e6a81a2 100644 (file)
@@ -33,6 +33,7 @@ PROGS="
 /usr/bin/xargs
 /usr/bin/mkdir
 /usr/bin/mount
+/usr/bin/mountpoint
 /usr/bin/readlink
 /usr/bin/sleep
 /usr/bin/stat
index cd948c3ab07f47c1233ad9dd4451e8d473aa42b3..a3504e232eb64ad08a67ce427b1ed7a381e5cc0b 100755 (executable)
@@ -13,7 +13,7 @@ ROOTFS_MNT=
 DATAFS_MNT=
 MODULES_MNT=
 
-MODULES_INITRD_MNT=/usr/lib/modules
+MODULES_INITRD_MNT=/lib/modules
 
 IN_INITRD=0
 IN_INITRAMFS=0
@@ -386,9 +386,12 @@ function process_modulesfs
 
 function move_modulesfs
 {
-    if [ x$MODULES = "x" ]; then return; fi
-
-    /bin/mount --move $MODULES_INITRD_MNT $MODULES_MNT
+    if [ "$HALFS_MNT" -a -d "$HALFS_MNT/lib/modules" ]; then
+        /bin/mountpoint -q $MODULES_INITRD_MNT && /bin/umount $MODULES_INITRD_MNT
+        /bin/mount --bind $HALFS_MNT/lib/modules $MODULES_MNT
+    else
+        /bin/mountpoint -q $MODULES_INITRD_MNT && /bin/mount --move $MODULES_INITRD_MNT $MODULES_MNT
+    fi
 }
 
 function process_userfs()
@@ -442,7 +445,18 @@ function load_kernel_modules
 {
     echo "Load kernel modules"
 
-    for conf in $(compgen -G $MODULES_INITRD_MNT"/modules-load.d/*.conf")
+    modprobe="/sbin/modprobe"
+    if [ x$ROOTFS_MNT != x ] && mountpoint -q "$ROOTFS_MNT"; then
+        modprobe="$modprobe --dirname=$ROOTFS_MNT"
+    fi
+
+    conffiles=""
+    for it in "$@"; do
+        conffiles="$conffiles $(compgen -G "${it}/modules-load.d/*.conf")"
+        modprobe="$modprobe --config=${it}/modprobe.d"
+    done
+
+    for conf in $conffiles
     do
         echo "Read module conf: $conf"
         while read module junk
@@ -454,7 +468,7 @@ function load_kernel_modules
             fi
 
             echo "Loading module: $module"
-            /sbin/modprobe $module &
+            $modprobe $module &
         done < $conf
     done
 
@@ -539,7 +553,7 @@ print_boot_info
 wait_find_partitions
 
 process_modulesfs
-load_kernel_modules
+load_kernel_modules "$MODULES_INITRD_MNT"              # 1st pass, try to load modules from modules.img
 
 check_network
 setup_nbd
@@ -552,6 +566,8 @@ process_datafs
 process_halfs
 process_userfs
 move_modulesfs
+load_kernel_modules "$MODULES_MNT" "$HALFS_MNT/etc"    # 2nd pass, try to load modules from hal.img
+
 write_resized_flag
 
 pivot_root