Commit baba677
committed
bpf: Fix kernel warning with streams on 32-bit systems
BPF selftests for streams commonly trigger warnings on 32-bit armhf like:
root@qemu-armhf:~/kselftests-bpf# ./test_progs -a stream_syscall
------------[ cut here ]------------
WARNING: CPU: 0 PID: 86 at kernel/bpf/stream.c:107 bpf_stream_page_check_room+0x78/0x7c
Modules linked in: bpf_testmod(OE)
CPU: 0 UID: 0 PID: 86 Comm: test_progs Tainted: G OE 6.16.0-rc3-00371-g38238de3a9ea torvalds#44 NONE
Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
Hardware name: Generic DT based system
Call trace:
dump_backtrace from show_stack+0x20/0x24
r7:c031a62c r6:00000009 r5:600f0093 r4:c12b927c
show_stack from dump_stack_lvl+0x70/0x7c
dump_stack_lvl from dump_stack+0x18/0x1c
r5:0000006b r4:c12cd464
dump_stack from __warn+0x8c/0x128
__warn from warn_slowpath_fmt+0x184/0x18c
r8:ddde5f40 r7:c031a62c r6:c12cd464 r5:00000000 r4:c189b304
warn_slowpath_fmt from bpf_stream_page_check_room+0x78/0x7c
r7:c2e2a907 r6:00000003 r5:00000fec r4:00000fec
bpf_stream_page_check_room from bpf_stream_page_reserve_elem+0x3c/0x12c
r7:c2e2a907 r6:800f0013 r5:00000003 r4:c4012000
bpf_stream_page_reserve_elem from bpf_stream_elem_alloc+0x5c/0x70
r7:c2e2a907 r6:800f0013 r5:00000000 r4:c189af5c
bpf_stream_elem_alloc from bpf_stream_vprintk+0x134/0x1a8
r7:c2e2a907 r6:c274c400 r5:00000000 r4:00000000
bpf_stream_vprintk from bpf_prog_acae6871cd11984a_stream_syscall+0xe4/0x12c
r9:ffffffff r8:fffffff8 r7:ffffffff r6:c031ab50 r5:be920898 r4:c2cd2a00
bpf_prog_acae6871cd11984a_stream_syscall from bpf_prog_test_run_syscall+0xdc/0x2ac
r10:df93b000 r9:00000000 r8:00000051 r7:00000000 r6:00000000 r5:be920898
r4:c2cd2a00
bpf_prog_test_run_syscall from __sys_bpf+0x580/0xda8
r10:00000000 r9:be920898 r8:00000051 r7:00000000 r6:0000000a r5:dfb55eb0
r4:df93b000
__sys_bpf from sys_bpf+0x34/0x3c
r10:00000182 r9:c2cd2a00 r8:c0100268 r7:00000182 r6:0000000a r5:be920898
r4:00000050
sys_bpf from ret_fast_syscall+0x0/0x54
Exception stack(0xdfb55fa8 to 0xdfb55ff0)
5fa0: 00000050 be920898 0000000a be920898 00000050 012abc70
5fc0: 00000050 be920898 0000000a 00000182 008c5319 b6f6bd80 00000000 012c27b8
5fe0: be920870 be920860 008ee593 b6e79f72
---[ end trace 0000000000000000 ]---
torvalds#404 stream_syscall:OK
Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED
This occurs because streams kernel code assumes 8-byte char buf alignment
within both 'struct bpf_stream_page' and 'struct bpf_stream_elem', and
makes bpf_stream_page_push_elem() round up consumed space to 8-bytes. This
scheme breaks on 32-bit because bpf_stream_elem member 'struct llist_node'
is pointer-sized and so triggers a warning in bpf_stream_page_check_room():
int min = offsetof(struct bpf_stream_elem, str[0]);
int consumed = stream_page->consumed;
int total = BPF_STREAM_PAGE_SZ;
int rem = max(0, total - consumed - min);
/* Let's give room of at least 8 bytes. */
WARN_ON_ONCE(rem % 8 != 0);
Fix by instead rounding and checking alignment against 'sizeof(long)'.
Fixes: 5ab154f ("bpf: Introduce BPF standard streams")
Signed-off-by: Tony Ambardar <[email protected]>1 parent 44b1843 commit baba677
1 file changed
+2
-2
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | | - | |
| 107 | + | |
108 | 108 | | |
109 | 109 | | |
110 | 110 | | |
| |||
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
130 | | - | |
| 130 | + | |
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
| |||
0 commit comments