From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: Martin Kaiser <martin@kaiser.cx>
Cc: Naveen N Rao <naveen@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] test_kprobes: clear kprobes between test runs
Date: Fri, 8 May 2026 09:33:50 +0900 [thread overview]
Message-ID: <20260508093350.1d03d6c239134a5bc02c61de@kernel.org> (raw)
In-Reply-To: <20260507134615.1010905-1-martin@kaiser.cx>
On Thu, 7 May 2026 15:44:33 +0200
Martin Kaiser <martin@kaiser.cx> wrote:
> Running the kprobes sanity tests twice makes all tests fail and
> eventually crashes the kernel.
>
> [root@martin-riscv-1 ~]# echo 1 > /sys/kernel/debug/kunit/kprobes_test/run
> ...
> # Totals: pass:5 fail:0 skip:0 total:5
> ok 1 kprobes_test
> [root@martin-riscv-1 ~]# echo 1 > /sys/kernel/debug/kunit/kprobes_test/run
> ...
> # test_kprobe: EXPECTATION FAILED at lib/tests/test_kprobes.c:64
> Expected 0 == register_kprobe(&kp), but
> register_kprobe(&kp) == -22 (0xffffffffffffffea)
> ...
> Unable to handle kernel paging request ...
Oops, good catch! Thanks for fixing!
>
> The testsuite defines several kprobes and kretprobes as static variables
> that are preserved across test runs.
>
> After register_kprobe and unregister_kprobe, a kprobe contains some
> leftover data that must be cleared before the kprobe can be registered
> again. The tests are setting symbol_name to define the probe location.
> Address and flags must be cleared.
>
> The existing code clears some of the probes between subsequent tests, but
> not between two test runs. The leftover data from a previous test run
> makes the registrations fail in the next run.
>
> Move the cleanups for all kprobes into kprobes_test_init, this function
> is called before each single test (including the first test of a test
> run).
Yeah, this looks good to me. Let me pick it.
>
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> ---
> lib/tests/test_kprobes.c | 29 ++++++++++++++++++-----------
> 1 file changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/lib/tests/test_kprobes.c b/lib/tests/test_kprobes.c
> index b7582010125c..06e729e4de05 100644
> --- a/lib/tests/test_kprobes.c
> +++ b/lib/tests/test_kprobes.c
> @@ -12,6 +12,12 @@
>
> #define div_factor 3
>
> +#define KP_CLEAR(_kp) \
> +do { \
> + (_kp).addr = NULL; \
> + (_kp).flags = 0; \
> +} while (0)
> +
> static u32 rand1, preh_val, posth_val;
> static u32 (*target)(u32 value);
> static u32 (*recursed_target)(u32 value);
> @@ -125,10 +131,6 @@ static void test_kprobes(struct kunit *test)
>
> current_test = test;
>
> - /* addr and flags should be cleard for reusing kprobe. */
> - kp.addr = NULL;
> - kp.flags = 0;
> -
> KUNIT_EXPECT_EQ(test, 0, register_kprobes(kps, 2));
> preh_val = 0;
> posth_val = 0;
> @@ -226,9 +228,6 @@ static void test_kretprobes(struct kunit *test)
> struct kretprobe *rps[2] = {&rp, &rp2};
>
> current_test = test;
> - /* addr and flags should be cleard for reusing kprobe. */
> - rp.kp.addr = NULL;
> - rp.kp.flags = 0;
> KUNIT_EXPECT_EQ(test, 0, register_kretprobes(rps, 2));
>
> krph_val = 0;
> @@ -290,8 +289,6 @@ static void test_stacktrace_on_kretprobe(struct kunit *test)
> unsigned long myretaddr = (unsigned long)__builtin_return_address(0);
>
> current_test = test;
> - rp3.kp.addr = NULL;
> - rp3.kp.flags = 0;
>
> /*
> * Run the stacktrace_driver() to record correct return address in
> @@ -352,8 +349,6 @@ static void test_stacktrace_on_nested_kretprobe(struct kunit *test)
> struct kretprobe *rps[2] = {&rp3, &rp4};
>
> current_test = test;
> - rp3.kp.addr = NULL;
> - rp3.kp.flags = 0;
>
> //KUNIT_ASSERT_NE(test, myretaddr, stacktrace_driver());
>
> @@ -367,6 +362,18 @@ static void test_stacktrace_on_nested_kretprobe(struct kunit *test)
>
> static int kprobes_test_init(struct kunit *test)
> {
> + KP_CLEAR(kp);
> + KP_CLEAR(kp2);
> + KP_CLEAR(kp_missed);
> +#ifdef CONFIG_KRETPROBES
> + KP_CLEAR(rp.kp);
> + KP_CLEAR(rp2.kp);
> +#ifdef CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
> + KP_CLEAR(rp3.kp);
> + KP_CLEAR(rp4.kp);
> +#endif
> +#endif
> +
> target = kprobe_target;
> target2 = kprobe_target2;
> recursed_target = kprobe_recursed_target;
> --
> 2.43.7
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
prev parent reply other threads:[~2026-05-08 0:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-07 13:44 [PATCH] test_kprobes: clear kprobes between test runs Martin Kaiser
2026-05-08 0:33 ` Masami Hiramatsu [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260508093350.1d03d6c239134a5bc02c61de@kernel.org \
--to=mhiramat@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=martin@kaiser.cx \
--cc=naveen@kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox