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

Metin Kaya <[email protected]> Fri, 24 Apr 2026 09:04:10 +0100
Newsgroups org.kernel.vger.linux-trace-devel
Message-ID <[email protected]>
On 23/04/2026 9:22 pm, Steven Rostedt wrote:
> 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);

I think we can keep `kprobes` in its old location to make the patch simpler.

> +	return;

This line should be left-over from testing I guess :)

Thanks,

>   	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);