[PATCH v3 4/4] selftests: cgroup: handle vmtest-dmem -b to test locally built kernel

From: Albert Esteve

Date: Mon May 04 2026 - 04:41:45 EST


From: Eric Chanudet <echanude@xxxxxxxxxx>

Currently vmtest-dmem.sh relies on the host's running kernel or a
pre-built one when booting the virtme-ng VM, with no option to
configure and build a local kernel tree directly.

This adds friction to the development cycle: the user must manually
run vng --kconfig with the correct config fragment, build the kernel,
and pass the result to the script.

Add a -b flag that automates this workflow. When set, handle_build()
configures the kernel using vng --kconfig with the selftest config
fragment, builds it with make -j$(nproc), and vm_start() passes the
local tree to vng --run so the VM boots the freshly built kernel.

Signed-off-by: Eric Chanudet <echanude@xxxxxxxxxx>
Signed-off-by: Albert Esteve <aesteve@xxxxxxxxxx>
---
tools/testing/selftests/cgroup/vmtest-dmem.sh | 35 ++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/cgroup/vmtest-dmem.sh b/tools/testing/selftests/cgroup/vmtest-dmem.sh
index 9524dbddb06b7..b6e4777285c1b 100755
--- a/tools/testing/selftests/cgroup/vmtest-dmem.sh
+++ b/tools/testing/selftests/cgroup/vmtest-dmem.sh
@@ -23,6 +23,7 @@ readonly WAIT_TOTAL=$((WAIT_PERIOD * WAIT_PERIOD_MAX))
readonly QEMU_PIDFILE="$(mktemp /tmp/qemu_dmem_vmtest_XXXX.pid)"
readonly QEMU_OPTS=" --pidfile ${QEMU_PIDFILE} "

+BUILD=0
QEMU="qemu-system-$(uname -m)"
VERBOSE=0
SHELL_MODE=0
@@ -31,6 +32,7 @@ GUEST_TREE="${GUEST_TREE:-$KERNEL_CHECKOUT}"
usage() {
echo
echo "$0 [OPTIONS]"
+ echo " -b Build kernel from source tree before booting"
echo " -q <qemu> QEMU binary/path (default: ${QEMU})"
echo " -s Start interactive shell in VM"
echo " -v Verbose output (vng boot logs on stdout)"
@@ -72,17 +74,46 @@ check_deps() {
done
}

+handle_build() {
+ if [[ ! "${BUILD}" -eq 1 ]]; then
+ return
+ fi
+
+ if [[ ! -d "${KERNEL_CHECKOUT}" ]]; then
+ echo "-b requires vmtest-dmem.sh called from the kernel source tree" >&2
+ exit 1
+ fi
+
+ pushd "${KERNEL_CHECKOUT}" &>/dev/null
+
+ if ! vng --kconfig --config "${SCRIPT_DIR}"/config; then
+ die "failed to generate .config for kernel source tree (${KERNEL_CHECKOUT})"
+ fi
+
+ if ! make -j"$(nproc)"; then
+ die "failed to build kernel from source tree (${KERNEL_CHECKOUT})"
+ fi
+
+ popd &>/dev/null
+}
+
vm_start() {
local logfile=/dev/null
local verbose_opt=""
+ local kernel_opt=""

if [[ "${VERBOSE}" -eq 1 ]]; then
verbose_opt="--verbose"
logfile=/dev/stdout
fi

+ if [[ "${BUILD}" -eq 1 ]]; then
+ kernel_opt="${KERNEL_CHECKOUT}"
+ fi
+
vng \
--run \
+ ${kernel_opt} \
${verbose_opt} \
--qemu-opts="${QEMU_OPTS}" \
--qemu="$(command -v "${QEMU}")" \
@@ -165,10 +196,11 @@ run_test() {
vm_ssh -- "cd '${GUEST_TREE}' && ./tools/testing/selftests/cgroup/test_dmem"
}

-while getopts ":hvq:s" o; do
+while getopts ":hvq:sb" o; do
case "${o}" in
v) VERBOSE=1 ;;
q) QEMU="${OPTARG}" ;;
+ b) BUILD=1 ;;
s) SHELL_MODE=1 ;;
h|*) usage ;;
esac
@@ -177,6 +209,7 @@ done
trap cleanup EXIT

check_deps
+handle_build
echo "Booting virtme-ng VM..."
vm_start
vm_wait_for_ssh

--
2.53.0