Skip to content

Commit 828d9d7

Browse files
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 e5799c6 commit 828d9d7

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kernel/bpf/stream.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ static int bpf_stream_page_check_room(struct bpf_stream_page *stream_page, int l
104104
int rem = max(0, total - consumed - min);
105105

106106
/* Let's give room of at least 8 bytes. */
107-
WARN_ON_ONCE(rem % 8 != 0);
107+
WARN_ON_ONCE(rem % sizeof(long) != 0);
108108
rem = rem < 8 ? 0 : rem;
109109
return min(len, rem);
110110
}
@@ -127,7 +127,7 @@ static struct bpf_stream_elem *bpf_stream_page_push_elem(struct bpf_stream_page
127127
{
128128
u32 consumed = stream_page->consumed;
129129

130-
stream_page->consumed += round_up(offsetof(struct bpf_stream_elem, str[len]), 8);
130+
stream_page->consumed += round_up(offsetof(struct bpf_stream_elem, str[len]), sizeof(long));
131131
return (struct bpf_stream_elem *)&stream_page->buf[consumed];
132132
}
133133

0 commit comments

Comments
 (0)