From: Prarit Bhargava prarit@redhat.com
redhat/kernel.spec.template: Parallelize compression
This line in the kernel.spec file:
find $RPM_BUILD_ROOT/lib/modules/ -type f -name '*.ko' | xargs -P${RPM_BUILD_NCPUS} -r xz;
implies that ${RPM_BUILD_NCPUS} xz instances are run. This is not true, and this line actually applies ${RPM_BUILD_NCPUS} to a single instance of xz. This means that the compression has been done one module at a time (ie, in serial) rather than in parallel as is implied by the code.
Rewrite this code into a script and make the execution truly parallel.
Signed-off-by: Prarit Bhargava prarit@redhat.com
diff --git a/redhat/Makefile b/redhat/Makefile index blahblah..blahblah 100644 --- a/redhat/Makefile +++ b/redhat/Makefile @@ -632,6 +632,7 @@ sources-rh: $(TARBALL) generate-testpatch-tmp setup-source dist-configs-check scripts/mod/mod-internal.list \ scripts/mod/mod-partner.list \ scripts/mod/mod-sign.sh \ + scripts/mod/mod-compress.sh \ configs/flavors \ configs/generate_all_configs.sh \ configs/merge.pl \ diff --git a/redhat/kernel.spec.template b/redhat/kernel.spec.template index blahblah..blahblah 100755 --- a/redhat/kernel.spec.template +++ b/redhat/kernel.spec.template @@ -767,6 +767,8 @@ Source21: mod-sign.sh
%define modsign_cmd %{SOURCE21}
+Source22: mod-compress.sh + %if 0%{?include_rhel} Source23: x509.genkey.rhel
@@ -2472,7 +2474,8 @@ find Documentation -type d | xargs chmod u+w fi \ fi \ if [ "%{zipmodules}" -eq "1" ]; then \ - find $RPM_BUILD_ROOT/lib/modules/ -type f -name '*.ko' | xargs -P${RPM_BUILD_NCPUS} -r xz; \ + echo "Compressing modules ..." \ + %{SOURCE22} "$RPM_BUILD_ROOT/lib/modules/" "${RPM_BUILD_NCPUS}" \ fi \ %{nil}
diff --git a/redhat/scripts/mod/mod-compress.sh b/redhat/scripts/mod/mod-compress.sh new file mode 100755 index blahblah..blahblah 100755 --- /dev/null +++ b/redhat/scripts/mod/mod-compress.sh @@ -0,0 +1,22 @@ +#!/usr/bin/bash + +BUILD_DIR=$1 +NCPUS=$2 + +if [ ! -e "$BUILD_DIR" ]; then + echo "Could not find $BUILD_DIR" + exit 1 +fi + +modcount=0 +for module in $(find "$BUILD_DIR" -name *.ko) +do + xz $module & + waitpids[${modcount}]=$! + modcount=$(expr $modcount + 1) + while [ "$(jobs | grep -c Running)" -ge "$NCPUS" ]; do :; done +done + +for pid in ${waitpids[*]}; do + wait ${pid} +done
-- https://gitlab.com/cki-project/kernel-ark/-/merge_requests/2254
From: Herton R. Krzesinski on gitlab.com https://gitlab.com/cki-project/kernel-ark/-/merge_requests/2254#note_1248025...
Do you really need an external script here? I think you can use -n argument of xargs, eg:
```find $RPM_BUILD_ROOT/lib/modules/ -type f -name '*.ko' | xargs -n 1 -P${RPM_BUILD_NCPUS} -r xz; ```
kernel@lists.fedoraproject.org