Re: [PATCH v6 18/20] selftests/liveupdate: Add kexec-based selftest for session lifecycle
From: Pasha Tatashin <pasha.tatashin@soleen.com>
Date: 2025-11-19 22:13:03
Also in:
linux-doc, linux-fsdevel, linux-mm, lkml
On Wed, Nov 19, 2025 at 4:20 PM David Matlack [off-list ref] wrote:
On 2025-11-15 06:34 PM, Pasha Tatashin wrote:quoted
diff --git a/tools/testing/selftests/liveupdate/do_kexec.sh b/tools/testing/selftests/liveupdate/do_kexec.sh new file mode 100755 index 000000000000..3c7c6cafbef8 --- /dev/null +++ b/tools/testing/selftests/liveupdate/do_kexec.sh@@ -0,0 +1,16 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +set -e + +# Use $KERNEL and $INITRAMFS to pass custom Kernel and optional initramfsIt'd be nice to use proper command line options for KERNEL and INITRAMFS instead of relying on environment variables.
Now that tests and do_kexec are separate, I do not think we should complicate do_kexec.sh to support every possible environment. On most modern distros kexec is managed via systemd, and the load and reboot commands are going to be handled through systemd. do_kexec.sh is meant for a very simplistic environment such as with busybox rootfs to perform selftests.
e.g. ./do_kexec.sh -k <kernel> -i <initramfs>quoted
+ +KERNEL="${KERNEL:-/boot/bzImage}" +set -- -l -s --reuse-cmdline "$KERNEL"I've observed --reuse-cmdline causing overload of the kernel command line when doing repeated kexecs, since it includes the built-in command line (CONFIG_CMDLINE) which then also gets added by the next kernel during boot.
There is a problem with CONFIG_CMDLINE + KEXEC, ideally, it should be addressed in the kernel
quoted hunk ↗ jump to hunk
Should we have something like this instead?diff --git a/tools/testing/selftests/liveupdate/do_kexec.sh b/tools/testing/selftests/liveupdate/do_kexec.sh index 3c7c6cafbef8..2590a870993d 100755 --- a/tools/testing/selftests/liveupdate/do_kexec.sh +++ b/tools/testing/selftests/liveupdate/do_kexec.sh@@ -4,8 +4,16 @@ set -e # Use $KERNEL and $INITRAMFS to pass custom Kernel and optional initramfs +# Determine the boot command line we need to pass to the kexec kernel. Note +# that the kernel will append to it its builtin command line, so make sure we +# subtract the builtin command to avoid accumulating kernel parameters and +# eventually overflowing the command line. +full_cmdline=$(cat /proc/cmdline) +builtin_cmdline=$(zcat /proc/config.gz|grep CONFIG_CMDLINE=|cut -f2 -d\")
This also implies we have /proc/config.gz or CONFIG_IKCONFIG_PROC ...
quoted hunk ↗ jump to hunk
+cmdline=${full_cmdline/$builtin_cmdline /} + KERNEL="${KERNEL:-/boot/bzImage}" -set -- -l -s --reuse-cmdline "$KERNEL" +set -- -l -s --command-line="${cmdline}" "$KERNEL" INITRAMFS="${INITRAMFS:-/boot/initramfs}" if [ -f "$INITRAMFS" ]; thenquoted
+ +INITRAMFS="${INITRAMFS:-/boot/initramfs}" +if [ -f "$INITRAMFS" ]; then + set -- "$@" --initrd="$INITRAMFS" +fi + +kexec "$@" +kexec -eConsider separating the kexec load into its own script, in case systems have their own ways of shutting down for kexec.
I think, if do_kexec.sh does not work (load + reboot), the user should use whatever the standard way on a distro to do kexec.
e.g. a kexec_load.sh script that does everything that do_kexec.sh does execpt the `kexec -e`. Then do_kexec.sh just calls kexec_load.sh and kexec -e.