@@ -512,7 +512,7 @@ static bool is_async_callback_calling_kfunc(u32 btf_id);
512512static bool is_callback_calling_kfunc(u32 btf_id);
513513static bool is_bpf_throw_kfunc(struct bpf_insn *insn);
514514
515- static bool is_bpf_wq_set_callback_impl_kfunc (u32 btf_id);
515+ static bool is_bpf_wq_set_callback_kfunc (u32 btf_id);
516516static bool is_task_work_add_kfunc(u32 func_id);
517517
518518static bool is_sync_callback_calling_function(enum bpf_func_id func_id)
@@ -554,7 +554,7 @@ static bool is_async_cb_sleepable(struct bpf_verifier_env *env, struct bpf_insn
554554
555555 /* bpf_wq and bpf_task_work callbacks are always sleepable. */
556556 if (bpf_pseudo_kfunc_call(insn) && insn->off == 0 &&
557- (is_bpf_wq_set_callback_impl_kfunc (insn->imm) || is_task_work_add_kfunc(insn->imm)))
557+ (is_bpf_wq_set_callback_kfunc (insn->imm) || is_task_work_add_kfunc(insn->imm)))
558558 return true;
559559
560560 verifier_bug(env, "unhandled async callback in is_async_cb_sleepable");
@@ -3267,7 +3267,8 @@ static struct btf *find_kfunc_desc_btf(struct bpf_verifier_env *env, s16 offset)
32673267 * magic_kfuncs is used as a list of (foo, foo_impl) pairs
32683268 */
32693269BTF_ID_LIST(magic_kfuncs)
3270- BTF_ID_UNUSED
3270+ BTF_ID(func, bpf_wq_set_callback)
3271+ BTF_ID(func, bpf_wq_set_callback_impl)
32713272BTF_ID_LIST_END(magic_kfuncs)
32723273
32733274static s32 magic_kfunc_by_impl(s32 impl_func_id)
@@ -12385,6 +12386,7 @@ enum special_kfunc_type {
1238512386 KF___bpf_trap,
1238612387 KF_bpf_task_work_schedule_signal,
1238712388 KF_bpf_task_work_schedule_resume,
12389+ KF_bpf_wq_set_callback,
1238812390};
1238912391
1239012392BTF_ID_LIST(special_kfunc_list)
@@ -12459,6 +12461,7 @@ BTF_ID(func, bpf_dynptr_file_discard)
1245912461BTF_ID(func, __bpf_trap)
1246012462BTF_ID(func, bpf_task_work_schedule_signal)
1246112463BTF_ID(func, bpf_task_work_schedule_resume)
12464+ BTF_ID(func, bpf_wq_set_callback)
1246212465
1246312466static bool is_task_work_add_kfunc(u32 func_id)
1246412467{
@@ -12906,7 +12909,7 @@ static bool is_sync_callback_calling_kfunc(u32 btf_id)
1290612909
1290712910static bool is_async_callback_calling_kfunc(u32 btf_id)
1290812911{
12909- return btf_id == special_kfunc_list[KF_bpf_wq_set_callback_impl] ||
12912+ return is_bpf_wq_set_callback_kfunc( btf_id) ||
1291012913 is_task_work_add_kfunc(btf_id);
1291112914}
1291212915
@@ -12916,9 +12919,10 @@ static bool is_bpf_throw_kfunc(struct bpf_insn *insn)
1291612919 insn->imm == special_kfunc_list[KF_bpf_throw];
1291712920}
1291812921
12919- static bool is_bpf_wq_set_callback_impl_kfunc (u32 btf_id)
12922+ static bool is_bpf_wq_set_callback_kfunc (u32 btf_id)
1292012923{
12921- return btf_id == special_kfunc_list[KF_bpf_wq_set_callback_impl];
12924+ return btf_id == special_kfunc_list[KF_bpf_wq_set_callback_impl] ||
12925+ btf_id == special_kfunc_list[KF_bpf_wq_set_callback];
1292212926}
1292312927
1292412928static bool is_callback_calling_kfunc(u32 btf_id)
@@ -14035,7 +14039,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
1403514039 meta.r0_rdonly = false;
1403614040 }
1403714041
14038- if (is_bpf_wq_set_callback_impl_kfunc (meta.func_id)) {
14042+ if (is_bpf_wq_set_callback_kfunc (meta.func_id)) {
1403914043 err = push_callback_call(env, insn, insn_idx, meta.subprogno,
1404014044 set_timer_callback_state);
1404114045 if (err) {
0 commit comments