tracing: Fix some selftest issues
Masami Hiramatsu (Google)
maintainerv3 cover tracing: Fix some selftest issues
Hi,
Here is v3 of a series of some fixes/cleanups for the test modules and boot time selftest of kprobe events. The previous version is here;
https://lore.kernel.org/all/171805478534.52471.6269290579314514778.stgit@devnote2/
In this version, I updated the 2nd patch to integrate WARN_ON_ONCE() and pr_warn() instead of removing WARN_ONCE() because this warning messages are needed to ktest to handle errors.
Thank you,
---
Masami Hiramatsu (Google) (3):
tracing: Build event generation tests only as modules tracing/kprobe: Integrate test warnings into WARN_ONCE tracing/kprobe: Remove cleanup code unrelated to selftest
kernel/trace/Kconfig | 4 ++- kernel/trace/trace_kprobe.c | 54 ++++++++++++++----------------------------- 2 files changed, 19 insertions(+), 39 deletions(-)
--
Masami Hiramatsu (Google) <[email protected]>
Masami Hiramatsu (Google)
maintainerPATCH v3 1/3 tracing: Build event generation tests only as modules
From: Masami Hiramatsu (Google) <[email protected]>
The kprobes and synth event generation test modules add events and lock (get a reference) those event file reference in module init function, and unlock and delete it in module exit function. This is because those are designed for playing as modules.
If we make those modules as built-in, those events are left locked in the kernel, and never be removed. This causes kprobe event self-test failure as below.
[ 97.349708] ------------[ cut here ]------------ [ 97.353453] WARNING: CPU: 3 PID: 1 at kernel/trace/trace_kprobe.c:2133 kprobe_trace_self_tests_init+0x3f1/0x480 [ 97.357106] Modules linked in: [ 97.358488] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.9.0-g699646734ab5-dirty #14 [ 97.361556] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 [ 97.363880] RIP: 0010:kprobe_trace_self_tests_init+0x3f1/0x480 [ 97.365538] Code: a8 24 08 82 e9 ae fd ff ff 90 0f 0b 90 48 c7 c7 e5 aa 0b 82 e9 ee fc ff ff 90 0f 0b 90 48 c7 c7 2d 61 06 82 e9 8e fd ff ff 90 <0f> 0b 90 48 c7 c7 33 0b 0c 82 89 c6 e8 6e 03 1f ff 41 ff c7 e9 90 [ 97.370429] RSP: 0000:ffffc90000013b50 EFLAGS: 00010286 [ 97.371852] RAX: 00000000fffffff0 RBX: ffff888005919c00 RCX: 0000000000000000 [ 97.373829] RDX: ffff888003f40000 RSI: ffffffff8236a598 RDI: ffff888003f40a68 [ 97.375715] RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000000 [ 97.377675] R10: ffffffff811c9ae5 R11: ffffffff8120c4e0 R12: 0000000000000000 [ 97.379591] R13: 0000000000000001 R14: 0000000000000015 R15: 0000000000000000 [ 97.381536] FS: 0000000000000000(0000) GS:ffff88807dcc0000(0000) knlGS:0000000000000000 [ 97.383813] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 97.385449] CR2: 0000000000000000 CR3: 0000000002244000 CR4: 00000000000006b0 [ 97.387347] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 97.389277] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 97.391196] Call Trace: [ 97.391967] <TASK> [ 97.392647] ? __warn+0xcc/0x180 [ 97.393640] ? kprobe_trace_self_tests_init+0x3f1/0x480 [ 97.395181] ? report_bug+0xbd/0x150 [ 97.396234] ? handle_bug+0x3e/0x60 [ 97.397311] ? exc_invalid_op+0x1a/0x50 [ 97.398434] ? asm_exc_invalid_op+0x1a/0x20 [ 97.399652] ? trace_kprobe_is_busy+0x20/0x20 [ 97.400904] ? tracing_reset_all_online_cpus+0x15/0x90 [ 97.402304] ? kprobe_trace_self_tests_init+0x3f1/0x480 [ 97.403773] ? init_kprobe_trace+0x50/0x50 [ 97.404972] do_one_initcall+0x112/0x240 [ 97.406113] do_initcall_level+0x95/0xb0 [ 97.407286] ? kernel_init+0x1a/0x1a0 [ 97.408401] do_initcalls+0x3f/0x70 [ 97.409452] kernel_init_freeable+0x16f/0x1e0 [ 97.410662] ? rest_init+0x1f0/0x1f0 [ 97.411738] kernel_init+0x1a/0x1a0 [ 97.412788] ret_from_fork+0x39/0x50 [ 97.413817] ? rest_init+0x1f0/0x1f0 [ 97.414844] ret_from_fork_asm+0x11/0x20 [ 97.416285] </TASK> [ 97.417134] irq event stamp: 13437323 [ 97.418376] hardirqs last enabled at (13437337): [<ffffffff8110bc0c>] console_unlock+0x11c/0x150 [ 97.421285] hardirqs last disabled at (13437370): [<ffffffff8110bbf1>] console_unlock+0x101/0x150 [ 97.423838] softirqs last enabled at (13437366): [<ffffffff8108e17f>] handle_softirqs+0x23f/0x2a0 [ 97.426450] softirqs last disabled at (13437393): [<ffffffff8108e346>] __irq_exit_rcu+0x66/0xd0 [ 97.428850] ---[ end trace 0000000000000000 ]---
And also, since we can not cleanup dynamic_event file, ftracetest are failed too.
To avoid these issues, build these tests only as modules.
--- kernel/trace/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/Kconfig +2 -2
@@ -1136,7 +1136,7 @@ config PREEMPTIRQ_DELAY_TEST config SYNTH_EVENT_GEN_TEST tristate "Test module for in-kernel synthetic event generation" - depends on SYNTH_EVENTS + depends on SYNTH_EVENTS && m help This option creates a test module to check the base functionality of in-kernel synthetic event definition and
@@ -1149,7 +1149,7 @@ config SYNTH_EVENT_GEN_TEST config KPROBE_EVENT_GEN_TEST tristate "Test module for in-kernel kprobe event generation" - depends on KPROBE_EVENTS + depends on KPROBE_EVENTS && m help This option creates a test module to check the base functionality of in-kernel kprobe event definition.
Masami Hiramatsu (Google)
maintainerPATCH v3 2/3 tracing/kprobe: Integrate test warnings into WARN_ONCE
In reply to Masami Hiramatsu (Google)From: Masami Hiramatsu (Google) <[email protected]>
Cleanup the redundant WARN_ON_ONCE(cond) + pr_warn(msg) into WARN_ONCE(cond, msg). Also add some WARN_ONCE() for hitcount check. These WARN_ONCE() errors makes it easy to handle errors from ktest.
---
Changes in v3:
- integrate WARN_ON_ONCE() and pr_warn() instead of remove
WARN_ONCE(). --- kernel/trace/trace_kprobe.c | 54 +++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 35 deletions(-)
kernel/trace/trace_kprobe.c +19 -35
@@ -2023,19 +2023,16 @@ static __init int kprobe_trace_self_tests_init(void)pr_info ("Testing kprobe tracing: " ); ret =create_or_delete_trace_kprobe ("p:testprobe kprobe_trace_selftest_target $stack $stack0 +0($stack)" ); -if (WARN_ON_ONCE (ret)) { -pr_warn ("error on probing function entry.\n" ); +if (WARN_ONCE (ret,"error on probing function entry." )) { warn++; }else {/* Enable trace point */ tk =find_trace_kprobe ("testprobe" ,KPROBE_EVENT_SYSTEM ); -if (WARN_ON_ONCE (tk ==NULL )) { -pr_warn ("error on getting new probe.\n" ); +if (WARN_ONCE (tk ==NULL ,"error on probing function entry." )) { warn++; }else { file =find_trace_probe_file (tk,top_trace_array ()); -if (WARN_ON_ONCE (file ==NULL )) { -pr_warn ("error on getting probe file.\n" ); +if (WARN_ONCE (file ==NULL ,"error on getting probe file." )) { warn++; }else enable_trace_kprobe(
@@ -2044,19 +2041,16 @@ static __init int kprobe_trace_self_tests_init(void) } ret =create_or_delete_trace_kprobe ("r:testprobe2 kprobe_trace_selftest_target $retval" ); -if (WARN_ON_ONCE (ret)) { -pr_warn ("error on probing function return.\n" ); +if (WARN_ONCE (ret,"error on probing function return." )) { warn++; }else {/* Enable trace point */ tk =find_trace_kprobe ("testprobe2" ,KPROBE_EVENT_SYSTEM ); -if (WARN_ON_ONCE (tk ==NULL )) { -pr_warn ("error on getting 2nd new probe.\n" ); +if (WARN_ONCE (tk ==NULL ,"error on getting 2nd new probe." )) { warn++; }else { file =find_trace_probe_file (tk,top_trace_array ()); -if (WARN_ON_ONCE (file ==NULL )) { -pr_warn ("error on getting probe file.\n" ); +if (WARN_ONCE (file ==NULL ,"error on getting probe file." )) { warn++; }else enable_trace_kprobe(
@@ -2079,18 +2073,15 @@ static __init int kprobe_trace_self_tests_init(void)/* Disable trace points before removing it */ tk =find_trace_kprobe ("testprobe" ,KPROBE_EVENT_SYSTEM ); -if (WARN_ON_ONCE (tk ==NULL )) { -pr_warn ("error on getting test probe.\n" ); +if (WARN_ONCE (tk ==NULL ,"error on getting test probe." )) { warn++; }else { -if (trace_kprobe_nhit (tk) !=1 ) { -pr_warn ("incorrect number of testprobe hits\n" ); +if (WARN_ONCE (trace_kprobe_nhit (tk) !=1 , +"incorrect number of testprobe hits." )) warn++; - } file =find_trace_probe_file (tk,top_trace_array ()); -if (WARN_ON_ONCE (file ==NULL )) { -pr_warn ("error on getting probe file.\n" ); +if (WARN_ONCE (file ==NULL ,"error on getting probe file." )) { warn++; }else disable_trace_kprobe(
@@ -2098,18 +2089,15 @@ static __init int kprobe_trace_self_tests_init(void) } tk =find_trace_kprobe ("testprobe2" ,KPROBE_EVENT_SYSTEM ); -if (WARN_ON_ONCE (tk ==NULL )) { -pr_warn ("error on getting 2nd test probe.\n" ); +if (WARN_ONCE (tk ==NULL ,"error on getting 2nd test probe." )) { warn++; }else { -if (trace_kprobe_nhit (tk) !=1 ) { -pr_warn ("incorrect number of testprobe2 hits\n" ); +if (WARN_ONCE (trace_kprobe_nhit (tk) !=1 , +"incorrect number of testprobe2 hits." )) warn++; - } file =find_trace_probe_file (tk,top_trace_array ()); -if (WARN_ON_ONCE (file ==NULL )) { -pr_warn ("error on getting probe file.\n" ); +if (WARN_ONCE (file ==NULL ,"error on getting probe file." )) { warn++; }else disable_trace_kprobe(
@@ -2117,23 +2105,19 @@ static __init int kprobe_trace_self_tests_init(void) } ret =create_or_delete_trace_kprobe ("-:testprobe" ); -if (WARN_ON_ONCE (ret)) { -pr_warn ("error on deleting a probe.\n" ); +if (WARN_ONCE (ret,"error on deleting a probe." )) warn++; - } ret =create_or_delete_trace_kprobe ("-:testprobe2" ); -if (WARN_ON_ONCE (ret)) { -pr_warn ("error on deleting a probe.\n" ); +if (WARN_ONCE (ret,"error on deleting a probe." )) warn++; - } + end: ret =dyn_events_release_all (&trace_kprobe_ops); -if (WARN_ON_ONCE (ret)) { -pr_warn ("error on cleaning up probes.\n" ); +if (WARN_ONCE (ret,"error on cleaning up probes." )) warn++; - } +/* * Wait for the optimizer work to finish. Otherwise it might fiddle * with probes in already freed __init text.
Re: [PATCH v3 2/3] tracing/kprobe: Integrate test warnings into WARN_ONCE
Quoted 6 lines · On Tue, 11 Jun 2024 22:30:46 +0900 "Masami Hiramatsu (Google)"…
From: Masami Hiramatsu (Google) <[email protected]>
Cleanup the redundant
WARN_ON_ONCE(cond)+pr_warn(msg)intoWARN_ONCE(cond, msg). Also add someWARN_ONCE()for hitcount check. TheseWARN_ONCE()errors makes it easy to handle errors from ktest.
Quoted 6 lines
Suggested-by Steven Rostedt <[email protected]>Signed-off-by Masami Hiramatsu (Google) <[email protected]>---
Changes in v3:
- integrateWARN_ON_ONCE()andpr_warn()instead of removeWARN_ONCE().
-- Steve
Masami Hiramatsu (Google)
maintainerPATCH v3 3/3 tracing/kprobe: Remove cleanup code unrelated to selftest
In reply to Masami Hiramatsu (Google)From: Masami Hiramatsu (Google) <[email protected]>
This cleanup all kprobe events code is not related to the selftest itself, and it can fail by the reason unrelated to this test. If the test is successful, the generated events are cleaned up. And if not, we cannot guarantee that the kprobe events will work correctly. So, anyway, there is no need to clean it up.
--- kernel/trace/trace_kprobe.c | 4 ---- 1 file changed, 4 deletions(-)
kernel/trace/trace_kprobe.c +0 -4
@@ -2114,10 +2114,6 @@ static __init int kprobe_trace_self_tests_init(void) end: - ret =dyn_events_release_all (&trace_kprobe_ops); -if (WARN_ONCE (ret,"error on cleaning up probes." )) - warn++; -/* * Wait for the optimizer work to finish. Otherwise it might fiddle * with probes in already freed __init text.
Re: [PATCH v3 3/3] tracing/kprobe: Remove cleanup code unrelated to selftest
Quoted 9 lines · On Tue, 11 Jun 2024 22:30:56 +0900 "Masami Hiramatsu (Google)"…
From: Masami Hiramatsu (Google) <[email protected]>
This cleanup all kprobe events code is not related to the selftest itself, and it can fail by the reason unrelated to this test. If the test is successful, the generated events are cleaned up. And if not, we cannot guarantee that the kprobe events will work correctly. So, anyway, there is no need to clean it up.
Signed-off-by Masami Hiramatsu (Google) <[email protected]>
-- Steve
Quoted 19 lines
--- kernel/trace/trace_kprobe.c | 4 ---- 1 file changed, 4 deletions(-)kernel/trace/trace_kprobe.c +0
-4@@ -2114,10 +2114,6 @@ static __init int kprobe_trace_self_tests_init(void) end: - ret =dyn_events_release_all (&trace_kprobe_ops); -if (WARN_ONCE (ret,"error on cleaning up probes." )) - warn++; -/* * Wait for the optimizer work to finish. Otherwise it might fiddle * with probes in already freed __init text.
Masami Hiramatsu (Google)
maintainerRe: [PATCH v3 3/3] tracing/kprobe: Remove cleanup code unrelated to selftest
Quoted 11 lines · On Tue, 11 Jun 2024 10:25:00 -0400 Steven Rostedt <[email protected]> wrote:
Quoted 8 lines · On Tue, 11 Jun 2024 22:30:56 +0900 "Masami Hiramatsu (Google)"…
From: Masami Hiramatsu (Google) <[email protected]>
This cleanup all kprobe events code is not related to the selftest itself, and it can fail by the reason unrelated to this test. If the test is successful, the generated events are cleaned up. And if not, we cannot guarantee that the kprobe events will work correctly. So, anyway, there is no need to clean it up.
Quoted 3 lines
Quoted 1 line
Signed-off-by Masami Hiramatsu (Google) <[email protected]>Reviewed-by Steven Rostedt (Google) <[email protected]>
Thanks for review!
Quoted 24 lines
-- Steve
Quoted 19 lines
--- kernel/trace/trace_kprobe.c | 4 ---- 1 file changed, 4 deletions(-)kernel/trace/trace_kprobe.c +0
-4@@ -2114,10 +2114,6 @@ static __init int kprobe_trace_self_tests_init(void) end: - ret =dyn_events_release_all (&trace_kprobe_ops); -if (WARN_ONCE (ret,"error on cleaning up probes." )) - warn++; -/* * Wait for the optimizer work to finish. Otherwise it might fiddle * with probes in already freed __init text.
Signature · 1 line
Masami Hiramatsu (Google) <[email protected]>