]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
uek-rpm: build: sign modules in parallel
authorNick Alcock <nick.alcock@oracle.com>
Tue, 20 Jun 2017 18:27:37 +0000 (19:27 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Mon, 18 Sep 2017 09:25:21 +0000 (10:25 +0100)
Assuming you have enough entropy, this gives a speedup in the
signing phase almost precisely proportional to the core count.

e.g. on a 20-core box (with %_smp_ncpus_max forced to 0 in
/etc/rpm/macros, but this will be irrelevant shortly, and even with the
present RPM configuration a 16-fold speedup can be seen):

old:
168.27user 19.99system 3:06.25elapsed 101%CPU (0avgtext+0avgdata 11112maxresident)k

new:
138.70user 11.32system 0:10.14elapsed 1479%CPU (0avgtext+0avgdata 11208maxresident)k

Signed-off-by: Nick Alcock <nick.alcock@oracle.com>
Reviewed-by: John Sobecki <john.sobecki@oracle.com>
Orabug: 26316447

uek-rpm/ol6/kernel-uek.spec
uek-rpm/ol6/mod-sign.sh
uek-rpm/ol7/kernel-uek.spec
uek-rpm/ol7/mod-sign.sh

index cf6e01d82dbaa8db298271b8b8d6a1b9e40326ab..cddb4cd80fcb686ff35e96b4b3009cd05c6261ba 100644 (file)
@@ -1415,22 +1415,22 @@ find Documentation -type d | xargs chmod u+w
     if [ "%{with_pae}" != "0" ]; then \
       mv signing_key.priv.sign.PAE signing_key.priv \
       mv signing_key.x509.sign.PAE signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAE/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAE/ %{dgst} \
     fi \
     if [ "%{with_debug}" != "0" ]; then \
       mv signing_key.priv.sign.debug signing_key.priv \
       mv signing_key.x509.sign.debug signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.debug/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.debug/ %{dgst} \
     fi \
     if [ "%{with_pae_debug}" != "0" ]; then \
       mv signing_key.priv.sign.PAEdebug signing_key.priv \
       mv signing_key.x509.sign.PAEdebug signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAEdebug/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAEdebug/ %{dgst} \
     fi \
     if [ "%{with_up}" != "0" ]; then \
       mv signing_key.priv.sign signing_key.priv \
       mv signing_key.x509.sign signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}/ %{dgst} \
     fi \
   fi \
 %{nil}
index f8e120f1b22e5d93fd2e293c05b194620ccebd9e..6a84ae250335c30b5f58d896138ac1e5df0f2328 100755 (executable)
@@ -9,21 +9,37 @@
 # This essentially duplicates the 'modules_sign' Kbuild target and runs the
 # same commands for those modules.
 
+parallel=1
+internal=
+while [[ $# -gt 0 ]]; do
+    case $1 in
+        -j) parallel=$2
+            shift;;
+        -j*) parallel="$(echo $1 | sed 's,-j,,')";;
+        --single-file) # One job from a parallel multitude.
+                    internal=t;;
+        *) break;;
+    esac
+    shift
+done
+
 moddir=$1
 dgst=$2
 
-modules=`find $moddir -name *.ko`
-
 MODSECKEY="./signing_key.priv"
 MODPUBKEY="./signing_key.x509"
 
-for mod in $modules
-do
-    dir=`dirname $mod`
-    file=`basename $mod`
+if [[ -n $internal ]]; then
+    dir=`dirname $1`
+    file=`basename $1`
 
     ./scripts/sign-file ${dgst} ${MODSECKEY} ${MODPUBKEY} ${dir}/${file} \
        ${dir}/${file}.signed
     mv ${dir}/${file}.signed ${dir}/${file}
     rm -f ${dir}/${file}.{sig,dig}
-done
+    exit 0
+fi
+
+# Parallel case.
+
+find $moddir -name "*.ko" -print0 | xargs -0r -P $parallel -n 1 -I'{}' $0 --single-file '{}' $dgst
index 6c1bc51f3bfb32542b36752a7db01205f6df6478..cfbcdc4bd04b9ae953573559ec66fa5de5b2ed12 100644 (file)
@@ -1366,22 +1366,22 @@ find Documentation -type d | xargs chmod u+w
     if [ "%{with_pae}" != "0" ]; then \
       mv signing_key.priv.sign.PAE signing_key.priv \
       mv signing_key.x509.sign.PAE signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAE/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAE/ %{dgst} \
     fi \
     if [ "%{with_debug}" != "0" ]; then \
       mv signing_key.priv.sign.debug signing_key.priv \
       mv signing_key.x509.sign.debug signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.debug/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.debug/ %{dgst} \
     fi \
     if [ "%{with_pae_debug}" != "0" ]; then \
       mv signing_key.priv.sign.PAEdebug signing_key.priv \
       mv signing_key.x509.sign.PAEdebug signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAEdebug/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}.PAEdebug/ %{dgst} \
     fi \
     if [ "%{with_up}" != "0" ]; then \
       mv signing_key.priv.sign signing_key.priv \
       mv signing_key.x509.sign signing_key.x509 \
-      %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}/ %{dgst} \
+      %{modsign_cmd} %{?_smp_mflags} $RPM_BUILD_ROOT/lib/modules/%{KVERREL}/ %{dgst} \
     fi \
   fi \
 %{nil}
index f8e120f1b22e5d93fd2e293c05b194620ccebd9e..6a84ae250335c30b5f58d896138ac1e5df0f2328 100755 (executable)
@@ -9,21 +9,37 @@
 # This essentially duplicates the 'modules_sign' Kbuild target and runs the
 # same commands for those modules.
 
+parallel=1
+internal=
+while [[ $# -gt 0 ]]; do
+    case $1 in
+        -j) parallel=$2
+            shift;;
+        -j*) parallel="$(echo $1 | sed 's,-j,,')";;
+        --single-file) # One job from a parallel multitude.
+                    internal=t;;
+        *) break;;
+    esac
+    shift
+done
+
 moddir=$1
 dgst=$2
 
-modules=`find $moddir -name *.ko`
-
 MODSECKEY="./signing_key.priv"
 MODPUBKEY="./signing_key.x509"
 
-for mod in $modules
-do
-    dir=`dirname $mod`
-    file=`basename $mod`
+if [[ -n $internal ]]; then
+    dir=`dirname $1`
+    file=`basename $1`
 
     ./scripts/sign-file ${dgst} ${MODSECKEY} ${MODPUBKEY} ${dir}/${file} \
        ${dir}/${file}.signed
     mv ${dir}/${file}.signed ${dir}/${file}
     rm -f ${dir}/${file}.{sig,dig}
-done
+    exit 0
+fi
+
+# Parallel case.
+
+find $moddir -name "*.ko" -print0 | xargs -0r -P $parallel -n 1 -I'{}' $0 --single-file '{}' $dgst