Blob Blame History Raw
From d23159a69c818274486f1287ba6267b96f3febb7 Mon Sep 17 00:00:00 2001
From: John Reiser <jreiser@bitwagon.com>
Date: Fri, 23 Sep 2011 09:17:13 -0700
Subject: [PATCH] dracut [PATCH]es: parallelize block_module filter and
 net_module_filter

Filtering modules requires enough work that instmods() in the
next pipeline stage was rarely busy.  Parallelize the two
filters which do the most work.  Also fix a filename-vs-contents
mistake in net_module_filter.

--
John Reiser, jreiser@BitWagon.com

>From f4533a2ceca52c443ddebec01eeaa35d51c39c1b Mon Sep 17 00:00:00 2001
From: John Reiser <jreiser@BitWagon.com>
Date: Tue, 13 Sep 2011 17:41:43 -0700
Subject: [PATCH 1/3] Parallelize block_module_filter
---
 modules.d/40network/module-setup.sh        |   33 +++++++++++++++++----------
 modules.d/90kernel-modules/module-setup.sh |   22 +++++++++++++-----
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/modules.d/40network/module-setup.sh b/modules.d/40network/module-setup.sh
index cb81269..03684f1 100755
--- a/modules.d/40network/module-setup.sh
+++ b/modules.d/40network/module-setup.sh
@@ -27,18 +27,27 @@ installkernel() {
     net_module_filter() {
         local _net_drivers='eth_type_trans|register_virtio_device'
         local _unwanted_drivers='/(wireless|isdn|uwb)/'
-        local _fname
-        while read _fname; do
-            local _fcont
-            case "$_fname" in
-                *.ko)    _fcont="$(<        $_fname)" ;;
-                *.ko.gz) _fcont="$(gzip -dc $_fname)" ;;
-            esac
-            [[   $_fcont =~ $_net_drivers
-            && ! $_fcont =~ iw_handler_get_spy \
-            && ! $_fname =~ $_unwanted_drivers ]] \
-            && echo "$_fname"
-        done
+        function nmf1() {
+            local _fname _fcont
+            while read _fname; do
+                [[ $_fname =~ $_unwanted_drivers ]] && continue
+                case "$_fname" in
+                    *.ko)    _fcont="$(<        $_fname)" ;;
+                    *.ko.gz) _fcont="$(gzip -dc $_fname)" ;;
+                esac
+                [[   $_fcont =~ $_net_drivers
+                && ! $_fcont =~ iw_handler_get_spy ]] \
+                && echo "$_fname"
+            done
+        }
+        # Use two parallel streams to filter alternating modules.
+        local merge side2
+        ( ( local _f1 _f2
+            while  read _f1; do   echo "$_f1"
+                if read _f2; then echo "$_f2" 1>&${side2}; fi
+            done \
+            | nmf1     1>&${merge}    ) {side2}>&1 \
+            | nmf1  )      {merge}>&1
     }
 
     find_kernel_modules_by_path drivers/net | net_module_filter | instmods
diff --git a/modules.d/90kernel-modules/module-setup.sh b/modules.d/90kernel-modules/module-setup.sh
index 9fc4248..09bd87e 100755
--- a/modules.d/90kernel-modules/module-setup.sh
+++ b/modules.d/90kernel-modules/module-setup.sh
@@ -11,12 +11,22 @@ installkernel() {
         }
         block_module_filter() {
             local _blockfuncs='ahci_init_controller|ata_scsi_ioctl|scsi_add_host|blk_init_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device'
-            local _f
-            while read _f; do case "$_f" in
-                *.ko)    [[ $(<         $_f) =~ $_blockfuncs ]] && echo "$_f" ;;
-                *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;;
-                esac
-            done
+            function bmf1() {
+                local _f
+                while read _f; do case "$_f" in
+                    *.ko)    [[ $(<         $_f) =~ $_blockfuncs ]] && echo "$_f" ;;
+                    *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;;
+                    esac
+                done
+            }
+            # Use two parallel streams to filter alternating modules.
+            local merge side2
+            ( ( local _f1 _f2
+                while  read _f1; do   echo "$_f1"
+                    if read _f2; then echo "$_f2" 1>&${side2}; fi
+                done \
+                | bmf1     1>&${merge}    ) {side2}>&1 \
+                | bmf1  )      {merge}>&1
         }
         hostonly='' instmods sr_mod sd_mod scsi_dh scsi_dh_rdac scsi_dh_emc
         hostonly='' instmods pcmcia firewire-ohci