-
Notifications
You must be signed in to change notification settings - Fork 5
bpf: Reject bpf_timer for PREEMPT_RT #5913
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpf: Reject bpf_timer for PREEMPT_RT #5913
Conversation
|
Upstream branch: e12873e |
2d215b0 to
05282f4
Compare
|
Upstream branch: 93a83d0 |
18dbfd8 to
4be95f7
Compare
05282f4 to
e2bfc81
Compare
|
Upstream branch: 60ef541 |
4be95f7 to
8790ca6
Compare
e2bfc81 to
ba991b7
Compare
When enable CONFIG_PREEMPT_RT, the kernel will panic when run timer
selftests by './test_progs -t timer':
[ 35.955287] BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
[ 35.955312] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 120, name: test_progs
[ 35.955315] preempt_count: 1, expected: 0
[ 35.955316] RCU nest depth: 0, expected: 0
[ 35.955317] 2 locks held by test_progs/120:
[ 35.955319] #0: ffffffff8f1c3720 (rcu_read_lock_trace){....}-{0:0}, at: bpf_prog_test_run_syscall+0xc9/0x240
[ 35.955358] #1: ffff9155fbd331c8 ((&c->lock)){+.+.}-{3:3}, at: ___slab_alloc+0xb0/0xd20
[ 35.955388] irq event stamp: 100
[ 35.955389] hardirqs last enabled at (99): [<ffffffff8dfcd890>] do_syscall_64+0x30/0x2d0
[ 35.955414] hardirqs last disabled at (100): [<ffffffff8d4a9baa>] __bpf_async_init+0xca/0x310
[ 35.955428] softirqs last enabled at (0): [<ffffffff8d296cbb>] copy_process+0x9db/0x2000
[ 35.955449] softirqs last disabled at (0): [<0000000000000000>] 0x0
[ 35.955482] CPU: 1 UID: 0 PID: 120 Comm: test_progs Tainted: G OE 6.17.0-rc1-gc5f5af560d8a #30 PREEMPT_{RT,(full)}
[ 35.955487] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[ 35.955488] Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 35.955491] Call Trace:
[ 35.955493] <TASK>
[ 35.955499] dump_stack_lvl+0x73/0xb0
[ 35.955514] dump_stack+0x14/0x20
[ 35.955518] __might_resched+0x167/0x230
[ 35.955537] rt_spin_lock+0x66/0x180
[ 35.955543] ? ___slab_alloc+0xb0/0xd20
[ 35.955549] ? bpf_map_kmalloc_node+0x7c/0x200
[ 35.955560] ___slab_alloc+0xb0/0xd20
[ 35.955575] ? __lock_acquire+0x43d/0x2590
[ 35.955601] __kmalloc_node_noprof+0x10b/0x410
[ 35.955605] ? __kmalloc_node_noprof+0x10b/0x410
[ 35.955607] ? bpf_map_kmalloc_node+0x7c/0x200
[ 35.955616] bpf_map_kmalloc_node+0x7c/0x200
[ 35.955624] __bpf_async_init+0xf8/0x310
[ 35.955633] bpf_timer_init+0x37/0x40
[ 35.955637] bpf_prog_2287350dd5909839_start_cb+0x5d/0x91
[ 35.955642] bpf_prog_0d54653d8a74e954_start_timer+0x65/0x8a
[ 35.955650] bpf_prog_test_run_syscall+0x111/0x240
[ 35.955660] __sys_bpf+0x81c/0x2ab0
[ 35.955665] ? __might_fault+0x47/0x90
[ 35.955700] __x64_sys_bpf+0x1e/0x30
[ 35.955703] x64_sys_call+0x171d/0x20d0
[ 35.955715] do_syscall_64+0x6a/0x2d0
[ 35.955722] entry_SYSCALL_64_after_hwframe+0x76/0x7e
[ 35.955728] RIP: 0033:0x7fee4261225d
[ 35.955734] Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 8b bb 0d 00 f7 d8 64 89 01 48
[ 35.955736] RSP: 002b:00007fee424e5bd8 EFLAGS: 00000202 ORIG_RAX: 0000000000000141
[ 35.955742] RAX: ffffffffffffffda RBX: 00007fee424e6cdc RCX: 00007fee4261225d
[ 35.955744] RDX: 0000000000000050 RSI: 00007fee424e5c20 RDI: 000000000000000a
[ 35.955745] RBP: 00007fee424e5bf0 R08: 0000000000000003 R09: 00007fee424e5c20
[ 35.955747] R10: 00007fffc266f910 R11: 0000000000000202 R12: 00007fee424e66c0
[ 35.955748] R13: ffffffffffffff08 R14: 0000000000000016 R15: 00007fffc266f650
[ 35.955766] </TASK>
In order to avoid such panic, reject bpf_timer in verifier when
PREEMPT_RT is enabled.
Signed-off-by: Leon Hwang <[email protected]>
When enable CONFIG_PREEMPT_RT, verifier will reject bpf_timer with returning -EOPNOTSUPP. Therefore, skip test cases when errno is EOPNOTSUPP. cd tools/testing/selftests/bpf ./test_progs -t timer 125 free_timer:SKIP 459 timer:SKIP 460/1 timer_crash/array:SKIP 460/2 timer_crash/hash:SKIP 460 timer_crash:SKIP 461 timer_interrupt:SKIP 462 timer_lockup:SKIP 463 timer_mim:SKIP Summary: 6/0 PASSED, 7 SKIPPED, 0 FAILED Signed-off-by: Leon Hwang <[email protected]>
|
Upstream branch: f859813 |
8790ca6 to
eecad5a
Compare
|
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=999857 expired. Closing PR. |
Pull request for series with
subject: bpf: Reject bpf_timer for PREEMPT_RT
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=999857