[PATCH] tracefs: Add tests for clearing kprobes with tracefs_dynevent_destroy_all()

Steven Rostedt <[email protected]> Thu, 23 Apr 2026 16:22:07 -0400
Newsgroups org.kernel.vger.linux-trace-devel
Message-ID <[email protected]>
From: Steven Rostedt <[email protected]>

There was a regression with the use of tracefs_dynevent_destroy_all() where
it wasn't resetting kprobe events. Add testing of that function in the utest
for kprobe events.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=221395
Signed-off-by: Steven Rostedt <[email protected]>
---
 utest/tracefs-utest.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/utest/tracefs-utest.c b/utest/tracefs-utest.c
index 353b3cbee199..7ec7b42eebb0 100644
--- a/utest/tracefs-utest.c
+++ b/utest/tracefs-utest.c
@@ -2330,6 +2330,7 @@ static void test_kprobes_instance(struct tracefs_instance *instance)
 	/* kprobes APIs */
 	destroy_dynevents(TRACEFS_DYNEVENT_KPROBE | TRACEFS_DYNEVENT_KRETPROBE);
 
+	/* Allocate first */
 	for (i = 0; i < kprobe_count; i++) {
 		dkprobe[i] = tracefs_kprobe_alloc(ktests[i].system, ktests[i].event,
 						  ktests[i].address, ktests[i].format);
@@ -2348,6 +2349,7 @@ static void test_kprobes_instance(struct tracefs_instance *instance)
 	get_dynevents_check(TRACEFS_DYNEVENT_KPROBE | TRACEFS_DYNEVENT_KRETPROBE, 0);
 	CU_TEST(check_probes(kretests, kretprobe_count, dkretprobe, false, instance, tep));
 
+	/* Create the kprobes */
 	for (i = 0; i < kprobe_count; i++) {
 		CU_TEST(tracefs_dynevent_create(dkprobe[i]) == 0);
 	}
@@ -2387,6 +2389,27 @@ static void test_kprobes_instance(struct tracefs_instance *instance)
 	tracefs_dynevent_list_free(devents);
 	devents = NULL;
 
+	/* Recreate both types, and destroy with tracefs_dynevent_destroy_all() */
+	for (i = 0; i < kretprobe_count; i++) {
+		CU_TEST(tracefs_dynevent_create(dkretprobe[i]) == 0);
+	}
+	for (i = 0; i < kprobe_count; i++) {
+		CU_TEST(tracefs_dynevent_create(dkprobe[i]) == 0);
+	}
+	devents = get_dynevents_check(TRACEFS_DYNEVENT_KPROBE | TRACEFS_DYNEVENT_KRETPROBE,
+				    kprobe_count + kretprobe_count);
+	CU_TEST(check_probes(ktests, kprobe_count, devents, true, instance, tep));
+	CU_TEST(check_probes(kretests, kretprobe_count, dkretprobe, true, instance, tep));
+	tracefs_dynevent_list_free(devents);
+	devents = NULL;
+
+	CU_TEST(tracefs_dynevent_destroy_all(TRACEFS_DYNEVENT_ALL, true) == 0);
+
+	get_dynevents_check(TRACEFS_DYNEVENT_KPROBE | TRACEFS_DYNEVENT_KRETPROBE, 0);
+	CU_TEST(check_probes(ktests, kprobe_count, dkprobe, false, instance, tep));
+	CU_TEST(check_probes(kretests, kretprobe_count, dkretprobe, false, instance, tep))
+
+	/* Free the dynamic events */
 	for (i = 0; i < kprobe_count; i++)
 		tracefs_dynevent_free(dkprobe[i]);
 	for (i = 0; i < kretprobe_count; i++)
@@ -3966,7 +3989,8 @@ void test_tracefs_lib(void)
 		fprintf(stderr, "Suite \"%s\" cannot be ceated\n", TRACEFS_SUITE);
 		return;
 	}
-
+	CU_add_test(suite, "kprobes", test_kprobes);
+	return;
 	CU_add_test(suite, "Test tracefs/debugfs mounting", test_mounting);
 	CU_add_test(suite, "trace cpu read",
 		    test_trace_cpu_read);
@@ -4032,7 +4056,6 @@ void test_tracefs_lib(void)
 		    test_custom_trace_dir);
 	CU_add_test(suite, "ftrace marker",
 		    test_ftrace_marker);
-	CU_add_test(suite, "kprobes", test_kprobes);
 	CU_add_test(suite, "synthetic events", test_synthetic);
 	CU_add_test(suite, "eprobes", test_eprobes);
 	CU_add_test(suite, "uprobes", test_uprobes);
-- 
2.53.0