From 378177d2693bf4b7751251dc7021e60d6a446089 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 7 Apr 2024 10:33:57 +0200 Subject: [PATCH] linux kernel: prefer zstd where possible Closes #302291 Closes #301536 The following things have changed: * For 5.7+: ZSWAP compressor uses zstd now. * For 5.11+: ZRAM compressor uses zstd now. * For 5.13+: kernel modules are compressed with zstd instead of xz. * For 5.19+: support zstd-compressed firmware. The modules-closure functionality needed explicit support for copying over `.zst` files. Also, the VM image builder used busybox's `insmod` before which doesn't support zstd. Switched to `kmod` and added xz/zstd as dependencies for it, similar to how it's done for the actual stage1 in d33e52b2539c5b36a5a876df9006a7145efd42ea. The use of `kmod` here doesn't seem to be such a big deal since it's only a build-time dependency. --- pkgs/build-support/kernel/modules-closure.sh | 2 +- pkgs/build-support/vm/default.nix | 9 +++++++++ .../linux/kernel/common-config.nix | 20 +++++++++++-------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/pkgs/build-support/kernel/modules-closure.sh b/pkgs/build-support/kernel/modules-closure.sh index 5f61bac751af..06eb5b0d0de1 100644 --- a/pkgs/build-support/kernel/modules-closure.sh +++ b/pkgs/build-support/kernel/modules-closure.sh @@ -80,7 +80,7 @@ for module in $(< ~-/closure); do # of its output. modinfo -b $kernel --set-version "$version" -F firmware $module | grep -v '^name:' | while read -r i; do echo "firmware for $module: $i" - for name in "$i" "$i.xz" ""; do + for name in "$i" "$i.xz" "$i.zst" ""; do [ -z "$name" ] && echo "WARNING: missing firmware $i for module $module" if cp -v --parents --no-preserve=mode lib/firmware/$name "$out" 2>/dev/null; then break diff --git a/pkgs/build-support/vm/default.nix b/pkgs/build-support/vm/default.nix index 56375851783f..871f81bb5d69 100644 --- a/pkgs/build-support/vm/default.nix +++ b/pkgs/build-support/vm/default.nix @@ -40,10 +40,14 @@ rec { ${pkgs.stdenv.cc.libc}/lib/libc.so.* \ ${pkgs.stdenv.cc.libc}/lib/libm.so.* \ ${pkgs.stdenv.cc.libc}/lib/libresolv.so.* \ + ${pkgs.stdenv.cc.libc}/lib/libpthread.so.* \ + ${pkgs.zstd.out}/lib/libzstd.so.* \ + ${pkgs.xz.out}/lib/liblzma.so.* \ $out/lib # Copy BusyBox. cp -pd ${pkgs.busybox}/bin/* $out/bin + cp -pd ${pkgs.kmod}/bin/* $out/bin # Run patchelf to make the programs refer to the copied libraries. for i in $out/bin/* $out/lib/*; do if ! test -L $i; then nuke-refs $i; fi; done @@ -54,6 +58,11 @@ rec { patchelf --set-interpreter $out/lib/ld-*.so.? --set-rpath $out/lib $i || true fi done + + find $out/lib -type f \! -name 'ld*.so.?' | while read i; do + echo "patching $i..." + patchelf --set-rpath $out/lib $i + done ''; # */ diff --git a/pkgs/os-specific/linux/kernel/common-config.nix b/pkgs/os-specific/linux/kernel/common-config.nix index c213bd4e6ffe..cf38897c5070 100644 --- a/pkgs/os-specific/linux/kernel/common-config.nix +++ b/pkgs/os-specific/linux/kernel/common-config.nix @@ -871,12 +871,14 @@ let }; zram = { - ZRAM = module; - ZRAM_WRITEBACK = option yes; - ZRAM_MULTI_COMP = whenAtLeast "6.2" yes; - ZSWAP = option yes; - ZPOOL = yes; - ZBUD = option yes; + ZRAM = module; + ZRAM_WRITEBACK = option yes; + ZRAM_MULTI_COMP = whenAtLeast "6.2" yes; + ZRAM_DEF_COMP_ZSTD = whenAtLeast "5.11" yes; + ZSWAP = option yes; + ZSWAP_COMPRESSOR_DEFAULT_ZSTD = whenAtLeast "5.7" yes; + ZPOOL = yes; + ZSMALLOC = option yes; }; brcmfmac = { @@ -948,8 +950,9 @@ let THRUSTMASTER_FF = yes; ZEROPLUS_FF = yes; - MODULE_COMPRESS = whenOlder "5.13" yes; - MODULE_COMPRESS_XZ = yes; + MODULE_COMPRESS = whenOlder "5.13" yes; + MODULE_COMPRESS_XZ = whenOlder "5.13" yes; + MODULE_COMPRESS_ZSTD = whenAtLeast "5.13" yes; SYSVIPC = yes; # System-V IPC @@ -1124,6 +1127,7 @@ let FW_LOADER_USER_HELPER_FALLBACK = option no; FW_LOADER_COMPRESS = whenAtLeast "5.3" yes; + FW_LOADER_COMPRESS_ZSTD = whenAtLeast "5.19" yes; HOTPLUG_PCI_ACPI = yes; # PCI hotplug using ACPI HOTPLUG_PCI_PCIE = yes; # PCI-Expresscard hotplug support