selftests/bpf: Test btf lookup helper sleepability

Add an expected failure case which calls
bpf_btf_find_by_name_kind() from a BPF timer callback. Without the
helper prototype being marked sleepable, the verifier accepts the
program and the load unexpectedly succeeds.

Also add a positive control which calls the helper directly from a
syscall program. This verifies that marking the helper sleepable only
rejects it in non-sleepable regions.

Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260903214758.2727663-5-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Kumar Kartikeya Dwivedi 2026-09-03 23:47:50 +02:00 committed by Alexei Starovoitov
parent 620614bf76
commit 687b2729ce

View File

@ -108,6 +108,30 @@ int timer_sys_close_prog(void *ctx)
return 0;
}
static int timer_btf_find_cb(void *map, int *key, struct bpf_timer *timer)
{
char name[] = "task_struct";
bpf_btf_find_by_name_kind(name, sizeof(name), BTF_KIND_STRUCT, 0);
return 0;
}
SEC("syscall")
__failure __msg("sleepable helper bpf_btf_find_by_name_kind#{{[0-9]+}} in non-sleepable prog")
int timer_btf_find_prog(void *ctx)
{
struct timer_elem *val;
int key = 0;
val = bpf_map_lookup_elem(&timer_map, &key);
if (!val)
return 0;
bpf_timer_init(&val->t, &timer_map, 0);
bpf_timer_set_callback(&val->t, timer_btf_find_cb);
return 0;
}
SEC("syscall")
__success
int syscall_sys_bpf_prog(void *ctx)
@ -126,6 +150,16 @@ int syscall_sys_close_prog(void *ctx)
return 0;
}
SEC("syscall")
__success
int syscall_btf_find_prog(void *ctx)
{
char name[] = "task_struct";
bpf_btf_find_by_name_kind(name, sizeof(name), BTF_KIND_STRUCT, 0);
return 0;
}
/* Workqueue tests */
struct wq_elem {