I was never satisfied with the ugly hack, how kernel-modules
were loaded in openwrt, but it works since the beginning. here
is a proposal to do it clean and also fast with ash-builtins.
side-effect is a better logging. e.g.:

Jan  1 00:00:25 box daemon.info load_modules(): insmod: can't insert 
'input-core': File exists
Jan  1 00:00:26 box daemon.info load_modules(): insmod: can't insert 
'input-polldev': File exists
Jan  1 00:00:33 box daemon.info load_modules(): [OK] 85 modules, time: 25.16 -> 
33.05

i have done some benchmarks with the old and the new code:
the new code seems to last a litte bit longer, in my case:
7.44 sec <-> 7.50 sec on an ar71xx/400mhz - should be ok IMHO.

Signed-off-by: Bastian Bittorf <bittorf at bluebottle.com>
>From d584b3e50a67b5e63949430ce16128d8bc5a0066 Mon Sep 17 00:00:00 2001
From: Bastian Bittorf <bastian@bastian-laptop.(none)>
Date: Sun, 16 Jan 2011 11:17:26 +0100
Subject: [PATCH] load_modules() refactoring without sed

---
 package/base-files/files/etc/functions.sh |   27 ++++++++++++++++++++++-----
 package/base-files/files/etc/init.d/boot  |    2 +-
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/package/base-files/files/etc/functions.sh b/package/base-files/files/etc/functions.sh
index acea617..af2bb12 100755
--- a/package/base-files/files/etc/functions.sh
+++ b/package/base-files/files/etc/functions.sh
@@ -205,11 +205,28 @@ config_list_foreach() {
 	done
 }
 
-load_modules() {
-	[ -d /etc/modules.d ] && {
-		cd /etc/modules.d
-		sed 's/^[^#]/insmod &/' $* | ash 2>&- || :
-	}
+load_modules()
+{
+	local list_files="/etc/modules.d/*"
+	local file line dummy t1 t2
+	local count=0
+
+	read t1 dummy </proc/uptime
+
+	for file in $list_files; do {
+		while read line; do {
+			case "$line" in
+				"#"*|"") ;;
+				*)
+					count="$(( $count + 1 ))"
+					insmod $line 2>&1 | logger -t "load_modules()" -p daemon.info
+				;;
+			esac
+		} done <$file
+	} done
+
+	read t2 dummy </proc/uptime
+	logger -t "load_modules()" -p daemon.info "[OK] $count modules, time: $t1 -> $t2"
 }
 
 include() {
diff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot
index 7927af1..eafafa5 100755
--- a/package/base-files/files/etc/init.d/boot
+++ b/package/base-files/files/etc/init.d/boot
@@ -79,7 +79,7 @@ start() {
 		[ -n "$rootdev" ] && ln -s "$rootdev" /dev/root
 	}
 
-	load_modules /etc/modules.d/*
+	load_modules
 }
 
 stop() {
-- 
1.6.3.3

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to