Commit fd92d664 authored by Anders Roxell's avatar Anders Roxell Committed by Daniel Borkmann

bpf: test_bpf: turn off preemption in function __run_once

When running BPF test suite the following splat occurs:

[  415.930950] test_bpf: #0 TAX jited:0
[  415.931067] BUG: assuming atomic context at lib/test_bpf.c:6674
[  415.946169] in_atomic(): 0, irqs_disabled(): 0, pid: 11556, name: modprobe
[  415.953176] INFO: lockdep is turned off.
[  415.957207] CPU: 1 PID: 11556 Comm: modprobe Tainted: G        W         5.0.0-rc7-next-20190220 #1
[  415.966328] Hardware name: HiKey Development Board (DT)
[  415.971592] Call trace:
[  415.974069]  dump_backtrace+0x0/0x160
[  415.977761]  show_stack+0x24/0x30
[  415.981104]  dump_stack+0xc8/0x114
[  415.984534]  __cant_sleep+0xf0/0x108
[  415.988145]  test_bpf_init+0x5e0/0x1000 [test_bpf]
[  415.992971]  do_one_initcall+0x90/0x428
[  415.996837]  do_init_module+0x60/0x1e4
[  416.000614]  load_module+0x1de0/0x1f50
[  416.004391]  __se_sys_finit_module+0xc8/0xe0
[  416.008691]  __arm64_sys_finit_module+0x24/0x30
[  416.013255]  el0_svc_common+0x78/0x130
[  416.017031]  el0_svc_handler+0x38/0x78
[  416.020806]  el0_svc+0x8/0xc

Rework so that preemption is disabled when we loop over function
'BPF_PROG_RUN(...)'.

Fixes: 568f1967 ("bpf: check that BPF programs run with preemption disabled")
Suggested-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarAnders Roxell <anders.roxell@linaro.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 915654fd
...@@ -6668,12 +6668,14 @@ static int __run_one(const struct bpf_prog *fp, const void *data, ...@@ -6668,12 +6668,14 @@ static int __run_one(const struct bpf_prog *fp, const void *data,
u64 start, finish; u64 start, finish;
int ret = 0, i; int ret = 0, i;
preempt_disable();
start = ktime_get_ns(); start = ktime_get_ns();
for (i = 0; i < runs; i++) for (i = 0; i < runs; i++)
ret = BPF_PROG_RUN(fp, data); ret = BPF_PROG_RUN(fp, data);
finish = ktime_get_ns(); finish = ktime_get_ns();
preempt_enable();
*duration = finish - start; *duration = finish - start;
do_div(*duration, runs); do_div(*duration, runs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment