Skip to content

Commit 906bd22

Browse files
kkdwivediAlexei Starovoitov
authored andcommitted
selftests/bpf: Add selftest for check_stack_max_depth bug
Use the bpf_timer_set_callback helper to mark timer_cb as an async callback, and put a direct call to timer_cb in the main subprog. As the check_stack_max_depth happens after the do_check pass, the order does not matter. Without the previous fix, the test passes successfully. Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 5415ccd commit 906bd22

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <test_progs.h>
3+
4+
#include "async_stack_depth.skel.h"
5+
6+
void test_async_stack_depth(void)
7+
{
8+
RUN_TESTS(async_stack_depth);
9+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <vmlinux.h>
3+
#include <bpf/bpf_helpers.h>
4+
5+
#include "bpf_misc.h"
6+
7+
struct hmap_elem {
8+
struct bpf_timer timer;
9+
};
10+
11+
struct {
12+
__uint(type, BPF_MAP_TYPE_HASH);
13+
__uint(max_entries, 64);
14+
__type(key, int);
15+
__type(value, struct hmap_elem);
16+
} hmap SEC(".maps");
17+
18+
__attribute__((noinline))
19+
static int timer_cb(void *map, int *key, struct bpf_timer *timer)
20+
{
21+
volatile char buf[256] = {};
22+
return buf[69];
23+
}
24+
25+
SEC("tc")
26+
__failure __msg("combined stack size of 2 calls")
27+
int prog(struct __sk_buff *ctx)
28+
{
29+
struct hmap_elem *elem;
30+
volatile char buf[256] = {};
31+
32+
elem = bpf_map_lookup_elem(&hmap, &(int){0});
33+
if (!elem)
34+
return 0;
35+
36+
timer_cb(NULL, NULL, NULL);
37+
return bpf_timer_set_callback(&elem->timer, timer_cb) + buf[0];
38+
}
39+
40+
char _license[] SEC("license") = "GPL";

0 commit comments

Comments
 (0)