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

Steven Rostedt <[email protected]> Fri, 24 Apr 2026 14:48:39 -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]>
---
Changes since v1: https://lore.kernel.org/[email protected]

- Remove leftover debugging (had kprobe test first followed by a return).
   (Metin Kaya)

 utest/tracefs-utest.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/utest/tracefs-utest.c b/utest/tracefs-utest.c
index 97a91dfcdb2c..e3ff2151796b 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++)
-- 
2.53.0