From d3674971b2a2992b00f5f29ea7f7de1b30eb66e3 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 21 Jul 2022 15:52:52 +0000 Subject: [PATCH 01/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 5f97760..b35b87a 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 14%{?dist} +Release: 15%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -121,6 +121,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Thu Jul 21 2022 Fedora Release Engineering - 1.0-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Thu Jan 20 2022 Fedora Release Engineering - 1.0-14 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild From c8c9d28cff191ff6700d6f6ef3dee5b590e0ad74 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 19 Jan 2023 14:22:32 +0000 Subject: [PATCH 02/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index b35b87a..a3ad983 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 15%{?dist} +Release: 16%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -121,6 +121,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Thu Jan 19 2023 Fedora Release Engineering - 1.0-16 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Thu Jul 21 2022 Fedora Release Engineering - 1.0-15 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild From 7945a35005f04fa76d0dd3646972efdf31ef17bb Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Sun, 5 Feb 2023 01:11:15 +0100 Subject: [PATCH 03/53] find-provides.ksyms: set LC_ALL=C globally This makes the sort order a bit more predictable across various environments and also speeds up grep/sed/sort a bit as they no longer need to deal with non-trivial collations and multibyte sequences that may appear when some garbage is being parsed accidentally. * find-provides.ksyms: Add "export LC_ALL=C", remove "LC_ALL=C" from the specific calls. Signed-off-by: Eugene Syromiatnikov Resolves: #2135047 --- find-provides.ksyms | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index af98b90..60ea837 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -1,12 +1,13 @@ #! /bin/bash IFS=$'\n' +export LC_ALL=C for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do dep_pfx="ksym" # For built-in kmods, "kernel()" syntax is used instead of "ksym()" printf "%s" "$module" | grep -v "^${RPM_BUILD_ROOT}/\?lib/modules/[1-9][^/]*/kernel" > /dev/null \ - || dep_pfx="kernel" + || dep_pfx="kernel" tmpfile="" if [ "x${module%.ko}" = "x${module}" ]; then @@ -37,7 +38,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do nm $module \ | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \ | awk --non-decimal-data '{printf("'"${dep_pfx}"'(%s) = 0x%08x\n", $2, $1)}' \ - | LC_ALL=C sort -u + | sort -u else ELFRODATA=$(readelf -R .rodata $module | awk '/0x/{printf $2$3$4$5}') if [[ -n $(readelf -h $module | grep "little endian") ]]; then @@ -49,7 +50,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do echo $sym $RODATA done \ | awk --non-decimal-data '{printf("'"${dep_pfx}"'(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \ - | LC_ALL=C sort -u + | sort -u fi [ -z "$tmpfile" ] || rm -f -- "$tmpfile" From 4eeb0630777a3eada6f7a6c72254388a0c43585b Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Sun, 5 Feb 2023 01:12:50 +0100 Subject: [PATCH 04/53] find-provides.ksyms, find-requires.ksyms: rewrite absolute CRC parsing Avoid running sed on the whole "nm" output and also avoid "sed | awk" pipe in favor of a single awk call. Overall, this gives around 20% speedup on some quick synthetic tests: $ time sh -c 'find ./lib/modules/5.14.0-258.el9.x86_64 -name "*.ko.xz" | find-provides.ksyms.old > /dev/null 2> /dev/null' sh -c 14.20s user 8.93s system 144% cpu 16.014 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.x86_64 -name "*.ko.xz" | find-provides.ksyms.new > /dev/null 2> /dev/null' sh -c 12.01s user 7.46s system 143% cpu 13.567 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.x86_64 -name "*.ko.xz" -exec sh -c "echo {} | find-provides.ksyms.old" \; > /dev/null 2> /dev/null' sh -c 16.31s user 10.77s system 134% cpu 20.092 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.x86_64 -name "*.ko.xz" -exec sh -c "echo {} | find-provides.ksyms.new" \; > /dev/null 2> /dev/null' sh -c 13.95s user 8.92s system 135% cpu 16.836 total * find-provides.ksyms: Check presence of absolute __crc_* symbols with "grep -q" exit code and not presence of sed output; rewrite awk script to match the __crc_* symbols instead of preprocessing the nm output with sed. * find-requires.ksyms: Likewise. Signed-off-by: Eugene Syromiatnikov Resolves: #2135047 --- find-provides.ksyms | 10 ++++++---- find-requires.ksyms | 8 +++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 60ea837..22eb39b 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -34,10 +34,12 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do module="$tmpfile" fi - if [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then - nm $module \ - | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \ - | awk --non-decimal-data '{printf("'"${dep_pfx}"'(%s) = 0x%08x\n", $2, $1)}' \ + if nm "$module" | grep -qE '^([0-9a-f]+) A __crc_(.+)' 2> /dev/null; then + nm "$module" \ + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + --non-decimal-data \ + 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' \ | sort -u else ELFRODATA=$(readelf -R .rodata $module | awk '/0x/{printf $2$3$4$5}') diff --git a/find-requires.ksyms b/find-requires.ksyms index 105a458..c93d1d2 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -35,10 +35,12 @@ all_provides() { module="$tmpfile" fi - if [[ -n $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then + if nm "$module" | grep -qE '^([0-9a-f]+) A __crc_(.+)' 2> /dev/null; then nm "$module" \ - | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \ - | awk --non-decimal-data '{printf("%s:0x%08x\n", $2, $1)}' + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + --non-decimal-data \ + 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' else ELFRODATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}') if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then From 297a5b711ff23d805842ec7148484fcaf5d999a3 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Thu, 17 Feb 2022 04:41:45 +0100 Subject: [PATCH 05/53] find-provides.ksyms, find-requires.ksyms: work around printed __crc_* type change Commit binutils-2_33~1385[1] has changed (and binutils-2_35~1768[2] has not reverted) the calculated type for symbols in read-write .rodata section from 'R' to 'D' on architectures where CONFIG_MODULE_REL_CRCS is enabled (namely, ppc64* and s390*), since, apparently, many kernel modules have it indeed read-write. Work around it by matching both D and R as possible __crc_* symbol type. [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=a288c270991d [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=49d9fd42acef * find-provides.ksyms: Match D as possible __crc_* symbol type in addition to R. * find-requires.ksyms: Likewise. * kernel-srpm-macros.spec (Release): Bump to 11%{?dist}. (%changelog): Mention the change. Resolves: #2055464 Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 9 ++++++++- find-requires.ksyms | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 22eb39b..9402623 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -48,7 +48,14 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do else RODATA=$ELFRODATA fi - for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do + # Commit binutils-2_33~1385[1] has changed (and binutils-2_35~1768[2] + # has not reverted it) the calculated type for symbols in read-write + # .rodata section from 'R' to 'D', since, apparently, many kernel + # modules have it indeed read-write. + # + # [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=a288c270991d + # [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=49d9fd42acef + for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) [DR] __crc_(.+):0x\1 \2:p'); do echo $sym $RODATA done \ | awk --non-decimal-data '{printf("'"${dep_pfx}"'(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \ diff --git a/find-requires.ksyms b/find-requires.ksyms index c93d1d2..dafea97 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -48,7 +48,14 @@ all_provides() { else RODATA=$ELFRODATA fi - for sym in $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do + # Commit binutils-2_33~1385[1] has changed (and binutils-2_35~1768[2] + # has not reverted it) the calculated type for symbols in read-write + # .rodata section from 'R' to 'D', since, apparently, many kernel + # modules have it indeed read-write. + # + # [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=a288c270991d + # [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=49d9fd42acef + for sym in $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) [DR] __crc_(.+):0x\1 \2:p'); do echo $sym $RODATA done \ | awk --non-decimal-data '{printf("%s:0x%08s\n", $2, substr($3,($1*2)+1,8))}' From cd7e9e8a2fc2464fb67fd4d786ff6097a3941739 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Sun, 5 Feb 2023 01:26:01 +0100 Subject: [PATCH 06/53] find-provides.ksyms, find-requires.ksyms: rewrite indirect CRC parsing Linux commit v5.19-rc1~139^2~2 ("kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") has broken the assumption aobut the placement of non-absolute CRC symbols in .rodata (and also affects the architectures that used to have these symbols as absolute); rewrite the parsing by utilising "objdump -t" output to figure out the section(s) where the __crc_* symbols are stored and process it instead of the hard-coded ".rodata" section. The change also speeds up the processing a bit, around 33% on synthetic tests: $ time sh -c 'find ./lib/modules/5.14.0-258.el9.ppc64le -name "*.ko.xz" | find-provides.ksyms.old > /dev/null 2> /dev/null' sh -c 10.36s user 5.58s system 137% cpu 11.613 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.ppc64le -name "*.ko.xz" | find-provides.ksyms.new > /dev/null 2> /dev/null' sh -c 7.82s user 4.59s system 142% cpu 8.686 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.ppc64le -name "*.ko.xz" -exec sh -c "echo {} | find-provides.ksyms.old" \; > /dev/null 2> /dev/null' sh -c 11.85s user 6.76s system 129% cpu 14.318 total $ time sh -c 'find ./lib/modules/5.14.0-258.el9.ppc64le -name "*.ko.xz" -exec sh -c "echo {} | find-provides.ksyms.new" \; > /dev/null 2> /dev/null' sh -c 8.91s user 5.51s system 135% cpu 10.647 total * find-provides.ksyms: Process "objdump -t" output to get the list of sections where __crc_* symbol contents are placed; retrieve each one with "readelf -R" and supply it to an awk script that cuts the required part of it for each __crc_* symbol in that section. * find-requires.ksyms (all_provides): Likewise. Signed-off-by: Eugene Syromiatnikov Resolves: #2135047 --- find-provides.ksyms | 35 +++++++++++++++++++---------------- find-requires.ksyms | 37 ++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 9402623..aa656e1 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -42,23 +42,26 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' \ | sort -u else - ELFRODATA=$(readelf -R .rodata $module | awk '/0x/{printf $2$3$4$5}') - if [[ -n $(readelf -h $module | grep "little endian") ]]; then - RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') - else - RODATA=$ELFRODATA - fi - # Commit binutils-2_33~1385[1] has changed (and binutils-2_35~1768[2] - # has not reverted it) the calculated type for symbols in read-write - # .rodata section from 'R' to 'D', since, apparently, many kernel - # modules have it indeed read-write. - # - # [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=a288c270991d - # [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=49d9fd42acef - for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) [DR] __crc_(.+):0x\1 \2:p'); do - echo $sym $RODATA + objdump -t "$module" \ + | sed -n 's/^[0-9a-f][0-9a-f]* g...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ + | sort -u \ + | while read sectname; do + [ -n "$sectname" ] || continue + + ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') + if [[ -n $(readelf -h $module | grep "little endian") ]]; then + SECTDATA=$(echo $ELFSECTDATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') + else + SECTDATA=$ELFSECTDATA + fi + + objdump -t "$module" \ + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + -v 'sectdata='"$SECTDATA" \ + --non-decimal-data \ + 'match($0, /^([0-9a-f]+) g...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done \ - | awk --non-decimal-data '{printf("'"${dep_pfx}"'(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \ | sort -u fi diff --git a/find-requires.ksyms b/find-requires.ksyms index dafea97..6e176a4 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -42,23 +42,26 @@ all_provides() { --non-decimal-data \ 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' else - ELFRODATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}') - if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then - RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') - else - RODATA=$ELFRODATA - fi - # Commit binutils-2_33~1385[1] has changed (and binutils-2_35~1768[2] - # has not reverted it) the calculated type for symbols in read-write - # .rodata section from 'R' to 'D', since, apparently, many kernel - # modules have it indeed read-write. - # - # [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=a288c270991d - # [2] https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=49d9fd42acef - for sym in $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) [DR] __crc_(.+):0x\1 \2:p'); do - echo $sym $RODATA - done \ - | awk --non-decimal-data '{printf("%s:0x%08s\n", $2, substr($3,($1*2)+1,8))}' + objdump -t "$module" \ + | sed -n 's/^[0-9a-f][0-9a-f]* g...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ + | sort -u \ + | while read sectname; do + [ -n "$sectname" ] || continue + + ELFSECTDATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}') + if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then + SECTDATA=$(echo $ELFSECTDATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') + else + SECTDATA=$ELFSECTDATA + fi + + objdump -t "$module" \ + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + -v 'sectdata='"$SECTDATA" \ + --non-decimal-data \ + 'match($0, /^([0-9a-f]+) g...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + done fi [ -z "$tmpfile" ] || rm -f -- "$tmpfile" From 90757faf53962e416abdd4073931fb6e70c0859e Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Sun, 5 Feb 2023 01:26:32 +0100 Subject: [PATCH 07/53] kernel-srpm-macros.spec: update Requires: for binaries used in scripts Add "Requies:" tags for binearies used in various scripts, namely brp-kmod-compress, brp-kmod-set-exec-bit, find-provides.ksyms, find-requires.ksyms, and kmodtool. * kernel-srpm-macros.spec (%package -n kernel-rpm-macros) : Add %{_bindir}/xz, %{_bindir}/find, %{_bindir}/sed, %{_bindir}/awk, %{_bindir}/grep, %{_bindir}/nm, %{_bindir}/objdump, %{_bindir}/readelf, %{_sbindir}/modinfo, %{_sbindir}/modprobe. Signed-off-by: Eugene Syromiatnikov Resolves: #2135047 --- kernel-srpm-macros.spec | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index a3ad983..dcc16e8 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -58,8 +58,21 @@ Version: 205 Summary: Macros and scripts for building kernel module packages Requires: redhat-rpm-config >= 205 -# for brp-kmod-set-exec-bit +# for brp-kmod-compress +Requires: %{_bindir}/xz +# for brp-kmod-compress, brp-kmod-set-exec-bit Requires: %{_bindir}/find +# for find-provides.ksyms, find-requires.ksyms, kmodtool +Requires: %{_bindir}/sed +# for find-provides.ksyms, find-requires.ksyms +Requires: %{_bindir}/awk +Requires: %{_bindir}/grep +Requires: %{_bindir}/nm +Requires: %{_bindir}/objdump +Requires: %{_bindir}/readelf +# for find-requires.ksyms +Requires: %{_sbindir}/modinfo +Requires: %{_sbindir}/modprobe %description -n kernel-rpm-macros Macros and scripts for building kernel module packages. From 891b09a0283d6ad8918a6beae92278db8c92b9b6 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Wed, 8 Feb 2023 18:11:55 +0100 Subject: [PATCH 08/53] kernel-srpm-macros.spec: bump RPM release * kernel-srpm-macros.spec (Release): Bump to 17. (%changelog): Add a record. Signed-off-by: Eugene Syromiatnikov --- kernel-srpm-macros.spec | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index dcc16e8..bee42c7 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 16%{?dist} +Release: 17%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -134,6 +134,11 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Tue Jan 31 2023 Eugene Syromiatnikov - 1.0-17 +- Support storing of __crc_* symbols in sections other than .rodata. +- Work around a change in type of __crc_* symbols for some kmods printed by nm + on ppc64le and s390x. + * Thu Jan 19 2023 Fedora Release Engineering - 1.0-16 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild From 9e9dc09cdaaa0125cf68b87b0f15a85ea06d2f71 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Thu, 30 Mar 2023 15:01:59 +0200 Subject: [PATCH 09/53] find-provides.ksyms, find-requires.ksyms: avoid awaking debuginfod Starting with RHEL 9.2 and Fedora 35, debuginfod is enabled by default, which leads to significant startup times of various tools from the elfutils package (namely, readelf and objdump). Unset DEBUGINFOD_URLS to avoid it. * find-provides.ksyms (DEBUGINFOD_URLS): Unset. * find-requires.ksyms (DEBUGINFOD_URLS): Ditto. * kernel-srpm-macros.spec (Release): Bump to 18. (%changelog): Add a record. Suggested-by: Panu Matilainen Co-Authored-by: Denys Vlasenko Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 4 ++++ find-requires.ksyms | 4 ++++ kernel-srpm-macros.spec | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index aa656e1..ccad20b 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -3,6 +3,10 @@ IFS=$'\n' export LC_ALL=C +# Prevent elfutils from trying to download debuginfos +unset DEBUGINFOD_URLS + + for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do dep_pfx="ksym" # For built-in kmods, "kernel()" syntax is used instead of "ksym()" diff --git a/find-requires.ksyms b/find-requires.ksyms index 6e176a4..e22e910 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -7,6 +7,10 @@ IFS=$'\n' +# Prevent elfutils from trying to download debuginfos +unset DEBUGINFOD_URLS + + # Extract all of the symbols provided by this module. all_provides() { for module in "$@"; do diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index bee42c7..b420b97 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 17%{?dist} +Release: 18%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -134,6 +134,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Tue Mar 30 2023 Eugene Syromiatnikov - 1.0-18 +- Avoid triggering debuginfod during elfutils tools usage. + * Tue Jan 31 2023 Eugene Syromiatnikov - 1.0-17 - Support storing of __crc_* symbols in sections other than .rodata. - Work around a change in type of __crc_* symbols for some kmods printed by nm From 05ce41491c02b2cf1b582f97f3a0cd3ce8fe43e5 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 26 Apr 2023 09:33:20 +0200 Subject: [PATCH 10/53] test commit Signed-off-by: Denys Vlasenko --- find-provides.ksyms | 1 - find-requires.ksyms | 1 - 2 files changed, 2 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index ccad20b..b01f057 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -6,7 +6,6 @@ export LC_ALL=C # Prevent elfutils from trying to download debuginfos unset DEBUGINFOD_URLS - for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do dep_pfx="ksym" # For built-in kmods, "kernel()" syntax is used instead of "ksym()" diff --git a/find-requires.ksyms b/find-requires.ksyms index e22e910..1890db5 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -10,7 +10,6 @@ IFS=$'\n' # Prevent elfutils from trying to download debuginfos unset DEBUGINFOD_URLS - # Extract all of the symbols provided by this module. all_provides() { for module in "$@"; do From 0c3204371923b3d2690a39acdf7536f43798171f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 28 Apr 2023 15:56:49 +0200 Subject: [PATCH 11/53] README.md: add notes to understand what is done by which file Signed-off-by: Denys Vlasenko --- README.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f8faece..ac54f6e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,75 @@ # kernel-srpm-macros -The kernel-srpm-macros package \ No newline at end of file +The kernel-srpm-macros package + +This source package results in two "binary" packages, kernel-rpm-macros +and kernel-srpm-macros. The role and locations of files is as follows: + +kernel-srpm-macros: + +/usr/lib/rpm/fileattrs/kmod.attr + For /lib/modules/XYZ/modules.builtin and .../MODULE.ko.XYZ + specifies a Lua script to generate kmod(MODULE.ko) + "Provides:" deps +/usr/lib/rpm/macros.d/macros.kernel-srpm + ? + +kernel-rpm-macros: + +/usr/lib/rpm/redhat/brp-kmod-restore-perms + ? +/usr/lib/rpm/redhat/brp-kmod-set-exec-bit + ? + +/usr/lib/rpm/redhat/find-provides.ksyms + Runs from rpmbuild at the end of kernel builds and 3rd party module + builds, to extract + kernel(SYMBOL)=0xHASH "Provides:" deps from modules in kernel packages, + and ksym(SYMBOL)=0xHASH for 3rd party modules. + Takes input list of files on stdin. +/usr/lib/rpm/fileattrs/provided_ksyms.attr + For newer rpmbuild with "internal dependency generators", + this file specifies that find-provides.ksyms should be run + only on .ko.XYZ files + (with "external dependency generators", the script needs to + filter out the files by itself). + +/usr/lib/rpm/redhat/find-requires.ksyms + ? +/usr/lib/rpm/fileattrs/required_ksyms.attr + For newer rpmbuild with "internal dependency generators", + this file specifies that find-requires.ksyms should be run + only on .ko.XYZ files, and not for /lib/modules/XYZ/kernel/* + (IOW: only for building 3rd-party modules) + +/usr/lib/rpm/redhat/find-provides.d/modalias.prov + Runs from rpmbuild at the end of kernel builds and 3rd party module + builds, to extract + modalias(pci:SOMETHING)=OPTIONALLY_VERSION "Provides:" deps from modules + in kernel and 3rd party modules packages. + Takes input list of files on stdin. +/usr/lib/rpm/fileattrs/modalias.attr + For newer rpmbuild with "internal dependency generators", + this file specifies that modalias.prov should be run + only on .ko.XYZ files + +/usr/lib/rpm/redhat/find-provides.d/firmware.prov + ? + +/usr/lib/rpm/kabi.sh + Runs from rpmbuild at the end of kernel build to extract + kernel(SYMBOL)=0xHASH "Provides:" deps. +/usr/lib/rpm/fileattrs/kabi.attr + For newer rpmbuild with "internal dependency generators", + this file specifies that kabi.sh should be run on + /boot/symvers-* and /lib/modules/XYZ/symvers).gz + +/usr/lib/rpm/macros.d/macros.kmp + ? + +/usr/lib/rpm/redhat/kmodtool + ? +/usr/lib/rpm/redhat/rpmsort + ? +/usr/lib/rpm/redhat/symset-table + ? From 9d75b962fc05922d3085a8b4834b452a7640e7a2 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 3 May 2023 11:30:18 +0200 Subject: [PATCH 12/53] modalias.prov: fix spurious exitcode of 1 on reaching EOF Signed-off-by: Denys Vlasenko --- modalias.prov | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 modalias.prov diff --git a/modalias.prov b/modalias.prov old mode 100644 new mode 100755 index 6408a6e..edce340 --- a/modalias.prov +++ b/modalias.prov @@ -42,7 +42,11 @@ print_modaliases() { combine_modaliases() { declare tag class variants="" pos="" n - read class + + # Due to set -e, we can exit with exitcode 1 on read EOF + # and this makes our caller think we failed. "|| return 0" prevents this: + read class || return 0 + while read tag; do for ((n=0; n<${#class}; n++)); do if [ "*" != "${class:n:1}" -a \ From 491a3411df6161e040e8881695ea7743d6255106 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 4 May 2023 12:37:36 +0200 Subject: [PATCH 13/53] kmod.attr: fix "%g+.ko" pattern (erroneously matches "anythingko") to "%g+%.ko" Signed-off-by: Denys Vlasenko --- kmod.attr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmod.attr b/kmod.attr index 23b1289..a164afa 100644 --- a/kmod.attr +++ b/kmod.attr @@ -20,7 +20,7 @@ end end else - local mod = string.match(bn, "%g+.ko") + local mod = string.match(bn, "%g+%.ko") if mod then printdep(mod) if strip_compress_sfx(mod) ~= mod then From 5df3d6d58b2cc2bfb97628e4fc12bfc8cb90ef25 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 4 May 2023 12:43:01 +0200 Subject: [PATCH 14/53] kmod.attr: optimization: do not call strip_compress_sfx() twice Signed-off-by: Denys Vlasenko --- kmod.attr | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kmod.attr b/kmod.attr index a164afa..c02e38a 100644 --- a/kmod.attr +++ b/kmod.attr @@ -15,16 +15,18 @@ for l in io.lines(fn) do local builtin_mod = basename(l) printdep(builtin_mod) - if strip_compress_sfx(builtin_mod) ~= builtin_mod then - printdep(strip_compress_sfx(builtin_mod)) + local nocompr = strip_compress_sfx(builtin_mod) + if nocompr ~= builtin_mod then + printdep(nocompr) end end else local mod = string.match(bn, "%g+%.ko") if mod then printdep(mod) - if strip_compress_sfx(mod) ~= mod then - printdep(strip_compress_sfx(mod)) + local nocompr = strip_compress_sfx(mod) + if nocompr ~= mod then + printdep(nocompr) end end end From e9cc0440fd5c1195debeb626ed987751ea51863b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 4 May 2023 12:45:22 +0200 Subject: [PATCH 15/53] kmod.attr: fix string.gsub patterns and return values basename(): return one value, not two (principle of least confusion). strip_compress_sfx(): ditto strip_compress_sfx(): fix it, it had several problems: (a) incorrect escaping of . (period) ... masked by incorrect use of backslash (b) lua has no | "or" pattern Use simpler gsub patterns / replacements, presumably faster (did not measure). Signed-off-by: Denys Vlasenko --- kmod.attr | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/kmod.attr b/kmod.attr index c02e38a..b009d5a 100644 --- a/kmod.attr +++ b/kmod.attr @@ -1,10 +1,31 @@ %__kmod_path ^/lib/modules/.*/(modules.builtin|.*\.ko|.*\.ko\.gz|.*\.ko\.bz2|.*\.ko\.xz|.*\.ko\.zst)$ + +# Notes on Lua: +# The backslash in strings (like "\n" newline) needs to be doubled +# because we are inside rpm macro. Single backslashes before most chars +# disappear (removed by rpm's parser), so "\n" turns into just "n". +# In string.gsub patterns, unlike regexps, backslash has no special meaning. +# It can't escape . and such. (Use one-character set [.] to represent +# literal period, or lua's percent escape: %.) +# Pipe (|) has no special meaning too. + %__kmod_provides() %{lua: function basename(fn) - return string.gsub(fn, "(.*/)(.*)", "%2") + local b = string.gsub(fn, ".*/", "") + -- the above adjusts gsub() result to 1 value + -- "return f()" construct would return _all_ values, two in case of gsub() + return b end function strip_compress_sfx(fn) - return string.gsub(fn, "(.*)(\.gz|\.bz2|\.xz|\.zst)?$", "%1") + local cnt + fn, cnt = string.gsub(fn, "%.gz$", "") + if cnt == 1 then return fn; end + fn, cnt = string.gsub(fn, "%.bz2$", "") + if cnt == 1 then return fn; end + fn, cnt = string.gsub(fn, "%.xz$", "") + if cnt == 1 then return fn; end + fn, cnt = string.gsub(fn, "%.zst$", "") + return fn end function printdep(mod) print("kmod("..mod..") ") From 0c336570df1bf6639036fcdbaa125c9287ef1f9a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 4 May 2023 12:55:15 +0200 Subject: [PATCH 16/53] kmod.attr: cosmetic fixes: %{1} to %1, indentation fix Signed-off-by: Denys Vlasenko --- kmod.attr | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kmod.attr b/kmod.attr index b009d5a..8c57d0b 100644 --- a/kmod.attr +++ b/kmod.attr @@ -30,7 +30,7 @@ function printdep(mod) print("kmod("..mod..") ") end - local fn = rpm.expand("%{1}") + local fn = rpm.expand("%1") local bn = basename(fn) if bn == "modules.builtin" then for l in io.lines(fn) do @@ -44,11 +44,11 @@ else local mod = string.match(bn, "%g+%.ko") if mod then - printdep(mod) - local nocompr = strip_compress_sfx(mod) - if nocompr ~= mod then - printdep(nocompr) - end + printdep(mod) + local nocompr = strip_compress_sfx(mod) + if nocompr ~= mod then + printdep(nocompr) + end end end } From 6a6920aed23a08f9021bac82d330d133aa106c92 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 5 May 2023 17:34:05 +0200 Subject: [PATCH 17/53] modalias.prov: use "command" rather than "which" to check existence of commands Signed-off-by: Denys Vlasenko --- modalias.prov | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modalias.prov b/modalias.prov index edce340..4665f9f 100755 --- a/modalias.prov +++ b/modalias.prov @@ -26,10 +26,12 @@ if ! [ -z "$is_kernel_package" ]; then exit 0 fi -# Check for presence of the commands used -which /sbin/modinfo >/dev/null || exit 0 -which sed >/dev/null || exit 0 -which sort >/dev/null || exit 0 +# Check for presence of the commands used. +# "command" is a builtin, faster to use than fork+execing "which" - see +# https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html +command -v /sbin/modinfo >/dev/null || exit 1 +command -v sed >/dev/null || exit 1 +command -v sort >/dev/null || exit 1 print_modaliases() { declare class=$1 variants=$2 pos=$3 From 510e0c82612cc8c9e31d8a071edcb1e724a1fc01 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 5 May 2023 17:35:42 +0200 Subject: [PATCH 18/53] modalias.prov: make sort locale-independent with LC_ALL=C Signed-off-by: Denys Vlasenko --- modalias.prov | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modalias.prov b/modalias.prov index 4665f9f..96bfc64 100755 --- a/modalias.prov +++ b/modalias.prov @@ -80,5 +80,5 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do /sbin/modinfo -F alias "$module" \ | sed -nre "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,p" done \ -| sort -u \ +| LC_ALL=C sort -u \ | combine_modaliases From 653ec7d08672a4719adb14cc287ddc4675255ddd Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 5 May 2023 17:40:03 +0200 Subject: [PATCH 19/53] modalias.prov: use "local" builtin rather than "declare" While (in this case) their effect is the same, many more people know that "local" makes variables function-local, than that "declare" in bash does the same. I didn't know. Signed-off-by: Denys Vlasenko --- modalias.prov | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modalias.prov b/modalias.prov index 96bfc64..8b3332b 100755 --- a/modalias.prov +++ b/modalias.prov @@ -34,7 +34,7 @@ command -v sed >/dev/null || exit 1 command -v sort >/dev/null || exit 1 print_modaliases() { - declare class=$1 variants=$2 pos=$3 + local class="$1" variants="$2" pos="$3" if [ -n "$variants" ]; then echo "${class:0:pos}[$variants]${class:pos+1}" else @@ -43,7 +43,7 @@ print_modaliases() { } combine_modaliases() { - declare tag class variants="" pos="" n + local tag class variants="" pos="" n # Due to set -e, we can exit with exitcode 1 on read EOF # and this makes our caller think we failed. "|| return 0" prevents this: From c2b1f3e458c3340a63bb5df9004541898d47b741 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 5 May 2023 18:12:36 +0200 Subject: [PATCH 20/53] modalias.prov: avoid a subshell (fork) in position check This creates a subshell: ... && ( [ -z "$pos" ] || [ $n = $pos ] ) For example, processing ath9k.ko needed ~80 forks here. Rather expensive. This should do the same: ... && [ -z "$pos" -o "$n" = "$pos" ] While at it, explain algorithm in comments. Signed-off-by: Denys Vlasenko --- modalias.prov | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modalias.prov b/modalias.prov index 8b3332b..9ee34c2 100755 --- a/modalias.prov +++ b/modalias.prov @@ -42,6 +42,14 @@ print_modaliases() { fi } +# Try to make "provides" list a bit smaller: +# find "mergeable" strings a-la +# modalias(pci:v0000168Cd00000023sv*sd*bc*sc*i*) +# modalias(pci:v0000168Cd00000024sv*sd*bc*sc*i*) +# modalias(pci:v0000168Cd00000027sv*sd*bc*sc*i*) +# modalias(pci:v0000168Cd00000029sv*sd*bc*sc*i*) +# replace with +# modalias(pci:v0000168Cd0000002[3479]sv*sd*bc*sc*i*) combine_modaliases() { local tag class variants="" pos="" n @@ -49,24 +57,32 @@ combine_modaliases() { # and this makes our caller think we failed. "|| return 0" prevents this: read class || return 0 + # For each line after the first... while read tag; do + # For each char in prev line... for ((n=0; n<${#class}; n++)); do + # If aaaNbbb = aaaMbbb and N isn't "*" + # and N's position is the same as last time... if [ "*" != "${class:n:1}" -a \ "${class:0:n}" = "${tag:0:n}" -a \ "${class:n+1}" = "${tag:n+1}" ] && - ( [ -z "$pos" ] || [ $n = $pos ] ); then + [ -z "$pos" -o "$n" = "$pos" ]; then + # Add M (and maybe N) to $variants, go to next line variants="${variants:-${class:n:1}}${tag:n:1}" pos=$n break fi done if [ $n -eq ${#class} ]; then + # This line is not mergeable, print collected merged line + # and reset the state print_modaliases "$class" "$variants" "$pos" variants= pos= class=$tag fi done + # Print last collected merged line print_modaliases "$class" "$variants" "$pos" } From 7cd7d838cf57f184fd58c05e30588fb1a2fcf6b2 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 7 May 2023 17:29:18 +0200 Subject: [PATCH 21/53] modalias.prov: group modalias lines by length On my machine, out of 2604 modules, this reduces number of "provides" items by ~800 (to 12689 items). Signed-off-by: Denys Vlasenko --- modalias.prov | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modalias.prov b/modalias.prov index 9ee34c2..f362fd3 100755 --- a/modalias.prov +++ b/modalias.prov @@ -51,14 +51,14 @@ print_modaliases() { # replace with # modalias(pci:v0000168Cd0000002[3479]sv*sd*bc*sc*i*) combine_modaliases() { - local tag class variants="" pos="" n + local unused_len tag class variants="" pos="" n # Due to set -e, we can exit with exitcode 1 on read EOF # and this makes our caller think we failed. "|| return 0" prevents this: - read class || return 0 + IFS=' ' read unused_len class || return 0 # For each line after the first... - while read tag; do + while IFS=' ' read unused_len tag; do # For each char in prev line... for ((n=0; n<${#class}; n++)); do # If aaaNbbb = aaaMbbb and N isn't "*" @@ -95,6 +95,11 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do /sbin/modinfo -F alias "$module" \ | sed -nre "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,p" + + # Below: combining code can only possibly combine lines of equal length. + # Prepend line lengths before sort, so that same-length lines end up next + # to each other. (The lengths are discarded by combine_modaliases). done \ +| { while read line; do echo "${#line} $line"; done } \ | LC_ALL=C sort -u \ | combine_modaliases From c39c0162a0a7a8efd6568814be87332cbbd2ad92 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 7 May 2023 17:36:00 +0200 Subject: [PATCH 22/53] tests: add tests for modalias.prov Signed-off-by: Denys Vlasenko --- tests/modalias.prov.collect | 31 ++++++++++++++++++++ tests/modalias.prov.runtest | 42 ++++++++++++++++++++++++++++ tests/modalias.prov.testdata.tar.xz | Bin 0 -> 216172 bytes 3 files changed, 73 insertions(+) create mode 100755 tests/modalias.prov.collect create mode 100755 tests/modalias.prov.runtest create mode 100644 tests/modalias.prov.testdata.tar.xz diff --git a/tests/modalias.prov.collect b/tests/modalias.prov.collect new file mode 100755 index 0000000..deaeaf7 --- /dev/null +++ b/tests/modalias.prov.collect @@ -0,0 +1,31 @@ +#! /bin/bash -efu + +# This fetches test data from current system's /lib/modules +# to /tmp/COLLECT + +IFS=$'\n' + +find /lib/modules | grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$' \ +| while IFS='' read -r module; do + modver=$(/sbin/modinfo -F version "$module") + # delete possible extra lines because some modules have *two* version tags. *cough*b44*cough* + modver=${modver%%$'\n'*} # using $'' bashism, avoid running "head -n1" process + # replace any strange chars with underscores. + # [!...] is glob's "match any char not in set" pattern + # (although bash supports [^...] too, it is not standard) + modver=${modver//[!0-9a-zA-Z._]/_} + # only add version tag if it has a version + [ -z "$modver" ] || modver=" = $modver" + + d="/tmp/COLLECT$module" + d="${d%/*}" + mkdir -p "$d" + + out=`/sbin/modinfo -F alias "$module" \ + | sed -E "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,"` + + [ "$out" ] || continue + + echo "/tmp/COLLECT$module.modalias$modver" >&2 + printf '%s\n' "$out" >"/tmp/COLLECT$module.modalias" +done diff --git a/tests/modalias.prov.runtest b/tests/modalias.prov.runtest new file mode 100755 index 0000000..2fbc655 --- /dev/null +++ b/tests/modalias.prov.runtest @@ -0,0 +1,42 @@ +#!/bin/sh + +function die() +{ + printf '%s\n' "$*" >&2 + exit 1 +} + +set -e + +cd modalias.prov.testdata +test -x ../../modalias.prov || die "No ../../modalias.prov" + +# Copy and add -t option to modalias.prov +cp ../../modalias.prov modalias.prov +patch -p1 <<"EOF" +--- a/modalias.prov ++++ b/modalias.prov +@@ -86,6 +86,17 @@ combine_modaliases() { + print_modaliases "$class" "$variants" "$pos" + } + ++if [ "$#" = 2 ] && [ "$1" = "-t" ]; then ++ cat -- "$2" \ ++ | { while read line; do echo "${#line} $line"; done } \ ++ | LC_ALL=C sort -u \ ++ | combine_modaliases \ ++ >"$2.test" ++ echo "Comparing results for $2" ++ diff -u "$2.right" "$2.test" && rm -- "$2.test" ++ exit ++fi ++ + for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do + # | head -n1 because some modules have *two* version tags. *cough*b44*cough* + modver=$(/sbin/modinfo -F version "$module"| head -n1) +EOF + +find | grep '\.ko.*\.modalias$' | xargs -n1 ./modalias.prov -t + +# Rename newly generated .test as .right +#find | grep '\.ko.*\.modalias$' | xargs -I'{}' mv '{}'.test '{}'.right diff --git a/tests/modalias.prov.testdata.tar.xz b/tests/modalias.prov.testdata.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..790d08ef9fafdaa58dcdf4dfa31703a77e52b318 GIT binary patch literal 216172 zcmV+aKLEh}H+ooF000E$*0e?f03iVu0001VFXf~E|CZ)cT>v(l$glmEXk(Ei#!L~h z@WL_1O92(KwU2cZN?6J`mn<6RLm3)nE7TR}6BC>qQZUr>hqqrc?WprOeSXc%h>&1m z0hdF<=6>w$bxSzW=C={dG&HmhO(_qiH}(C(8m`XKmzx>(_}mDLSuC)34SJ5|^^l** zG|T%p%hRFvrHn$jc`!He%IwG-q+2yn{(Rel8#HRTaq%(A&=mwFU3>L_0Sok@kXt*p zj;{_DcNa=1j8;=g(Ct4aiatzg%yD%v(191X#KO-Zd5VU4w!F5`@uVoKKlcUS7Tq(h zC9@+#9ikV2a3YT$ z_a%F99aODiN78~Vlcg%TaSVP#fmz}=#z(mJLbYGVtld-a9eoVOS{%Bu z?s64@slDW`>P)u_-A?#OYW8*ETE=y1=$gh9emrbYJD`⪻EwpRp*jCS_UQ`?eCzd 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 literal 0 HcmV?d00001 From 35e1f2fc7324fd7d656f55395f87646b1f558105 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 7 May 2023 17:43:27 +0200 Subject: [PATCH 23/53] modalias.prov: speed up, explain and make more correct combining code The time to run on tests/* data decreased from 34.517s to 30.201s. Do not allow combining of any glob meta characters, either in first or second line. The code is still buggy, it may attempt to combine modalias(abc[def]123) modalias(abc[dXf]123) into modalias(abc[d[eX]f]123) (presumably there won't be any such cases in real modules, but still). Eliminate "| head -n1" - do it with bash string ops. Signed-off-by: Denys Vlasenko --- modalias.prov | 60 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/modalias.prov b/modalias.prov index f362fd3..525e1df 100755 --- a/modalias.prov +++ b/modalias.prov @@ -51,7 +51,7 @@ print_modaliases() { # replace with # modalias(pci:v0000168Cd0000002[3479]sv*sd*bc*sc*i*) combine_modaliases() { - local unused_len tag class variants="" pos="" n + local unused_len tag class variants="" pos="" n end xc # Due to set -e, we can exit with exitcode 1 on read EOF # and this makes our caller think we failed. "|| return 0" prevents this: @@ -59,26 +59,44 @@ combine_modaliases() { # For each line after the first... while IFS=' ' read unused_len tag; do - # For each char in prev line... - for ((n=0; n<${#class}; n++)); do - # If aaaNbbb = aaaMbbb and N isn't "*" - # and N's position is the same as last time... - if [ "*" != "${class:n:1}" -a \ - "${class:0:n}" = "${tag:0:n}" -a \ - "${class:n+1}" = "${tag:n+1}" ] && - [ -z "$pos" -o "$n" = "$pos" ]; then - # Add M (and maybe N) to $variants, go to next line - variants="${variants:-${class:n:1}}${tag:n:1}" - pos=$n + if [ -z "$pos" ]; then + # 2nd line: after "modalias(" prefix, for each char in prev line... + n=9 + end=${#class} + else + # 3rd+ lines: only check the char at the same position + n=$pos + end=$((pos + 1)) + fi + # Search for aaaNbbb,aaaMbbb line pair, where N and M chars differ. + # sort -u guarantees there are no identical line pairs. + # We assume that lines will not differ only in " = version" suffix. + for ((; n < $end; n++)); do + if [ "${class:0:n}" != "${tag:0:n}" ]; then + # the prefixes already aren't the same: break + n=$end break fi + # If suffixes differ, go to next char + [ x"${class:n+1}" != x"${tag:n+1}" ] && continue + # aaaNbbb = aaaMbbb. If N and M aren't special... + xc=x"${class:n:1}" + [ x"[" = "$xc" -o x"]" = "$xc" ] && continue + [ x"?" = "$xc" -o x"*" = "$xc" ] && continue + xc=x"${tag:n:1}" + [ x"[" = "$xc" -o x"]" = "$xc" ] && continue + [ x"?" = "$xc" -o x"*" = "$xc" ] && continue + # Add M (and maybe N) to $variants, go to next line + variants="${variants:-${class:n:1}}${tag:n:1}" + pos=$n + break done - if [ $n -eq ${#class} ]; then - # This line is not mergeable, print collected merged line - # and reset the state + if [ $n -eq $end ]; then + # This line is not mergeable with the previous one(s), + # print collected merged line and reset the state print_modaliases "$class" "$variants" "$pos" - variants= - pos= + variants="" + pos="" class=$tag fi done @@ -87,10 +105,12 @@ combine_modaliases() { } for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do - # | head -n1 because some modules have *two* version tags. *cough*b44*cough* - modver=$(/sbin/modinfo -F version "$module"| head -n1) + modver=$(/sbin/modinfo -F version "$module") + # delete possible extra lines because some modules have *two* version tags. *cough*b44*cough* + modver=${modver%%$'\n'*} # using $'' bashism, avoid running "head -n1" process + # replace any strange chars with underscores. modver=${modver//[^0-9a-zA-Z._]/_} - # only add version tag if it has a version + # only add version tag if it indeed has a version [ -z "$modver" ] || modver=" = $modver" /sbin/modinfo -F alias "$module" \ From 5683c5027004a11b603318d13f57e7895e20464d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 7 May 2023 17:52:19 +0200 Subject: [PATCH 24/53] modalias.prov: use standard "match any char not in set" glob pattern, and sed -E option [^set] is not correct in glob (it's regexp construct). [!set] is. sed: -n is not necessary. -e too. manpage recommends using -E instead of -r. Signed-off-by: Denys Vlasenko --- modalias.prov | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modalias.prov b/modalias.prov index 525e1df..2af9239 100755 --- a/modalias.prov +++ b/modalias.prov @@ -109,12 +109,14 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do # delete possible extra lines because some modules have *two* version tags. *cough*b44*cough* modver=${modver%%$'\n'*} # using $'' bashism, avoid running "head -n1" process # replace any strange chars with underscores. - modver=${modver//[^0-9a-zA-Z._]/_} + # [!...] is glob's "match any char not in set" pattern + # (although bash supports [^...] too, it is not standard) + modver=${modver//[!0-9a-zA-Z._]/_} # only add version tag if it indeed has a version [ -z "$modver" ] || modver=" = $modver" /sbin/modinfo -F alias "$module" \ - | sed -nre "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,p" + | sed -E "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver," # Below: combining code can only possibly combine lines of equal length. # Prepend line lengths before sort, so that same-length lines end up next From f46d3e85222d2080f5e3b721cab40b690e083dd2 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 8 May 2023 11:11:40 +0200 Subject: [PATCH 25/53] modalias.prov: rename "class" and "tag" variables to "prev" and "next" The old names are misleading. Signed-off-by: Denys Vlasenko --- modalias.prov | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/modalias.prov b/modalias.prov index 2af9239..7707991 100755 --- a/modalias.prov +++ b/modalias.prov @@ -51,18 +51,19 @@ print_modaliases() { # replace with # modalias(pci:v0000168Cd0000002[3479]sv*sd*bc*sc*i*) combine_modaliases() { - local unused_len tag class variants="" pos="" n end xc + local unused_len next prev variants="" pos="" n end xc # Due to set -e, we can exit with exitcode 1 on read EOF # and this makes our caller think we failed. "|| return 0" prevents this: - IFS=' ' read unused_len class || return 0 + IFS=' ' read unused_len prev || return 0 # For each line after the first... - while IFS=' ' read unused_len tag; do + while IFS=' ' read unused_len next; do if [ -z "$pos" ]; then # 2nd line: after "modalias(" prefix, for each char in prev line... n=9 - end=${#class} + end=${#prev} + # TODO speedup? if [ $end != ${#next} ]; then line is not mergeable else # 3rd+ lines: only check the char at the same position n=$pos @@ -72,36 +73,36 @@ combine_modaliases() { # sort -u guarantees there are no identical line pairs. # We assume that lines will not differ only in " = version" suffix. for ((; n < $end; n++)); do - if [ "${class:0:n}" != "${tag:0:n}" ]; then + if [ "${prev:0:n}" != "${next:0:n}" ]; then # the prefixes already aren't the same: break n=$end break fi # If suffixes differ, go to next char - [ x"${class:n+1}" != x"${tag:n+1}" ] && continue - # aaaNbbb = aaaMbbb. If N and M aren't special... - xc=x"${class:n:1}" + [ x"${prev:n+1}" != x"${next:n+1}" ] && continue + # Found aaaNbbb,aaaMbbb. If N and M aren't special... + xc=x"${prev:n:1}" [ x"[" = "$xc" -o x"]" = "$xc" ] && continue [ x"?" = "$xc" -o x"*" = "$xc" ] && continue - xc=x"${tag:n:1}" + xc=x"${next:n:1}" [ x"[" = "$xc" -o x"]" = "$xc" ] && continue [ x"?" = "$xc" -o x"*" = "$xc" ] && continue # Add M (and maybe N) to $variants, go to next line - variants="${variants:-${class:n:1}}${tag:n:1}" + variants="${variants:-${prev:n:1}}${next:n:1}" pos=$n break done if [ $n -eq $end ]; then # This line is not mergeable with the previous one(s), # print collected merged line and reset the state - print_modaliases "$class" "$variants" "$pos" + print_modaliases "$prev" "$variants" "$pos" variants="" pos="" - class=$tag + prev=$next fi done # Print last collected merged line - print_modaliases "$class" "$variants" "$pos" + print_modaliases "$prev" "$variants" "$pos" } for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do From efa36b601afd52ac3c18309f9b41a4945384cae8 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 8 May 2023 11:28:24 +0200 Subject: [PATCH 26/53] tests: adjust internal patch to apply cleanly Signed-off-by: Denys Vlasenko --- tests/modalias.prov.runtest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/modalias.prov.runtest b/tests/modalias.prov.runtest index 2fbc655..2fd03ad 100755 --- a/tests/modalias.prov.runtest +++ b/tests/modalias.prov.runtest @@ -16,8 +16,8 @@ cp ../../modalias.prov modalias.prov patch -p1 <<"EOF" --- a/modalias.prov +++ b/modalias.prov -@@ -86,6 +86,17 @@ combine_modaliases() { - print_modaliases "$class" "$variants" "$pos" +@@ -105,6 +105,17 @@ combine_modaliases() { + print_modaliases "$prev" "$variants" "$pos" } +if [ "$#" = 2 ] && [ "$1" = "-t" ]; then @@ -32,8 +32,8 @@ patch -p1 <<"EOF" +fi + for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do - # | head -n1 because some modules have *two* version tags. *cough*b44*cough* - modver=$(/sbin/modinfo -F version "$module"| head -n1) + modver=$(/sbin/modinfo -F version "$module") + # delete possible extra lines because some modules have *two* version tags. *cough*b44*cough* EOF find | grep '\.ko.*\.modalias$' | xargs -n1 ./modalias.prov -t From 9008a32c7d4dd7283fb65cab90b094885bb1fbe6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 12 May 2023 15:48:56 +0200 Subject: [PATCH 27/53] README.md: update docs, add some questions Signed-off-by: Denys Vlasenko --- README.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ac54f6e..f694e25 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,12 @@ kernel-srpm-macros: specifies a Lua script to generate kmod(MODULE.ko) "Provides:" deps /usr/lib/rpm/macros.d/macros.kernel-srpm - ? + Automatically included by all rpm invocations. + Defines %kernel_arches (try rpm --eval '%kernel_arches') + Question: what uses this macro? I didn't find any users. kernel-rpm-macros: -/usr/lib/rpm/redhat/brp-kmod-restore-perms - ? -/usr/lib/rpm/redhat/brp-kmod-set-exec-bit - ? - /usr/lib/rpm/redhat/find-provides.ksyms Runs from rpmbuild at the end of kernel builds and 3rd party module builds, to extract @@ -48,6 +45,7 @@ kernel-rpm-macros: modalias(pci:SOMETHING)=OPTIONALLY_VERSION "Provides:" deps from modules in kernel and 3rd party modules packages. Takes input list of files on stdin. + Question: what uses these deps? /usr/lib/rpm/fileattrs/modalias.attr For newer rpmbuild with "internal dependency generators", this file specifies that modalias.prov should be run @@ -62,9 +60,15 @@ kernel-rpm-macros: /usr/lib/rpm/fileattrs/kabi.attr For newer rpmbuild with "internal dependency generators", this file specifies that kabi.sh should be run on - /boot/symvers-* and /lib/modules/XYZ/symvers).gz + /boot/symvers-* and /lib/modules/XYZ/symvers.gz /usr/lib/rpm/macros.d/macros.kmp + Automatically included by all rpm invocations. + Defines a number of macros. + +/usr/lib/rpm/redhat/brp-kmod-restore-perms + ? +/usr/lib/rpm/redhat/brp-kmod-set-exec-bit ? /usr/lib/rpm/redhat/kmodtool From 96aa636698bc757f0893b016d8603dd9bb18b19b Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 16 May 2023 08:21:40 +0200 Subject: [PATCH 28/53] kabi: handle symvers.xz Check for symvers.xz support in addition to symvers.gz, due to unnanounced unilateral change[1][2] in the kernel packaging. [1] https://gitlab.com/cki-project/kernel-ark/-/commit/26446656572b8d5934f5d714b1fea76f3ed559c0 [2] https://src.fedoraproject.org/rpms/kernel/c/2db77a072a997c00ee63ddf38b79766699094f1c?branch=rawhide * kabi.attr: Add xz extension to the file matching pattern * kabi.sh: Add xz extension to the matching pattern; determine catenation program based on extension. Signed-off-by: Eugene Syromiatnikov References: https://bugzilla.redhat.com/show_bug.cgi?id=2192895 --- kabi.attr | 2 +- kabi.sh | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/kabi.attr b/kabi.attr index 2d81387..5500b17 100644 --- a/kabi.attr +++ b/kabi.attr @@ -1,2 +1,2 @@ %__kabi_provides %{_rpmconfigdir}/kabi.sh -%__kabi_path ^(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.gz$ +%__kabi_path ^(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.(gz|xz)$ diff --git a/kabi.sh b/kabi.sh index 3fb749b..dd49b8b 100644 --- a/kabi.sh +++ b/kabi.sh @@ -7,10 +7,16 @@ IFS=$'\n' -for symvers in $(grep -E '(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.gz') "$@"; +for symvers in $(grep -E '(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.(gz|xz)') "$@"; do + cat_prog="cat" + case "$symvers" in + *.gz) cat_prog="zcat" ;; + *.xz) cat_prog="xzcat" ;; + esac + # We generate dependencies only for symbols exported by vmlinux itself # and not for kmods here as they are spread across subpackages, # so Provides: generation for kmods is handled by find-provides.ksyms. - zcat $symvers | awk '/[^ ]* [^ ]* vmlinux .*/ { print "kernel(" $2 ") = " $1 }' + "$cat_prog" "$symvers" | awk '/[^ ]* [^ ]* vmlinux .*/ { print "kernel(" $2 ") = " $1 }' done From 027d6260146f782c75de45ac896ea97d546685f4 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 16 May 2023 09:02:59 +0200 Subject: [PATCH 29/53] find-provides.ksyms, find-requires.ksyms: filter local __crc_* symbols as well Apparently, these are local in the recent kernels. * find-provides.ksyms (all_provides): Filter local __crc_* symbols in additional to global in the objdump -t call output. * find-requires.ksyms: Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 4 ++-- find-requires.ksyms | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index b01f057..74556e9 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -46,7 +46,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do | sort -u else objdump -t "$module" \ - | sed -n 's/^[0-9a-f][0-9a-f]* g...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ + | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ | while read sectname; do [ -n "$sectname" ] || continue @@ -63,7 +63,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do -v 'dep_pfx='"$dep_pfx" \ -v 'sectdata='"$SECTDATA" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) g...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'match($0, /^([0-9a-f]+) [gl]...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done \ | sort -u fi diff --git a/find-requires.ksyms b/find-requires.ksyms index 1890db5..13bad46 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -46,7 +46,7 @@ all_provides() { 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' else objdump -t "$module" \ - | sed -n 's/^[0-9a-f][0-9a-f]* g...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ + | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ | while read sectname; do [ -n "$sectname" ] || continue @@ -63,7 +63,7 @@ all_provides() { -v 'dep_pfx='"$dep_pfx" \ -v 'sectdata='"$SECTDATA" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) g...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'match($0, /^([0-9a-f]+) [gl]...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done fi From 0a8324122a48fe9811ab118f7f6ae3cf65416e0c Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 16 May 2023 10:45:00 +0200 Subject: [PATCH 30/53] find-provides.ksyms, find-requires.ksyms: match only the section being processed Instead of ignoring the section name in the objdump -t output, section name has to be checked in the awk script to produce only the meaningful output; hit when both __kcrctab and __kcrctab_gpl are present. * find-requires.ksyms (all_provides): Pass $sectname to the awk script, check that the relevant field of the input matches it. * find-provides.ksyms: Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 3 ++- find-requires.ksyms | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 74556e9..e5f139c 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -62,8 +62,9 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do | awk \ -v 'dep_pfx='"$dep_pfx" \ -v 'sectdata='"$SECTDATA" \ + -v 'sectname='"$sectname" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) [gl]...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done \ | sort -u fi diff --git a/find-requires.ksyms b/find-requires.ksyms index 13bad46..4f17abb 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -62,8 +62,9 @@ all_provides() { | awk \ -v 'dep_pfx='"$dep_pfx" \ -v 'sectdata='"$SECTDATA" \ + -v 'sectname='"$sectname" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) [gl]...... .* [0-9a-f]+ __crc_(.*)$/, a) { printf("%s(%s) = 0x%08s\n", dep_pfx, a[2], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done fi From 459cc0478d4775a9eb34f6c41145ce58486eae75 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Wed, 17 May 2023 09:29:10 +0200 Subject: [PATCH 31/53] find-requires.ksyms: call readelf -R on the sectname and not hard-coded .rodata * find-requires.ksyms (all_provides): Pass $sectname to the readelf -R call. Fixes: cd7e9e8a2fc2 "find-provides.ksyms, find-requires.ksyms: rewrite indirect CRC parsing" Signed-off-by: Eugene Syromiatnikov --- find-requires.ksyms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/find-requires.ksyms b/find-requires.ksyms index 4f17abb..732214d 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -51,7 +51,7 @@ all_provides() { | while read sectname; do [ -n "$sectname" ] || continue - ELFSECTDATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}') + ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then SECTDATA=$(echo $ELFSECTDATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') else From 30b19c9d637dc9d9d9616f7de4c90d34e5b874c8 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 23 May 2023 14:47:26 +0200 Subject: [PATCH 32/53] find-provides.ksyms, find-requires.ksyms: use "read -r" To avoid all kinds of fun that might stem from interpreting the user-supplied input. * find-provides.ksyms: Supply -r option to the read call. * find-requires.ksyms (all_provides): Likewise. Fixes: cd7e9e8a2fc2 "find-provides.ksyms, find-requires.ksyms: rewrite indirect CRC parsing" Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 2 +- find-requires.ksyms | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index e5f139c..8bd93c2 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -48,7 +48,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do objdump -t "$module" \ | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ - | while read sectname; do + | while read -r sectname; do [ -n "$sectname" ] || continue ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') diff --git a/find-requires.ksyms b/find-requires.ksyms index 732214d..8dc6eff 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -48,7 +48,7 @@ all_provides() { objdump -t "$module" \ | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ - | while read sectname; do + | while read -r sectname; do [ -n "$sectname" ] || continue ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') From 0f60c336b40037fda083de13ef00aeb91e86ab2a Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Fri, 19 May 2023 10:50:46 +0200 Subject: [PATCH 33/53] find-requires.ksyms: set LC_ALL=C globally To bring it more in line with the way it is implemented in find-provides.ksyms and avoid the inconsistencies prodiced by missing the environment setting. Signed-off-by: Eugene Syromiatnikov --- find-requires.ksyms | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/find-requires.ksyms b/find-requires.ksyms index 8dc6eff..565cc90 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -6,6 +6,7 @@ # provided by an external module and "ksym" replaces th regular "kernel" dep. IFS=$'\n' +export LC_ALL=C # Prevent elfutils from trying to download debuginfos unset DEBUGINFOD_URLS @@ -70,7 +71,7 @@ all_provides() { [ -z "$tmpfile" ] || rm -f -- "$tmpfile" done \ - | LC_ALL=C sort -k1,1 -u + | sort -k1,1 -u } # Extract all of the requirements of this module. @@ -83,15 +84,15 @@ all_requires() { {printf("%s:0x%08x\n", $2, $1)}' \ | sed -r -e 's:$:\t'"$1"':' done \ - | LC_ALL=C sort -k1,1 -u + | sort -k1,1 -u } # Filter out requirements fulfilled by the module itself. mod_requires() { - LC_ALL=C join -t $'\t' -j 1 -v 1 \ + join -t $'\t' -j 1 -v 1 \ <(all_requires "$@") \ <(all_provides "$@") \ - | LC_ALL=C sort -k1,1 -u + | sort -k1,1 -u } if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then @@ -154,23 +155,23 @@ if [ ${#modules[@]} -gt 0 ]; then { print $2 ":" $1 } ' \ | sed -r -e 's:$:\t'"$kernel"':' \ - | LC_ALL=C sort -k1,1 -u > $symvers + | sort -k1,1 -u > $symvers # Symbols matching with the kernel get a "kernel" dependency mod_req=$(mktemp -t mod_req.XXXXX) mod_requires "${modules[@]}" > "$mod_req" - LC_ALL=C join -t $'\t' -j 1 $symvers "$mod_req" | LC_ALL=C sort -u \ + join -t $'\t' -j 1 $symvers "$mod_req" | sort -u \ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "kernel(" $1 ") = " $2 }' # Symbols from elsewhere get a "ksym" dependency - LC_ALL=C join -t $'\t' -j 1 -v 2 $symvers "$mod_req" | LC_ALL=C sort -u \ + join -t $'\t' -j 1 -v 2 $symvers "$mod_req" | sort -u \ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "ksym(" $1 ") = " $2 }' os_id=$(sed -nr '/^ID[[:space:]]*=/{ s/ID[[:space:]]*=[[:space:]]*//; s/^"(.*)"$/\1/; p }' /etc/os-release) if [ "rhel" = "$os_id" ]; then # Check kABI if the kabi-stablelists package is installed # Do this last so we can try to output this error at the end - kabi_check_symbols=($(LC_ALL=C join -t $'\t' -j 1 $symvers "$mod_req" | LC_ALL=C sort -u \ + kabi_check_symbols=($(join -t $'\t' -j 1 $symvers "$mod_req" | sort -u \ | awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print $1 }')) check_kabi "${kabi_check_symbols[@]}" fi From 5910d313292cdc90c20357e0be787341b68c6558 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Mon, 22 May 2023 14:15:23 +0200 Subject: [PATCH 34/53] find-provides.ksyms: factor out the output sorting To bring it more in line with the implementation in find-requires.ksyms. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 8bd93c2..c666a9d 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -42,8 +42,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do | awk \ -v 'dep_pfx='"$dep_pfx" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' \ - | sort -u + 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' else objdump -t "$module" \ | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ @@ -65,9 +64,9 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do -v 'sectname='"$sectname" \ --non-decimal-data \ 'match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' - done \ - | sort -u + done fi [ -z "$tmpfile" ] || rm -f -- "$tmpfile" -done +done \ +| sort -k1,1 -u From 2cb3604727ad4eb53f9c6b44492222bb72118811 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Wed, 17 May 2023 14:01:55 +0200 Subject: [PATCH 35/53] find-provides.ksyms, find-requires.ksyms: rewrite section data matching Currently, it just matches the 2nd to 5th fields with awk, which leads to occasional capturing of some garbage at the end of the section data and minor issues when supplying it to the symbol extracting awk script: awk: cmd. line:1: (FILENAME=- FNR=19) fatal: argument index with `$' must be > 0 awk: warning: escape sequence `\.' treated as plain `.' awk: cmd. line:1: (FILENAME=- FNR=9) fatal: not enough arguments to satisfy format string `78b624dbc125415351be965ex.$..%ASQ..^' ^ ran out for this one While at it, also eliminate grep and sed calls (with the pair of awk and sed being the most offending). * find-provides.ksyms: Generate part of the awk script that performs the byte reversal based on the endianness in the readelf -h output, inject it into the awk script; use substr for matching parts of the section data instead of fields. * find-requires.ksyms (all_provides): Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 11 +++++------ find-requires.ksyms | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index c666a9d..2c396f9 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -50,12 +50,11 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do | while read -r sectname; do [ -n "$sectname" ] || continue - ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') - if [[ -n $(readelf -h $module | grep "little endian") ]]; then - SECTDATA=$(echo $ELFSECTDATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') - else - SECTDATA=$ELFSECTDATA - fi + revbytes="" + kmod_elf_hdr="$(readelf -h "$module")" + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] || + revbytes='a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a);' + SECTDATA=$(readelf -R "$sectname" "$module" | awk '/^ 0x[0-9a-f]{8}/{ a = substr($0, 14, 8) substr($0, 23, 8) substr($0, 32, 8) substr($0, 41, 8); '"$revbytes"' printf("%s", a); }') objdump -t "$module" \ | awk \ diff --git a/find-requires.ksyms b/find-requires.ksyms index 565cc90..7ece283 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -52,12 +52,11 @@ all_provides() { | while read -r sectname; do [ -n "$sectname" ] || continue - ELFSECTDATA=$(readelf -R "$sectname" "$module" | awk '/0x/{printf $2$3$4$5}') - if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then - SECTDATA=$(echo $ELFSECTDATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g') - else - SECTDATA=$ELFSECTDATA - fi + revbytes="" + kmod_elf_hdr="$(readelf -h "$module")" + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] || + revbytes='a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a);' + SECTDATA=$(readelf -R "$sectname" "$module" | awk '/^ 0x[0-9a-f]{8}/{ a = substr($0, 14, 8) substr($0, 23, 8) substr($0, 32, 8) substr($0, 41, 8); '"$revbytes"' printf("%s", a); }') objdump -t "$module" \ | awk \ From 72be62cfea2f899a8a2626ded45c55b2ad53f45d Mon Sep 17 00:00:00 2001 From: Etienne Champetier Date: Thu, 1 Jun 2023 08:28:28 -0400 Subject: [PATCH 36/53] macros.kmp: do not run `rpm -qa` If kernel_version is defined, there is no need to lookup the latest kernel*-devel package version, if it's not defined, we can only look for the relevant packages instead of using `rpm -qa`. Signed-off-by: Etienne Champetier Resolves: #2108441 --- macros.kmp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/macros.kmp b/macros.kmp index 00c0467..70aeac1 100644 --- a/macros.kmp +++ b/macros.kmp @@ -59,8 +59,7 @@ redhat_kmp_has_post_hooks 1 %global kmodtool %{-s*}%{!-s:/usr/lib/rpm/redhat/kmodtool} \ %global kmod_version %{-v*}%{!-v:%{version}} \ %global kmod_release %{-r*}%{!-r:%{release}} \ - %global latest_kernel %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\\\n' `rpm -qa | egrep "^kernel(-rt|-aarch64)?-devel" | /usr/lib/rpm/redhat/rpmsort -r | head -n 1`; echo '%%%%{nil}'; } | head -n 1) \ - %{!?kernel_version:%{expand:%%global kernel_version %{latest_kernel}}} \ + %{!?kernel_version:%{expand:%%global kernel_version %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1)}} \ %global kverrel %(%{kmodtool} verrel %{?kernel_version} 2>/dev/null) \ flavors="default" \ if [ -z "%*" ]; then \ From df57f906eb5909ac2093df01a94db6c0fb2f0e42 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Mon, 22 May 2023 17:53:44 +0200 Subject: [PATCH 37/53] find-provides.ksyms, find-requires.ksyms: do section data parsing inside awk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous approach with passing the section contents as a command line option proven to be error-prone, as it hits the command line option size limit on some kmods. Move the reading and processing of the section contents inside the awk script itself; it also saves a bit (around 3—4%) of time on the kernels with indirect __crc_* symbols: $ for i in ./lib/modules/*; do \ echo "====== $i ====="; \ diff -u <(find $i | ./find-provides.ksyms.old) <(find $i | ./find-provides.ksyms.new); \ echo -n "old: "; find $i | time ./find-provides.ksyms.old > /dev/null; \ echo -n "new: "; find $i | time ./find-provides.ksyms.new > /dev/null; \ done ====== ./lib/modules/4.18.0-372.57.1.el8_6.s390x ===== old: ./find-provides.ksyms.old > /dev/null 5.38s user 4.66s system 150% cpu 6.693 total new: ./find-provides.ksyms.new > /dev/null 5.20s user 4.52s system 149% cpu 6.484 total ====== ./lib/modules/4.18.0-372.57.1.el8_6.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 7.85s user 6.34s system 143% cpu 9.864 total new: ./find-provides.ksyms.new > /dev/null 7.75s user 6.32s system 143% cpu 9.809 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.s390x ===== old: ./find-provides.ksyms.old > /dev/null 6.19s user 4.68s system 144% cpu 7.506 total new: ./find-provides.ksyms.new > /dev/null 5.93s user 4.46s system 143% cpu 7.219 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 8.47s user 6.71s system 144% cpu 10.523 total new: ./find-provides.ksyms.new > /dev/null 8.44s user 6.59s system 144% cpu 10.435 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.s390x ===== old: ./find-provides.ksyms.old > /dev/null 5.21s user 4.09s system 145% cpu 6.383 total new: ./find-provides.ksyms.new > /dev/null 5.04s user 3.85s system 145% cpu 6.120 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 8.68s user 5.77s system 139% cpu 10.326 total new: ./find-provides.ksyms.new > /dev/null 8.47s user 5.57s system 139% cpu 10.067 total * find-provides.ksyms: Add assign to revbytes the result of endianness chack test instead of the code snippet; do not generate SECTDATA variable; do not pass SECTDATA to the awk script; pass module and revbytes to the awk script; retrieve the section data into the sectdata variable and perform the byte re-shuffling in accordance to the revbytes value in the BEGIN section of the awk script. * find-requires.ksyms (all_provides): Likewise. Fixes: cd7e9e8a2fc2 "find-provides.ksyms, find-requires.ksyms: rewrite indirect CRC parsing" Resolves: #2135901 References: https://bugzilla.redhat.com/show_bug.cgi?id=2178935 Co-Authored-by: Denys Vlasenko Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 19 +++++++++++++------ find-requires.ksyms | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 2c396f9..58ac4e8 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -50,19 +50,26 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do | while read -r sectname; do [ -n "$sectname" ] || continue - revbytes="" kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] || - revbytes='a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a);' - SECTDATA=$(readelf -R "$sectname" "$module" | awk '/^ 0x[0-9a-f]{8}/{ a = substr($0, 14, 8) substr($0, 23, 8) substr($0, 32, 8) substr($0, 41, 8); '"$revbytes"' printf("%s", a); }') + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] + revbytes="$?" objdump -t "$module" \ | awk \ -v 'dep_pfx='"$dep_pfx" \ - -v 'sectdata='"$SECTDATA" \ + -v 'module='"$module" \ + -v 'revbytes='"$revbytes" \ -v 'sectname='"$sectname" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'BEGIN { + sectdata = ""; + while (("readelf -R \"" sectname "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + sectdata = sectdata substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + } + if (revbytes) { sectdata = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", sectdata); } + } + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done fi diff --git a/find-requires.ksyms b/find-requires.ksyms index 7ece283..cda0ce2 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -52,19 +52,26 @@ all_provides() { | while read -r sectname; do [ -n "$sectname" ] || continue - revbytes="" kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] || - revbytes='a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a);' - SECTDATA=$(readelf -R "$sectname" "$module" | awk '/^ 0x[0-9a-f]{8}/{ a = substr($0, 14, 8) substr($0, 23, 8) substr($0, 32, 8) substr($0, 41, 8); '"$revbytes"' printf("%s", a); }') + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] + revbytes="$?" objdump -t "$module" \ | awk \ -v 'dep_pfx='"$dep_pfx" \ - -v 'sectdata='"$SECTDATA" \ + -v 'module='"$module" \ + -v 'revbytes='"$revbytes" \ -v 'sectname='"$sectname" \ --non-decimal-data \ - 'match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' + 'BEGIN { + sectdata = ""; + while (("readelf -R \"" sectname "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + sectdata = sectdata substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + } + if (revbytes) { sectdata = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", sectdata); } + } + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done fi From 2264680063335c595b3b4b7679bdce003680da38 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 23 May 2023 15:02:19 +0200 Subject: [PATCH 38/53] find-provides.ksyms, find-requires.ksyms: avoid calling nm twice Instead of running the nm output through grep and then running it through awk again, run it directly through awk, and bail of immediately if a non-absolute symbol is found. Also, while we're here, avoid executing the indirect parsing code if no __crc_* symbols are present at all, which shaves around 8-18% off of the run time: % for i in ./lib/modules/*; do \ echo "====== $i ====="; \ diff -u <(find $i | ./find-provides.ksyms.old) <(find $i | ./find-provides.ksyms.new); \ echo old:; find $i | time ./find-provides.ksyms.old > /dev/null; \ echo new:; find $i | time ./find-provides.ksyms.new > /dev/null; \ done ====== ./lib/modules/4.18.0-372.57.1.el8_6.s390x ===== old: ../find-provides.ksyms.old > /dev/null 5.10s user 4.52s system 150% cpu 6.412 total new: ../find-provides.ksyms.new > /dev/null 4.41s user 3.48s system 136% cpu 5.764 total ====== ./lib/modules/4.18.0-372.57.1.el8_6.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 7.80s user 6.19s system 143% cpu 9.740 total new: ../find-provides.ksyms.new > /dev/null 6.07s user 3.97s system 124% cpu 8.066 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.s390x ===== old: ../find-provides.ksyms.old > /dev/null 5.87s user 4.35s system 143% cpu 7.113 total new: ../find-provides.ksyms.new > /dev/null 5.12s user 3.56s system 132% cpu 6.533 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 8.44s user 6.78s system 144% cpu 10.535 total new: ../find-provides.ksyms.new > /dev/null 6.55s user 4.17s system 123% cpu 8.666 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.s390x ===== old: ../find-provides.ksyms.old > /dev/null 5.04s user 3.95s system 145% cpu 6.166 total new: ../find-provides.ksyms.new > /dev/null 4.64s user 3.17s system 136% cpu 5.719 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 8.49s user 5.54s system 139% cpu 10.043 total new: ../find-provides.ksyms.new > /dev/null 7.41s user 4.31s system 129% cpu 9.046 total * find-provides.ksyms: Rewrite the "if nm | grep -q; then nm | awk" with straight "nm | awk", update the awk script to return the exit code accordingly, execute indirect symbol parsing only if inderect __crc_* symbols are present. * find-requires.ksyms (all_provides): Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 31 +++++++++++++++++++++++-------- find-requires.ksyms | 31 +++++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 58ac4e8..a507708 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -37,13 +37,28 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do module="$tmpfile" fi - if nm "$module" | grep -qE '^([0-9a-f]+) A __crc_(.+)' 2> /dev/null; then - nm "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - --non-decimal-data \ - 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' - else + # awk script return code: + # 0 - absolute __crc_* symbols have been found, output has been + # generated; + # 23 - a non-absolute __crc_* symbold has been found; + # 42 - no __crc_* symbols have been found. + nm "$module" \ + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + --non-decimal-data \ + 'BEGIN { exit_code = 42 } + match($0, /^([0-9a-f]+) (.) __crc_(.+)/, a) { + if (a[2] == "A") { + printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); + exit_code = 0; + } else { + exit_code = 23; + exit; + } + } + END { exit exit_code }' + + [ 23 = "$?" ] && { objdump -t "$module" \ | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ @@ -71,7 +86,7 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do } match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done - fi + } [ -z "$tmpfile" ] || rm -f -- "$tmpfile" done \ diff --git a/find-requires.ksyms b/find-requires.ksyms index cda0ce2..15a5971 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -39,13 +39,28 @@ all_provides() { module="$tmpfile" fi - if nm "$module" | grep -qE '^([0-9a-f]+) A __crc_(.+)' 2> /dev/null; then - nm "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - --non-decimal-data \ - 'match($0, /^([0-9a-f]+) A __crc_(.+)/, a) { printf("%s(%s) = 0x%08x\n", dep_pfx, a[2], strtonum("0x" a[1])) }' - else + # awk script return code: + # 0 - absolute __crc_* symbols have been found, output has been + # generated; + # 23 - a non-absolute __crc_* symbold has been found; + # 42 - no __crc_* symbols have been found. + nm "$module" \ + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + --non-decimal-data \ + 'BEGIN { exit_code = 42 } + match($0, /^([0-9a-f]+) (.) __crc_(.+)/, a) { + if (a[2] == "A") { + printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); + exit_code = 0; + } else { + exit_code = 23; + exit; + } + } + END { exit exit_code }' + + [ 23 = "$?" ] && { objdump -t "$module" \ | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ | sort -u \ @@ -73,7 +88,7 @@ all_provides() { } match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' done - fi + } [ -z "$tmpfile" ] || rm -f -- "$tmpfile" done \ From a9123f8ddef569fe1027b411f73ec36ba6a92510 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 23 May 2023 16:17:39 +0200 Subject: [PATCH 39/53] find-provides.ksyms, find-requires.ksyms: avoid iterating over sections Since the section retrieval code is implemented inside the awk script now, the next step is to eliminate external iteration over the section list and just retrieve the required sections inside awk on demand. This allows calling (and processing the output of) objdump -t just once, which saves around 8-12% of time on kernels that store modversions as non-absolute symbols: $ for i in ./lib/modules/*; do \ echo "====== $i ====="; \ diff -u <(find $i | ./find-provides.ksyms.old) <(find $i | ./find-provides.ksyms.new); \ echo -n "old: "; find $i | time ./find-provides.ksyms.old > /dev/null; \ echo -n "new: "; find $i | time ./find-provides.ksyms.new > /dev/null; \ done ====== ./lib/modules/4.18.0-372.57.1.el8_6.s390x ===== old: ../find-provides.ksyms.old > /dev/null 4.41s user 3.46s system 136% cpu 5.756 total new: ../find-provides.ksyms.new > /dev/null 3.90s user 2.94s system 129% cpu 5.279 total ====== ./lib/modules/4.18.0-372.57.1.el8_6.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 6.04s user 3.88s system 124% cpu 7.993 total new: ../find-provides.ksyms.new > /dev/null 6.08s user 3.91s system 124% cpu 8.012 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.s390x ===== old: ../find-provides.ksyms.old > /dev/null 5.09s user 3.51s system 133% cpu 6.452 total new: ../find-provides.ksyms.new > /dev/null 4.65s user 2.89s system 126% cpu 5.949 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 6.52s user 4.14s system 123% cpu 8.638 total new: ../find-provides.ksyms.new > /dev/null 6.64s user 4.12s system 123% cpu 8.690 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.s390x ===== old: ../find-provides.ksyms.old > /dev/null 4.45s user 3.29s system 136% cpu 5.661 total new: ../find-provides.ksyms.new > /dev/null 3.84s user 2.54s system 127% cpu 4.980 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64 ===== old: ../find-provides.ksyms.old > /dev/null 7.34s user 4.33s system 129% cpu 9.019 total new: ../find-provides.ksyms.new > /dev/null 6.67s user 3.51s system 122% cpu 8.278 total * find-provides.ksyms: Remove "objdump -t" section loop, do not supply sectname to the awk script, treat sectdata as an array keyed on section name, convert section retrieval to a function with a section name as an argument, call it if a section name is not present in sectdata. * find-requires.ksyms (all_provides): Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 47 +++++++++++++++++++++------------------------ find-requires.ksyms | 47 +++++++++++++++++++++------------------------ 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index a507708..d498598 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -59,33 +59,30 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do END { exit exit_code }' [ 23 = "$?" ] && { + kmod_elf_hdr="$(readelf -h "$module")" + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] + revbytes="$?" + objdump -t "$module" \ - | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ - | sort -u \ - | while read -r sectname; do - [ -n "$sectname" ] || continue - - kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] - revbytes="$?" - - objdump -t "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - -v 'module='"$module" \ - -v 'revbytes='"$revbytes" \ - -v 'sectname='"$sectname" \ - --non-decimal-data \ - 'BEGIN { - sectdata = ""; - while (("readelf -R \"" sectname "\" \"" module "\"" | getline t) > 0) { - if (match(t, /^ 0x[0-9a-f]{8}/)) - sectdata = sectdata substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); - } - if (revbytes) { sectdata = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", sectdata); } + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + -v 'module='"$module" \ + -v 'revbytes='"$revbytes" \ + --non-decimal-data \ + 'function readsect(name, a, t) { + a = ""; + while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); } - match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' - done + if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); } + sectdata[name] = a; + } + + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + if (!(a[2] in sectdata)) { readsect(a[2]) } + printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8)) + }' } [ -z "$tmpfile" ] || rm -f -- "$tmpfile" diff --git a/find-requires.ksyms b/find-requires.ksyms index 15a5971..40b8f2e 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -61,33 +61,30 @@ all_provides() { END { exit exit_code }' [ 23 = "$?" ] && { + kmod_elf_hdr="$(readelf -h "$module")" + [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] + revbytes="$?" + objdump -t "$module" \ - | sed -n 's/^[0-9a-f][0-9a-f]* [gl]...... \(.*\) [0-9a-f][0-9a-f]* __crc_.*$/\1/p' \ - | sort -u \ - | while read -r sectname; do - [ -n "$sectname" ] || continue - - kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] - revbytes="$?" - - objdump -t "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - -v 'module='"$module" \ - -v 'revbytes='"$revbytes" \ - -v 'sectname='"$sectname" \ - --non-decimal-data \ - 'BEGIN { - sectdata = ""; - while (("readelf -R \"" sectname "\" \"" module "\"" | getline t) > 0) { - if (match(t, /^ 0x[0-9a-f]{8}/)) - sectdata = sectdata substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); - } - if (revbytes) { sectdata = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", sectdata); } + | awk \ + -v 'dep_pfx='"$dep_pfx" \ + -v 'module='"$module" \ + -v 'revbytes='"$revbytes" \ + --non-decimal-data \ + 'function readsect(name, a, t) { + a = ""; + while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); } - match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) && a[2] == sectname { printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata, (strtonum("0x" a[1]) * 2) + 1, 8)) }' - done + if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); } + sectdata[name] = a; + } + + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + if (!(a[2] in sectdata)) { readsect(a[2]) } + printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8)) + }' } [ -z "$tmpfile" ] || rm -f -- "$tmpfile" From 28c1a86a0cf4a2f1d0196e688af771bf1427c131 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Mon, 22 May 2023 18:25:49 +0200 Subject: [PATCH 40/53] find-provides.ksyms: add a short description of the parsing logic Add a comment that, hopefully, sheds some light on what is going on in the following code. * find-provides.ksyms: Add a comment. Co-Authored-by: Denys Vlasenko Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/find-provides.ksyms b/find-provides.ksyms index d498598..5212196 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -37,6 +37,63 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do module="$tmpfile" fi + # A modversion can be stored as an ELF symbol in various ways: + # - An immediate symbol whose value is available directly; it shows up + # in the nm output, for example: + # $ nm mlx5_core_5.14.x86_64.ko | grep '__crc_' | head -n 3 + # 0000000092f175ca A __crc_mlx5_access_reg + # 000000005b88c9f1 A __crc_mlx5_add_flow_rules + # 00000000e7c0ec8a A __crc_mlx5_alloc_bfreg + # $ zgrep mlx5_access_reg ./lib/modules/5.14.0-284.15.1.el9_2.x86_64/symvers.gz + # 0x92f175ca mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL + # This approach was being used on x86 and arm before Linux 5.19, + # for example. + # + # - A globally or locally visible symbol in a read-only (or not; + # sometimes .rodata is not a read-only section, after all, as binutils + # commit binutils-2_33~1385 has revealed (and binutils-2_35~1768 hasn't + # concealed back)) section (historically .rodata, __kcrctab/__kcrctab_gpl + # since Linux v5.19-rc1~139^2~2): + # $ nm mlx5_core_5.14.s390x.ko | grep '__crc_' | head -n 3 + # 0000000000002f7c R __crc_mlx5_access_reg + # 0000000000003304 R __crc_mlx5_add_flow_rules + # 0000000000002d2c R __crc_mlx5_alloc_bfreg + # This layout is used on ppc since Linux v4.10-rc7~15^2~1, for example, + # and on all architectures since Linux 5.19. To extract the symbol + # versions in this case, we get the offset and the section name + # from the "objdump -t" output: + # $ objdump -t lib/modules/mlx5_core_5.14.s390x.ko | grep '__crc_' | sort -k 5,5 | head -n 2 + # 0000000000002f7c g .rodata 0000000000000000 __crc_mlx5_access_reg + # 0000000000003304 g .rodata 0000000000000000 __crc_mlx5_add_flow_rules + # and the section contents from the "readelf -R" call: + # $ readelf -R .rodata mlx5_core_5.14.s390x.ko + # [... skipped output ...] + # 0x00002f70 6c6f635f 6e6f6465 00000000 ed6560a8 loc_node.....e`. + # ^^^^^^^^ + # comparison with the contents + # of lib/modules/5.14.0-284.15.1.el9_2.s390x/symvers.gz corroborates + # its correctness: + # 0xed6560a8 mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL + # As mentioned earlier, for the later kernel versions, __kcrctab{,_gpl} + # sections are used: + # $ objdump -t lib/modules/mlx5_core_6.4.x86_64.ko | grep '__crc_' | sort -k 5,5 | head -n 2 + # 0000000000000000 l __kcrctab_gpl 0000000000000000 __crc_mlx5_access_reg + # 0000000000000090 l __kcrctab 0000000000000000 __crc_mlx5_add_flow_rules + # $ readelf -R __kcrctab_gpl mlx5_core_6.4.x86_64.ko + # 0x00000000 38b0d3c3 1840ce35 b99babc7 70b4700c 8....@.5....p.p. + # ^^^^^^^^ + # and in lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64/symvers.xz + # we see that it is correct (when accounted for the little endianness): + # 0xc3d3b038 mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL + # This data, after some post-processing, can be used in the awk script + # that extracts parts of the section according to the offsets got + # from the "objdump -t" output. + # + # An important assumption here is that all the __crc_* symbols in a kmod + # are either absolute or relative ones (and this one has been held so far, + # and supposedly will in the future, as the symbols are universally + # non-immediate now). + # awk script return code: # 0 - absolute __crc_* symbols have been found, output has been # generated; From 148ee639b5ea3be635d429cf1aaefcd94c3f4a13 Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Thu, 1 Jun 2023 11:20:50 +0200 Subject: [PATCH 41/53] find-provides.ksyms, find-requires.ksyms: unify symbol parsing Since the immediate symbols can be retrieved for "objdump -t" output as well, it makes some sence to use it as the sole data source and handle both vaiants inside the awk script. This simplification comes at some runtime cost for the simpler case of the immediate symbols, though, and overall it is about 5% faster in the relative symbols case and about the same 5% slower in the absolute symbols case, with the latter not as important moving forward, probably: $ for i in ./lib/modules/*; do \ echo "====== $i ====="; \ diff -u <(find $i | ./find-provides.ksyms.old) <(find $i | ./find-provides.ksyms.new); \ echo -n "old: "; find $i | time ./find-provides.ksyms.old > /dev/null; \ echo -n "new: "; find $i | time ./find-provides.ksyms.new > /dev/null; \ done ====== ./lib/modules/4.18.0-372.57.1.el8_6.s390x ===== old: ./find-provides.ksyms.old > /dev/null 3.98s user 3.04s system 129% cpu 5.411 total new: ./find-provides.ksyms.new > /dev/null 3.78s user 3.06s system 132% cpu 5.181 total ====== ./lib/modules/4.18.0-372.57.1.el8_6.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 6.18s user 4.00s system 124% cpu 8.161 total new: ./find-provides.ksyms.new > /dev/null 6.57s user 4.84s system 132% cpu 8.644 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.s390x ===== old: ./find-provides.ksyms.old > /dev/null 4.70s user 2.94s system 126% cpu 6.061 total new: ./find-provides.ksyms.new > /dev/null 4.37s user 3.03s system 127% cpu 5.793 total ====== ./lib/modules/5.14.0-284.15.1.el9_2.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 6.66s user 4.35s system 123% cpu 8.884 total new: ./find-provides.ksyms.new > /dev/null 7.07s user 5.00s system 130% cpu 9.218 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.s390x ===== old: ./find-provides.ksyms.old > /dev/null 3.81s user 2.62s system 128% cpu 5.018 total new: ./find-provides.ksyms.new > /dev/null 3.55s user 2.56s system 128% cpu 4.743 total ====== ./lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64 ===== old: ./find-provides.ksyms.old > /dev/null 13.79s user 8.59s system 125% cpu 17.817 total new: ./find-provides.ksyms.new > /dev/null 13.18s user 8.78s system 127% cpu 17.247 total * find-provides.ksyms: Do not perform an intial "nm | awk" run in an attempt to capture absolute symbols, just parse "objdump -t" output and handle both absolute and relative symbols in the awk script based on the section name. * find-requires.ksyms (all_provides): Likewise. Signed-off-by: Eugene Syromiatnikov --- find-provides.ksyms | 83 ++++++++++++++++++++------------------------- find-requires.ksyms | 70 +++++++++++++++++--------------------- 2 files changed, 68 insertions(+), 85 deletions(-) diff --git a/find-provides.ksyms b/find-provides.ksyms index 5212196..230fc09 100755 --- a/find-provides.ksyms +++ b/find-provides.ksyms @@ -39,11 +39,15 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do # A modversion can be stored as an ELF symbol in various ways: # - An immediate symbol whose value is available directly; it shows up - # in the nm output, for example: + # in the nm or objdump -t output, for example: # $ nm mlx5_core_5.14.x86_64.ko | grep '__crc_' | head -n 3 # 0000000092f175ca A __crc_mlx5_access_reg # 000000005b88c9f1 A __crc_mlx5_add_flow_rules # 00000000e7c0ec8a A __crc_mlx5_alloc_bfreg + # $ objdump -t lib/modules/mlx5_core_5.14.x86_64.ko | grep __crc_ | sort -k 5,5 | head -n 3 + # 0000000092f175ca g *ABS* 0000000000000000 __crc_mlx5_access_reg + # 000000005b88c9f1 g *ABS* 0000000000000000 __crc_mlx5_add_flow_rules + # 00000000e7c0ec8a g *ABS* 0000000000000000 __crc_mlx5_alloc_bfreg # $ zgrep mlx5_access_reg ./lib/modules/5.14.0-284.15.1.el9_2.x86_64/symvers.gz # 0x92f175ca mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL # This approach was being used on x86 and arm before Linux 5.19, @@ -88,59 +92,46 @@ for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do # This data, after some post-processing, can be used in the awk script # that extracts parts of the section according to the offsets got # from the "objdump -t" output. - # - # An important assumption here is that all the __crc_* symbols in a kmod - # are either absolute or relative ones (and this one has been held so far, - # and supposedly will in the future, as the symbols are universally - # non-immediate now). - - # awk script return code: - # 0 - absolute __crc_* symbols have been found, output has been - # generated; - # 23 - a non-absolute __crc_* symbold has been found; - # 42 - no __crc_* symbols have been found. - nm "$module" \ + objdump -t "$module" \ | awk \ - -v 'dep_pfx='"$dep_pfx" \ - --non-decimal-data \ - 'BEGIN { exit_code = 42 } - match($0, /^([0-9a-f]+) (.) __crc_(.+)/, a) { - if (a[2] == "A") { - printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); - exit_code = 0; - } else { - exit_code = 23; - exit; - } - } - END { exit exit_code }' + -v 'dep_pfx='"$dep_pfx" \ + -v 'module='"$module" \ + --non-decimal-data \ + 'BEGIN { revbytes = 0 } - [ 23 = "$?" ] && { - kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] - revbytes="$?" + function check_endianness( t) { + if (revbytes) return revbytes; - objdump -t "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - -v 'module='"$module" \ - -v 'revbytes='"$revbytes" \ - --non-decimal-data \ - 'function readsect(name, a, t) { - a = ""; - while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { - if (match(t, /^ 0x[0-9a-f]{8}/)) - a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + revbytes = -1; + while (("readelf -h \"" module "\"" | getline t) > 0) { + if (match(t, /^ Data: *2\047s complement, little endian$/)) { + revbytes = 1; + break; } - if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); } - sectdata[name] = a; } - match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + return revbytes; + } + + function readsect(name, a, t) { + a = ""; + while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + } + if (check_endianness() == 1) + a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); + sectdata[name] = a; + } + + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + if (a[2] == "*ABS*") { + printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); + } else { if (!(a[2] in sectdata)) { readsect(a[2]) } printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8)) - }' - } + } + }' [ -z "$tmpfile" ] || rm -f -- "$tmpfile" done \ diff --git a/find-requires.ksyms b/find-requires.ksyms index 40b8f2e..8ac7c40 100755 --- a/find-requires.ksyms +++ b/find-requires.ksyms @@ -39,53 +39,45 @@ all_provides() { module="$tmpfile" fi - # awk script return code: - # 0 - absolute __crc_* symbols have been found, output has been - # generated; - # 23 - a non-absolute __crc_* symbold has been found; - # 42 - no __crc_* symbols have been found. - nm "$module" \ + objdump -t "$module" \ | awk \ - -v 'dep_pfx='"$dep_pfx" \ - --non-decimal-data \ - 'BEGIN { exit_code = 42 } - match($0, /^([0-9a-f]+) (.) __crc_(.+)/, a) { - if (a[2] == "A") { - printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); - exit_code = 0; - } else { - exit_code = 23; - exit; - } - } - END { exit exit_code }' + -v 'dep_pfx='"$dep_pfx" \ + -v 'module='"$module" \ + --non-decimal-data \ + 'BEGIN { revbytes = 0 } - [ 23 = "$?" ] && { - kmod_elf_hdr="$(readelf -h "$module")" - [ "x$kmod_elf_hdr" = "x${kmod_elf_hdr%Data:*little endian*}" ] - revbytes="$?" + function check_endianness( t) { + if (revbytes) return revbytes; - objdump -t "$module" \ - | awk \ - -v 'dep_pfx='"$dep_pfx" \ - -v 'module='"$module" \ - -v 'revbytes='"$revbytes" \ - --non-decimal-data \ - 'function readsect(name, a, t) { - a = ""; - while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { - if (match(t, /^ 0x[0-9a-f]{8}/)) - a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + revbytes = -1; + while (("readelf -h \"" module "\"" | getline t) > 0) { + if (match(t, /^ Data: *2\047s complement, little endian$/)) { + revbytes = 1; + break; } - if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); } - sectdata[name] = a; } - match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + return revbytes; + } + + function readsect(name, a, t) { + a = ""; + while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) { + if (match(t, /^ 0x[0-9a-f]{8}/)) + a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8); + } + if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); } + sectdata[name] = a; + } + + match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) { + if (a[2] == "*ABS*") { + printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1])); + } else { if (!(a[2] in sectdata)) { readsect(a[2]) } printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8)) - }' - } + } + }' [ -z "$tmpfile" ] || rm -f -- "$tmpfile" done \ From 39f5c4ac3daff21141eb4b902c78fa836b1bb78b Mon Sep 17 00:00:00 2001 From: Eugene Syromiatnikov Date: Tue, 16 May 2023 08:30:33 +0200 Subject: [PATCH 42/53] kernel-srpm-macros.spec: bump the release * kernel-srpm-macros.spec (Release): Change to 19. (%changelog): New record. Signed-off-by: Eugene Syromiatnikov --- kernel-srpm-macros.spec | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index b420b97..d661fc4 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 18%{?dist} +Release: 19%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -134,6 +134,18 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Tue May 09 2023 Eugene Syromiatnikov - 1.0-19 +- Capture local __crc_* symbols for "Provides: kernel()". +- Add support for XZ compression for the symvers file. +- Fix "Provides: kernel()" generation when both __kcrctab and __kcrctab_gpl + are present. +- Fix regression for "Provides:" generation in cases when modversions are stored + in a section that is over 64K in size. +- Speedup and cleanup changes in find-provides.ksyms and find-requires.ksyms. +- Fix regex usage in kmod.attr. (Denys Vlasenko) +- Implement modalias "Provides:" grouping. (Denys Vlasenko) +- Speedup and cleanup changes in modalias.prov and kmod.attr. (Denys Vlasenko) + * Tue Mar 30 2023 Eugene Syromiatnikov - 1.0-18 - Avoid triggering debuginfod during elfutils tools usage. From eaea3e58bc3a4446c960b4a186a16885c1512d9b Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 20 Jul 2023 08:42:13 +0000 Subject: [PATCH 43/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index d661fc4..18d977d 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 19%{?dist} +Release: 20%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -134,6 +134,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Thu Jul 20 2023 Fedora Release Engineering - 1.0-20 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Tue May 09 2023 Eugene Syromiatnikov - 1.0-19 - Capture local __crc_* symbols for "Provides: kernel()". - Add support for XZ compression for the symvers file. From 66ea9d2986ffa5d86c5473f1950baff75552dfae Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sun, 21 Jan 2024 00:15:22 +0000 Subject: [PATCH 44/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 18d977d..52c8cf2 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 20%{?dist} +Release: 21%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -134,6 +134,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Sun Jan 21 2024 Fedora Release Engineering - 1.0-21 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Thu Jul 20 2023 Fedora Release Engineering - 1.0-20 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From 240db1cd7bb9be64b54998a4d7e48cd155af14c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=BD?= Date: Tue, 23 Jan 2024 15:11:28 +0000 Subject: [PATCH 45/53] Migrate to SPDX license This is part of https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_3 --- kernel-srpm-macros.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 52c8cf2..d750822 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -56,6 +56,8 @@ The variable to use is kernel_arches. %package -n kernel-rpm-macros Version: 205 Summary: Macros and scripts for building kernel module packages +# rpmsort is GPL-2.0-or-later +License: MIT AND GPL-2.0-or-later Requires: redhat-rpm-config >= 205 # for brp-kmod-compress From c61b1e942a92d36f96ab0549a381dda96721a685 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 24 Jan 2024 23:55:28 +0000 Subject: [PATCH 46/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index d750822..267d068 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 21%{?dist} +Release: 22%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Wed Jan 24 2024 Fedora Release Engineering - 1.0-22 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Sun Jan 21 2024 Fedora Release Engineering - 1.0-21 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 0f81ee97a59ed8f4e6385f14d55ed78ea677f69d Mon Sep 17 00:00:00 2001 From: David Abdurachmanov Date: Fri, 23 Jun 2023 13:01:54 +0300 Subject: [PATCH 47/53] Add riscv64 Signed-off-by: David Abdurachmanov --- kernel-srpm-macros.spec | 5 ++++- macros.kernel-srpm | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 267d068..a737bdf 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 22%{?dist} +Release: 23%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Wed Mar 06 2024 David Abdurachmanov - 1.0-23 +- Add riscv64 + * Wed Jan 24 2024 Fedora Release Engineering - 1.0-22 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild diff --git a/macros.kernel-srpm b/macros.kernel-srpm index c7110f6..5f6bb98 100644 --- a/macros.kernel-srpm +++ b/macros.kernel-srpm @@ -1,3 +1,3 @@ # kernel_arches lists what arches the full kernel is built for. -%kernel_arches x86_64 s390x ppc64le aarch64 %{arm} +%kernel_arches x86_64 s390x ppc64le aarch64 %{arm} riscv64 From cf850ea1cf3d39524a8c667e358ea5876889d97a Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 18 Jul 2024 11:39:22 +0000 Subject: [PATCH 48/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index a737bdf..6c46fa1 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 23%{?dist} +Release: 24%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Thu Jul 18 2024 Fedora Release Engineering - 1.0-24 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Wed Mar 06 2024 David Abdurachmanov - 1.0-23 - Add riscv64 From b3edcbf9d65ee29deeb9b9a9476aa326aeac11d3 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 17 Jan 2025 08:38:09 +0000 Subject: [PATCH 49/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 6c46fa1..e5499fc 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 24%{?dist} +Release: 25%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Fri Jan 17 2025 Fedora Release Engineering - 1.0-25 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Thu Jul 18 2024 Fedora Release Engineering - 1.0-24 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild From a2453a195264e81b1df7a9765dce5f53f1313cbd Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Tue, 1 Apr 2025 15:44:37 +0200 Subject: [PATCH 50/53] Finish adding riscv64 The %kernel_arches macro has been extended to include the architecture in commit 0f81ee97a59e but on RHEL the value gets overwritten at package build time. Make sure we do the right thing there too. Thanks: Zhengyu He Signed-off-by: Andrea Bolognani --- kernel-srpm-macros.spec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index e5499fc..7a5fc12 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 25%{?dist} +Release: 26%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -94,7 +94,7 @@ cp -p %{sources} . mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d install -p -m 0644 -t %{buildroot}/%{_rpmconfigdir}/macros.d macros.kernel-srpm %if 0%{?rhel} >= 8 - sed -i 's/^%%kernel_arches.*/%%kernel_arches x86_64 s390x ppc64le aarch64/' \ + sed -i 's/^%%kernel_arches.*/%%kernel_arches x86_64 s390x ppc64le aarch64 riscv64/' \ %{buildroot}/%{_rpmconfigdir}/macros.d/macros.kernel-srpm %endif @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Tue Apr 01 2025 Andrea Bolognani - 1.0-26 +- Finish adding riscv64 (thanks Zhengyu He) + * Fri Jan 17 2025 Fedora Release Engineering - 1.0-25 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild From 4b3dba68e87c34b64f2aed75dc001a8b07061d27 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 24 Jul 2025 18:23:31 +0000 Subject: [PATCH 51/53] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- kernel-srpm-macros.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel-srpm-macros.spec b/kernel-srpm-macros.spec index 7a5fc12..058c08e 100644 --- a/kernel-srpm-macros.spec +++ b/kernel-srpm-macros.spec @@ -1,7 +1,7 @@ Name: kernel-srpm-macros Version: 1.0 # when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well -Release: 26%{?dist} +Release: 27%{?dist} Summary: RPM macros that list arches the full kernel is built on # This package only exist in Fedora repositories # The license is the standard (MIT) specified in @@ -136,6 +136,9 @@ install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr %{rrcdir}/rpmsort %changelog +* Thu Jul 24 2025 Fedora Release Engineering - 1.0-27 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Tue Apr 01 2025 Andrea Bolognani - 1.0-26 - Finish adding riscv64 (thanks Zhengyu He) From 6e2e136a06c67ae7d31d062163c308ba9445453f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 12 Aug 2025 03:49:00 +0200 Subject: [PATCH 52/53] macros.kmp: make the "do not run `rpm -qa`" change less intrusive Let's not delete "latest_kernel" macro Signed-off-by: Denys Vlasenko Resolves: #2108441 --- macros.kmp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/macros.kmp b/macros.kmp index 70aeac1..4daab32 100644 --- a/macros.kmp +++ b/macros.kmp @@ -59,7 +59,8 @@ redhat_kmp_has_post_hooks 1 %global kmodtool %{-s*}%{!-s:/usr/lib/rpm/redhat/kmodtool} \ %global kmod_version %{-v*}%{!-v:%{version}} \ %global kmod_release %{-r*}%{!-r:%{release}} \ - %{!?kernel_version:%{expand:%%global kernel_version %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1)}} \ + %global latest_kernel %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1) \ + %{!?kernel_version:%{expand:%%global kernel_version %{latest_kernel}}} \ %global kverrel %(%{kmodtool} verrel %{?kernel_version} 2>/dev/null) \ flavors="default" \ if [ -z "%*" ]; then \ From 1af058e32f13f3e5e6da785654c4898b14c16262 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 12 Aug 2025 03:59:11 +0200 Subject: [PATCH 53/53] macros.kmp: restore previous backslash-escaping of newline in "latest_kernel" macro Signed-off-by: Denys Vlasenko Resolves: #2108441 --- macros.kmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macros.kmp b/macros.kmp index 4daab32..fdfc182 100644 --- a/macros.kmp +++ b/macros.kmp @@ -59,7 +59,7 @@ redhat_kmp_has_post_hooks 1 %global kmodtool %{-s*}%{!-s:/usr/lib/rpm/redhat/kmodtool} \ %global kmod_version %{-v*}%{!-v:%{version}} \ %global kmod_release %{-r*}%{!-r:%{release}} \ - %global latest_kernel %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1) \ + %global latest_kernel %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1) \ %{!?kernel_version:%{expand:%%global kernel_version %{latest_kernel}}} \ %global kverrel %(%{kmodtool} verrel %{?kernel_version} 2>/dev/null) \ flavors="default" \