* [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
@ 2023-03-17 11:48 Yafang Shao
2023-03-17 16:41 ` Andrii Nakryiko
2023-03-17 16:51 ` Alexei Starovoitov
0 siblings, 2 replies; 8+ messages in thread
From: Yafang Shao @ 2023-03-17 11:48 UTC (permalink / raw)
To: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa
Cc: bpf, Yafang Shao
It hits below warning on my test machine when running test_progs,
[ 702.223611] ------------[ cut here ]------------
[ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
[ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
[ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
[ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
[ 702.241388] Call Trace:
[ 702.241615] <TASK>
[ 702.241811] fprobe_handler+0x22/0x30
[ 702.242129] 0xffffffffc04710f7
[ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
[ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
[ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
[ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
[ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
[ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
[ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
[ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
[ 702.250785] ? preempt_count_sub+0x5/0xa0
[ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
[ 702.252368] ? preempt_count_sub+0x5/0xa0
[ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
[ 702.253918] do_syscall_64+0x16/0x90
[ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
[ 702.255422] RIP: 0033:0x46b793
It's caused by bench test attaching kprobe_multi link to preempt_count_sub
function, which is not executed in rcu safe context so the kprobe handler
on top of it will trigger the rcu warning.
Filtering out preempt_count_ functions from the bench test.
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
index 22be0a9..5561b93 100644
--- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
+++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
@@ -379,6 +379,8 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
if (!strncmp(name, "__ftrace_invalid_address__",
sizeof("__ftrace_invalid_address__") - 1))
continue;
+ if (!strncmp(name, "preempt_count_", strlen("preempt_count_")))
+ continue;
err = hashmap__add(map, name, 0);
if (err == -EEXIST)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-17 11:48 [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench Yafang Shao
@ 2023-03-17 16:41 ` Andrii Nakryiko
2023-03-19 7:38 ` Yafang Shao
2023-03-17 16:51 ` Alexei Starovoitov
1 sibling, 1 reply; 8+ messages in thread
From: Andrii Nakryiko @ 2023-03-17 16:41 UTC (permalink / raw)
To: Yafang Shao
Cc: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa, bpf
On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
>
> It hits below warning on my test machine when running test_progs,
>
> [ 702.223611] ------------[ cut here ]------------
> [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> [ 702.241388] Call Trace:
> [ 702.241615] <TASK>
> [ 702.241811] fprobe_handler+0x22/0x30
> [ 702.242129] 0xffffffffc04710f7
> [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> [ 702.250785] ? preempt_count_sub+0x5/0xa0
> [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> [ 702.252368] ? preempt_count_sub+0x5/0xa0
> [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> [ 702.253918] do_syscall_64+0x16/0x90
> [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> [ 702.255422] RIP: 0033:0x46b793
>
> It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> function, which is not executed in rcu safe context so the kprobe handler
> on top of it will trigger the rcu warning.
>
> Filtering out preempt_count_ functions from the bench test.
>
> Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> ---
> tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> index 22be0a9..5561b93 100644
> --- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> +++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> @@ -379,6 +379,8 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
> if (!strncmp(name, "__ftrace_invalid_address__",
> sizeof("__ftrace_invalid_address__") - 1))
> continue;
> + if (!strncmp(name, "preempt_count_", strlen("preempt_count_")))
> + continue;
>
let's add str_has_pfx() helper macro from libbpf_internal.h to
test_progs.h and use that instead of repeating each substring twice?
Here's what libbpf is doing:
/* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is
* a string literal known at compilation time or char * pointer known only at
* runtime.
*/
#define str_has_pfx(str, pfx) \
(strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1
: strlen(pfx)) == 0)
> err = hashmap__add(map, name, 0);
> if (err == -EEXIST)
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-17 11:48 [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench Yafang Shao
2023-03-17 16:41 ` Andrii Nakryiko
@ 2023-03-17 16:51 ` Alexei Starovoitov
2023-03-19 7:36 ` Yafang Shao
1 sibling, 1 reply; 8+ messages in thread
From: Alexei Starovoitov @ 2023-03-17 16:51 UTC (permalink / raw)
To: Yafang Shao
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf
On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
>
> It hits below warning on my test machine when running test_progs,
>
> [ 702.223611] ------------[ cut here ]------------
> [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> [ 702.241388] Call Trace:
> [ 702.241615] <TASK>
> [ 702.241811] fprobe_handler+0x22/0x30
> [ 702.242129] 0xffffffffc04710f7
> [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> [ 702.250785] ? preempt_count_sub+0x5/0xa0
> [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> [ 702.252368] ? preempt_count_sub+0x5/0xa0
> [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> [ 702.253918] do_syscall_64+0x16/0x90
> [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> [ 702.255422] RIP: 0033:0x46b793
>
> It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> function, which is not executed in rcu safe context so the kprobe handler
> on top of it will trigger the rcu warning.
Why is that?
preempt_count itself is fine.
The problem is elsewhere.
Since !rcu_is_watching() it some sort of idle or some other issue.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-17 16:51 ` Alexei Starovoitov
@ 2023-03-19 7:36 ` Yafang Shao
2023-03-19 16:54 ` Alexei Starovoitov
0 siblings, 1 reply; 8+ messages in thread
From: Yafang Shao @ 2023-03-19 7:36 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf
On Sat, Mar 18, 2023 at 12:52 AM Alexei Starovoitov
<alexei.starovoitov@gmail.com> wrote:
>
> On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
> >
> > It hits below warning on my test machine when running test_progs,
> >
> > [ 702.223611] ------------[ cut here ]------------
> > [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> > [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> > [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> > [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> > [ 702.241388] Call Trace:
> > [ 702.241615] <TASK>
> > [ 702.241811] fprobe_handler+0x22/0x30
> > [ 702.242129] 0xffffffffc04710f7
> > [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> > [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> > [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> > [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> > [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> > [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> > [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> > [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> > [ 702.250785] ? preempt_count_sub+0x5/0xa0
> > [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> > [ 702.252368] ? preempt_count_sub+0x5/0xa0
> > [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> > [ 702.253918] do_syscall_64+0x16/0x90
> > [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> > [ 702.255422] RIP: 0033:0x46b793
> >
> > It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> > function, which is not executed in rcu safe context so the kprobe handler
> > on top of it will trigger the rcu warning.
>
> Why is that?
It is caused by CONFIG_CONTEXT_TRACKING_USER=y, and it seems the
preempt_count_sub is executed before the RCU is watching.
user_exit_irqoff
if (context_tracking_enabled()) // CONFIG_CONTEXT_TRACKING_USER=y
__ct_user_exit(CONTEXT_USER);
ct_kernel_enter
...
// RCU is not watching here ...
ct_kernel_enter_state(offset);
// ... but is watching here.
It can be reproduced with a simple bpf code as follows when
CONFIG_CONTEXT_TRACKING_USER=y,
SEC("kprobe.multi/preempt_count_sub")
int kprobe_multi_trace()
{
return 0;
}
> preempt_count itself is fine.
> The problem is elsewhere.
> Since !rcu_is_watching() it some sort of idle or some other issue.
Not sure if we need to improve the code under
CONFIG_CONTEXT_TRACKING_USER=y, but it seems skipping "preempt_count_"
in kprobe_multi test case would be a quick fix.
--
Regards
Yafang
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-17 16:41 ` Andrii Nakryiko
@ 2023-03-19 7:38 ` Yafang Shao
0 siblings, 0 replies; 8+ messages in thread
From: Yafang Shao @ 2023-03-19 7:38 UTC (permalink / raw)
To: Andrii Nakryiko
Cc: ast, daniel, andrii, kafai, songliubraving, yhs, john.fastabend,
kpsingh, sdf, haoluo, jolsa, bpf
On Sat, Mar 18, 2023 at 12:41 AM Andrii Nakryiko
<andrii.nakryiko@gmail.com> wrote:
>
> On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
> >
> > It hits below warning on my test machine when running test_progs,
> >
> > [ 702.223611] ------------[ cut here ]------------
> > [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> > [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> > [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> > [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> > [ 702.241388] Call Trace:
> > [ 702.241615] <TASK>
> > [ 702.241811] fprobe_handler+0x22/0x30
> > [ 702.242129] 0xffffffffc04710f7
> > [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> > [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> > [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> > [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> > [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> > [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> > [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> > [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> > [ 702.250785] ? preempt_count_sub+0x5/0xa0
> > [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> > [ 702.252368] ? preempt_count_sub+0x5/0xa0
> > [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> > [ 702.253918] do_syscall_64+0x16/0x90
> > [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> > [ 702.255422] RIP: 0033:0x46b793
> >
> > It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> > function, which is not executed in rcu safe context so the kprobe handler
> > on top of it will trigger the rcu warning.
> >
> > Filtering out preempt_count_ functions from the bench test.
> >
> > Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
> > ---
> > tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> > index 22be0a9..5561b93 100644
> > --- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> > +++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
> > @@ -379,6 +379,8 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
> > if (!strncmp(name, "__ftrace_invalid_address__",
> > sizeof("__ftrace_invalid_address__") - 1))
> > continue;
> > + if (!strncmp(name, "preempt_count_", strlen("preempt_count_")))
> > + continue;
> >
>
> let's add str_has_pfx() helper macro from libbpf_internal.h to
> test_progs.h and use that instead of repeating each substring twice?
>
Thanks for the suggestion.
> Here's what libbpf is doing:
>
> /* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is
> * a string literal known at compilation time or char * pointer known only at
> * runtime.
> */
> #define str_has_pfx(str, pfx) \
> (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1
> : strlen(pfx)) == 0)
>
>
> > err = hashmap__add(map, name, 0);
> > if (err == -EEXIST)
> > --
> > 1.8.3.1
> >
--
Regards
Yafang
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-19 7:36 ` Yafang Shao
@ 2023-03-19 16:54 ` Alexei Starovoitov
2023-03-19 18:12 ` Jiri Olsa
2023-03-20 11:34 ` Yafang Shao
0 siblings, 2 replies; 8+ messages in thread
From: Alexei Starovoitov @ 2023-03-19 16:54 UTC (permalink / raw)
To: Yafang Shao
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf
On Sun, Mar 19, 2023 at 03:36:57PM +0800, Yafang Shao wrote:
> On Sat, Mar 18, 2023 at 12:52 AM Alexei Starovoitov
> <alexei.starovoitov@gmail.com> wrote:
> >
> > On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
> > >
> > > It hits below warning on my test machine when running test_progs,
> > >
> > > [ 702.223611] ------------[ cut here ]------------
> > > [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> > > [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> > > [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> > > [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> > > [ 702.241388] Call Trace:
> > > [ 702.241615] <TASK>
> > > [ 702.241811] fprobe_handler+0x22/0x30
> > > [ 702.242129] 0xffffffffc04710f7
> > > [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> > > [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> > > [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> > > [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> > > [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> > > [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> > > [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> > > [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> > > [ 702.250785] ? preempt_count_sub+0x5/0xa0
> > > [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> > > [ 702.252368] ? preempt_count_sub+0x5/0xa0
> > > [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> > > [ 702.253918] do_syscall_64+0x16/0x90
> > > [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> > > [ 702.255422] RIP: 0033:0x46b793
> > >
> > > It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> > > function, which is not executed in rcu safe context so the kprobe handler
> > > on top of it will trigger the rcu warning.
> >
> > Why is that?
>
> It is caused by CONFIG_CONTEXT_TRACKING_USER=y, and it seems the
> preempt_count_sub is executed before the RCU is watching.
> user_exit_irqoff
> if (context_tracking_enabled()) // CONFIG_CONTEXT_TRACKING_USER=y
> __ct_user_exit(CONTEXT_USER);
> ct_kernel_enter
> ...
> // RCU is not watching here ...
> ct_kernel_enter_state(offset);
> // ... but is watching here.
>
> It can be reproduced with a simple bpf code as follows when
> CONFIG_CONTEXT_TRACKING_USER=y,
> SEC("kprobe.multi/preempt_count_sub")
> int kprobe_multi_trace()
> {
> return 0;
> }
>
> > preempt_count itself is fine.
> > The problem is elsewhere.
> > Since !rcu_is_watching() it some sort of idle or some other issue.
>
> Not sure if we need to improve the code under
> CONFIG_CONTEXT_TRACKING_USER=y, but it seems skipping "preempt_count_"
> in kprobe_multi test case would be a quick fix.
It's not a fix. Only moving a goal post.
We probably need
if (!rcu_is_watching())
return;
in [kf]probe handler instead.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-19 16:54 ` Alexei Starovoitov
@ 2023-03-19 18:12 ` Jiri Olsa
2023-03-20 11:34 ` Yafang Shao
1 sibling, 0 replies; 8+ messages in thread
From: Jiri Olsa @ 2023-03-19 18:12 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Yafang Shao, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, bpf
On Sun, Mar 19, 2023 at 09:54:56AM -0700, Alexei Starovoitov wrote:
> On Sun, Mar 19, 2023 at 03:36:57PM +0800, Yafang Shao wrote:
> > On Sat, Mar 18, 2023 at 12:52 AM Alexei Starovoitov
> > <alexei.starovoitov@gmail.com> wrote:
> > >
> > > On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
> > > >
> > > > It hits below warning on my test machine when running test_progs,
> > > >
> > > > [ 702.223611] ------------[ cut here ]------------
> > > > [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> > > > [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> > > > [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> > > > [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> > > > [ 702.241388] Call Trace:
> > > > [ 702.241615] <TASK>
> > > > [ 702.241811] fprobe_handler+0x22/0x30
> > > > [ 702.242129] 0xffffffffc04710f7
> > > > [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> > > > [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> > > > [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> > > > [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> > > > [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> > > > [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> > > > [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> > > > [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> > > > [ 702.250785] ? preempt_count_sub+0x5/0xa0
> > > > [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> > > > [ 702.252368] ? preempt_count_sub+0x5/0xa0
> > > > [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> > > > [ 702.253918] do_syscall_64+0x16/0x90
> > > > [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> > > > [ 702.255422] RIP: 0033:0x46b793
> > > >
> > > > It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> > > > function, which is not executed in rcu safe context so the kprobe handler
> > > > on top of it will trigger the rcu warning.
> > >
> > > Why is that?
> >
> > It is caused by CONFIG_CONTEXT_TRACKING_USER=y, and it seems the
> > preempt_count_sub is executed before the RCU is watching.
> > user_exit_irqoff
> > if (context_tracking_enabled()) // CONFIG_CONTEXT_TRACKING_USER=y
> > __ct_user_exit(CONTEXT_USER);
> > ct_kernel_enter
> > ...
> > // RCU is not watching here ...
> > ct_kernel_enter_state(offset);
> > // ... but is watching here.
> >
> > It can be reproduced with a simple bpf code as follows when
> > CONFIG_CONTEXT_TRACKING_USER=y,
> > SEC("kprobe.multi/preempt_count_sub")
> > int kprobe_multi_trace()
> > {
> > return 0;
> > }
> >
> > > preempt_count itself is fine.
> > > The problem is elsewhere.
> > > Since !rcu_is_watching() it some sort of idle or some other issue.
> >
> > Not sure if we need to improve the code under
> > CONFIG_CONTEXT_TRACKING_USER=y, but it seems skipping "preempt_count_"
> > in kprobe_multi test case would be a quick fix.
>
> It's not a fix. Only moving a goal post.
> We probably need
> if (!rcu_is_watching())
> return;
> in [kf]probe handler instead.
that might also help with some of the warnings we saw from idle
functions that we skip at the moment
jirka
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench
2023-03-19 16:54 ` Alexei Starovoitov
2023-03-19 18:12 ` Jiri Olsa
@ 2023-03-20 11:34 ` Yafang Shao
1 sibling, 0 replies; 8+ messages in thread
From: Yafang Shao @ 2023-03-20 11:34 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Martin KaFai Lau, Song Liu, Yonghong Song, John Fastabend,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf
On Mon, Mar 20, 2023 at 12:55 AM Alexei Starovoitov
<alexei.starovoitov@gmail.com> wrote:
>
> On Sun, Mar 19, 2023 at 03:36:57PM +0800, Yafang Shao wrote:
> > On Sat, Mar 18, 2023 at 12:52 AM Alexei Starovoitov
> > <alexei.starovoitov@gmail.com> wrote:
> > >
> > > On Fri, Mar 17, 2023 at 4:49 AM Yafang Shao <laoar.shao@gmail.com> wrote:
> > > >
> > > > It hits below warning on my test machine when running test_progs,
> > > >
> > > > [ 702.223611] ------------[ cut here ]------------
> > > > [ 702.224168] RCU not on for: preempt_count_sub+0x0/0xa0
> > > > [ 702.224770] WARNING: CPU: 14 PID: 5267 at include/linux/trace_recursion.h:162 fprobe_handler.part.0+0x1b8/0x1c0
> > > > [ 702.231740] CPU: 14 PID: 5267 Comm: main_amd64 Kdump: loaded Tainted: G O 6.2.0+ #584
> > > > [ 702.233169] RIP: 0010:fprobe_handler.part.0+0x1b8/0x1c0
> > > > [ 702.241388] Call Trace:
> > > > [ 702.241615] <TASK>
> > > > [ 702.241811] fprobe_handler+0x22/0x30
> > > > [ 702.242129] 0xffffffffc04710f7
> > > > [ 702.242417] RIP: 0010:preempt_count_sub+0x5/0xa0
> > > > [ 702.242809] Code: c8 50 68 94 42 0e b5 48 cf e9 f9 fd ff ff 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 e8 4b cd 38 0b <55> 8b 0d 9c d0 cf 02 48 89 e5 85 c9 75 1b 65 8b 05 be 78 f4 4a 89
> > > > [ 702.244752] RSP: 0018:ffffaf6187d27f10 EFLAGS: 00000082 ORIG_RAX: 0000000000000000
> > > > [ 702.245801] RAX: 000000000000000e RBX: 0000000001b6ab72 RCX: 0000000000000000
> > > > [ 702.246804] RDX: 0000000000000000 RSI: ffffffffb627967d RDI: 0000000000000001
> > > > [ 702.247801] RBP: ffffaf6187d27f30 R08: 0000000000000000 R09: 0000000000000000
> > > > [ 702.248786] R10: 0000000000000000 R11: 0000000000000000 R12: 00000000000000ca
> > > > [ 702.249782] R13: ffffaf6187d27f58 R14: 0000000000000000 R15: 0000000000000000
> > > > [ 702.250785] ? preempt_count_sub+0x5/0xa0
> > > > [ 702.251540] ? syscall_enter_from_user_mode+0x96/0xc0
> > > > [ 702.252368] ? preempt_count_sub+0x5/0xa0
> > > > [ 702.253104] ? syscall_enter_from_user_mode+0x96/0xc0
> > > > [ 702.253918] do_syscall_64+0x16/0x90
> > > > [ 702.254613] entry_SYSCALL_64_after_hwframe+0x72/0xdc
> > > > [ 702.255422] RIP: 0033:0x46b793
> > > >
> > > > It's caused by bench test attaching kprobe_multi link to preempt_count_sub
> > > > function, which is not executed in rcu safe context so the kprobe handler
> > > > on top of it will trigger the rcu warning.
> > >
> > > Why is that?
> >
> > It is caused by CONFIG_CONTEXT_TRACKING_USER=y, and it seems the
> > preempt_count_sub is executed before the RCU is watching.
> > user_exit_irqoff
> > if (context_tracking_enabled()) // CONFIG_CONTEXT_TRACKING_USER=y
> > __ct_user_exit(CONTEXT_USER);
> > ct_kernel_enter
> > ...
> > // RCU is not watching here ...
> > ct_kernel_enter_state(offset);
> > // ... but is watching here.
> >
> > It can be reproduced with a simple bpf code as follows when
> > CONFIG_CONTEXT_TRACKING_USER=y,
> > SEC("kprobe.multi/preempt_count_sub")
> > int kprobe_multi_trace()
> > {
> > return 0;
> > }
> >
> > > preempt_count itself is fine.
> > > The problem is elsewhere.
> > > Since !rcu_is_watching() it some sort of idle or some other issue.
> >
> > Not sure if we need to improve the code under
> > CONFIG_CONTEXT_TRACKING_USER=y, but it seems skipping "preempt_count_"
> > in kprobe_multi test case would be a quick fix.
>
> It's not a fix. Only moving a goal post.
> We probably need
> if (!rcu_is_watching())
> return;
> in [kf]probe handler instead.
Good suggestion. I will think about it.
BTW, we can't kprobe preempt_count_sub, because it is a nokprobe symbol.
NOKPROBE_SYMBOL(preempt_count_sub);
--
Regards
Yafang
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-03-20 11:35 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-17 11:48 [PATCH bpf-next] selftests/bpf: Filter out preempt_count_ functions from kprobe_multi bench Yafang Shao
2023-03-17 16:41 ` Andrii Nakryiko
2023-03-19 7:38 ` Yafang Shao
2023-03-17 16:51 ` Alexei Starovoitov
2023-03-19 7:36 ` Yafang Shao
2023-03-19 16:54 ` Alexei Starovoitov
2023-03-19 18:12 ` Jiri Olsa
2023-03-20 11:34 ` Yafang Shao
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.