[PATCH v5 5/5] selftests/verification: Test loadable module-based reactor
From: <hidden>
Date: 2026-09-06 17:11:08
Also in:
lkml
Subsystem:
kernel selftest framework, runtime verification (rv), the rest · Maintainers:
Shuah Khan, Shuah Khan, Steven Rostedt, Gabriele Monaco, Linus Torvalds
From: Wen Yang <redacted> Add a selftest module that register an RV reactor and a test that exercises the module pinning: rmmod must fail while a monitor is attached to the reactor and succeed after it is detached. A trap unloads the module on failure so it does not break the next insmod. THe module is built through the kselftest TEST_GEN_MODS_DIR mechanism, like the livepatch selftests. Signed-off-by: Wen Yang <redacted> --- tools/testing/selftests/verification/Makefile | 1 + tools/testing/selftests/verification/config | 2 + .../test.d/rv_reactor_loadable.tc | 46 +++++++++++++++++++ .../verification/test_modules/Makefile | 16 +++++++ .../test_modules/rv_test_reactor.c | 37 +++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 tools/testing/selftests/verification/test.d/rv_reactor_loadable.tc create mode 100644 tools/testing/selftests/verification/test_modules/Makefile create mode 100644 tools/testing/selftests/verification/test_modules/rv_test_reactor.c
diff --git a/tools/testing/selftests/verification/Makefile b/tools/testing/selftests/verification/Makefile
index aa8790c22a71..7ff7382d11f0 100644
--- a/tools/testing/selftests/verification/Makefile
+++ b/tools/testing/selftests/verification/Makefile@@ -3,6 +3,7 @@ all: TEST_PROGS := verificationtest-ktap TEST_FILES := test.d settings +TEST_GEN_MODS_DIR := test_modules EXTRA_CLEAN := $(OUTPUT)/logs/* include ../lib.mk
diff --git a/tools/testing/selftests/verification/config b/tools/testing/selftests/verification/config
index 43072c1c38f4..ddd7581f07b9 100644
--- a/tools/testing/selftests/verification/config
+++ b/tools/testing/selftests/verification/config@@ -1 +1,3 @@ CONFIG_RV=y +CONFIG_MODULES=y +CONFIG_MODULES_UNLOAD=y
diff --git a/tools/testing/selftests/verification/test.d/rv_reactor_loadable.tc b/tools/testing/selftests/verification/test.d/rv_reactor_loadable.tc
new file mode 100644
index 000000000000..ff1691661521
--- /dev/null
+++ b/tools/testing/selftests/verification/test.d/rv_reactor_loadable.tc@@ -0,0 +1,46 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-or-later +# description: Test a loadable module-based reactor +# requires: available_reactors insmod:program rmmod:program + +MODULE_KO="$FTRACETEST_ROOT/test_modules/rv_test_reactor.ko" +[ -f "$MODULE_KO" ] || exit_unsupported +[ -f /proc/modules ] || exit_unsupported +monitor=$(ls monitors | head -n 1) +[ -n "$monitor" ] || exit_unsupported + +cleanup() { + if grep -q '^test_reactors$' available_reactors; then + echo nop > "monitors/$monitor/reactors" || true + rmmod rv_test_reactor || true + fi +} +trap cleanup EXIT + +test_loadable_reactor() { + local monitor="$1" + + insmod "$MODULE_KO" + grep -q test_reactor available_reactors + + echo test_reactor > "monitors/$monitor/reactors" + grep -q "\[test_reactor\]" "monitors/$monitor/reactors" + + echo 1 > "monitors/$monitor/enable" + + if rmmod rv_test_reactor 2> /dev/null; then + echo "FAIL: rmmod succeeded while the reactor is attached to a monitor" + return 1 + fi + grep -q test_reactor available_reactors + + echo nop > "monitors/$monitor/reactors" + grep -q "\[nop\]" "monitors/$monitor/reactors" + grep -q 1 "monitors/$monitor/enable" + + echo 0 > "monitors/$monitor/enable" + rmmod rv_test_reactor + ! grep -q test_reactor available_reactors +} + +test_loadable_reactor "$monitor"
diff --git a/tools/testing/selftests/verification/test_modules/Makefile b/tools/testing/selftests/verification/test_modules/Makefile
new file mode 100644
index 000000000000..0af95207a9a9
--- /dev/null
+++ b/tools/testing/selftests/verification/test_modules/Makefile@@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 + +TESTMODS_DIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) +KDIR ?= /lib/modules/$(shell uname -r)/build + +obj-m += rv_test_reactor.o + +modules: +ifneq ("$(wildcard $(KDIR))", "") + $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) +endif + +clean: +ifneq ("$(wildcard $(KDIR))", "") + $(Q)$(MAKE) -C $(KDIR) clean KBUILD_EXTMOD=$(TESTMODS_DIR) +endif
diff --git a/tools/testing/selftests/verification/test_modules/rv_test_reactor.c b/tools/testing/selftests/verification/test_modules/rv_test_reactor.c
new file mode 100644
index 000000000000..a243df81fa52
--- /dev/null
+++ b/tools/testing/selftests/verification/test_modules/rv_test_reactor.c@@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Loadable RV reactor for the verification selftests. Register a + * reactor with owner = THIS_MODULE so the selftests can exercise the + * module pinning: unloading is refused while a monitor is attached + * to the reactor. + */ + +#include <linux/module.h> +#include <linux/rv.h> + +__printf(1, 0) static void rv_test_reaction(const char *msg, va_list args) +{ +} + +static struct rv_reactor rv_test_reactor = { + .name = "test_reactor", + .description = "selftest reactor: exercise module-based reactors.", + .react = rv_test_reaction, + .owner = THIS_MODULE, +}; + +static int __init rv_test_reactor_init(void) +{ + return rv_register_reactor(&rv_test_reactor); +} + +static void __exit rv_test_reactor_exit(void) +{ + rv_unregister_reactor(&rv_test_reactor); +} + +module_init(rv_test_reactor_init); +module_exit(rv_test_reactor_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Loadable RV reactor for verification selftests");
--
2.25.1