]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Allow BPF stream kfuncs while holding a lock
authorEmil Tsalapatis <emil@etsalapatis.com>
Tue, 3 Feb 2026 18:04:23 +0000 (13:04 -0500)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 3 Feb 2026 18:41:16 +0000 (10:41 -0800)
The BPF stream kfuncs bpf_stream_vprintk and bpf_stream_print_stack
do not sleep and so are safe to call while holding a lock. Amend
the verifier to allow that.

Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260203180424.14057-4-emil@etsalapatis.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index da03bbbc1620a13e8916bd106cdec0cc1ec145a8..6a616dc4dc542a18e55d76170a812e680164d953 100644 (file)
@@ -12455,6 +12455,8 @@ enum special_kfunc_type {
        KF_bpf_arena_free_pages,
        KF_bpf_arena_reserve_pages,
        KF_bpf_session_is_return,
+       KF_bpf_stream_vprintk,
+       KF_bpf_stream_print_stack,
 };
 
 BTF_ID_LIST(special_kfunc_list)
@@ -12533,6 +12535,8 @@ BTF_ID(func, bpf_arena_alloc_pages)
 BTF_ID(func, bpf_arena_free_pages)
 BTF_ID(func, bpf_arena_reserve_pages)
 BTF_ID(func, bpf_session_is_return)
+BTF_ID(func, bpf_stream_vprintk)
+BTF_ID(func, bpf_stream_print_stack)
 
 static bool is_task_work_add_kfunc(u32 func_id)
 {
@@ -12977,10 +12981,17 @@ static bool is_bpf_arena_kfunc(u32 btf_id)
               btf_id == special_kfunc_list[KF_bpf_arena_reserve_pages];
 }
 
+static bool is_bpf_stream_kfunc(u32 btf_id)
+{
+       return btf_id == special_kfunc_list[KF_bpf_stream_vprintk] ||
+              btf_id == special_kfunc_list[KF_bpf_stream_print_stack];
+}
+
 static bool kfunc_spin_allowed(u32 btf_id)
 {
        return is_bpf_graph_api_kfunc(btf_id) || is_bpf_iter_num_api_kfunc(btf_id) ||
-              is_bpf_res_spin_lock_kfunc(btf_id) || is_bpf_arena_kfunc(btf_id);
+              is_bpf_res_spin_lock_kfunc(btf_id) || is_bpf_arena_kfunc(btf_id) ||
+              is_bpf_stream_kfunc(btf_id);
 }
 
 static bool is_sync_callback_calling_kfunc(u32 btf_id)