From 92afdc48d6816ab6f6b3b4c4c858e13b52cc3583 Mon Sep 17 00:00:00 2001 From: "Guilherme G. Piccoli" Date: Thu, 8 Aug 2024 10:17:18 -0300 Subject: [PATCH] initramfs: Effectively disable GPU drivers from kdump kernel The gitlab issue https://gitlab.freedesktop.org/gpiccoli/kdumpst/-/issues/19 was first reported by Saurabh, regarding GPU drivers getting included on the kdump initrd. We've managed to improve the code a bit, but the solution we proposed there was both wrong (for initcpio) *and* incomplete. The user Ethanell reopened the issue, mentioning that even after the patch that allegedly fixed the problem, they were getting amdgpu driver included in the kdump initrd. That was the "wrong" portion of the fix: in my naivety, I thought we could just remove the modules in the kdump install hook. But...happens that initcpio works with a lazy approach: some install hooks execute add_module(), and that signals to the later effective inclusion of the modules by mkinitcpio; so in other words, the kdump install hook was deleting no modules at all. Special thanks to Foxboron and noclaf for the discussion about that on IRC, which was very enlightening. Now, the proper approach is simple: just to skip hooks that add the GPU drivers, like plymouth and kms. Also took the opportunity to include the microcode hook in the ban list, since we don't want kernel updating CPU ucode in case of the microcode packages were updated (would be rare, but why not save a bit of space dropping that?). Finally, I've removed the GPU drivers delete code from the initcpio kdump install hook, since it was a nop in the end. That's it, right? No. Still there's the part two of my statement above: the prior approach was wrong, but not only, it was also *incomplete*. That is due to cases like Ethanell's: users that manually include GPU drivers in their initramfs images, for things like crypto or splash screen. It's also hard or better saying, *impossible*, to guess all hooks that add GPU drivers to the initramfs. So to cover manual inclusions or other hooks, we also add hereby extra kdump command-line flags to avoid the DRM and some GFX drivers probe during the kdump kernel boot. In order to not grow the drivers ban list too much, my attempt was to add common in-tree GPU drivers, but also block the DRM init call. Hopefully this time this is enough to disable GFX on kdump! Fixes: 4767b8095f9 ("initramfs: Fix the removal of GPU drivers from the minimal initrd") Reported-by: Ethanell (@flifloo) Signed-off-by: Guilherme G. Piccoli --- 00-default.conf | 2 +- initramfs/initcpio/initcpio-common.sh | 2 +- initramfs/initcpio/kdump.install.in | 7 ------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/00-default.conf b/00-default.conf index 06c16ed..5d63a9e 100644 --- a/00-default.conf +++ b/00-default.conf @@ -50,7 +50,7 @@ MOUNT_FOLDER="/var/crash/kdumpst" FULL_COREDUMP=1 MAKEDUMPFILE_COREDUMP_CMD="-z -d 31" MAKEDUMPFILE_DMESG_CMD="--dump-dmesg" -KDUMP_APPEND_CMDLINE="panic=-1 oops=panic fsck.mode=force fsck.repair=yes nr_cpus=1 reset_devices" +KDUMP_APPEND_CMDLINE="panic=-1 oops=panic fsck.mode=force fsck.repair=yes nr_cpus=1 reset_devices initcall_blacklist=drm_core_init module_blacklist=amdgpu,i915,nouveau" # # # GRUB-related settings diff --git a/initramfs/initcpio/initcpio-common.sh b/initramfs/initcpio/initcpio-common.sh index 9b3c09c..500f1f4 100644 --- a/initramfs/initcpio/initcpio-common.sh +++ b/initramfs/initcpio/initcpio-common.sh @@ -8,7 +8,7 @@ create_initramfs_mkinitcpio() { rm -f "${MOUNT_FOLDER}/kdump-initrd-$1.img" - mkinitcpio -A kdump -g "${MOUNT_FOLDER}/kdump-initrd-$1.img" -k "$1" 1>/dev/null + mkinitcpio -A kdump -S microcode,kms,plymouth -g "${MOUNT_FOLDER}/kdump-initrd-$1.img" -k "$1" 1>/dev/null if [ -s "${MOUNT_FOLDER}/kdump-initrd-$1.img" ]; then logger "kdumpst: created initcpio minimal initramfs" diff --git a/initramfs/initcpio/kdump.install.in b/initramfs/initcpio/kdump.install.in index 5141e21..7d17313 100644 --- a/initramfs/initcpio/kdump.install.in +++ b/initramfs/initcpio/kdump.install.in @@ -33,13 +33,6 @@ build() { BASE_FLD="${MOUNT_FOLDER#*$TGT}" echo "${BASE_FLD}" > "${BUILDROOT}"/usr/lib/kdumpst/kdump.dir - # Finally, we shouldn't have DRM/GPU drivers and firmwares here, - # but...just in case, let's remove all of that nevertheless. - # Our list includes the most common GFX FW blobs (AMD, i915, Nvidia) - # and all GPU/DRM drivers. - rm -rf "${BUILDROOT}"/usr/lib/firmware/{amdgpu,i915,nvidia,radeon}/ - rm -rf "${BUILDROOT}"/usr/lib/modules/*/kernel/drivers/gpu/drm/* - add_runscript }