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
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}
# 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
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}
# 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