On Fri, 2024-03-15 at 15:29 +0100, Benjamin Tissoires wrote: This patch looks good to me, please see two nitpicks below. Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> [...] > @@ -1350,6 +1358,11 @@ BPF_CALL_3(bpf_timer_start, struct bpf_timer_kern *, timer, u64, nsecs, u64, fla > goto out; > } > > + if (t->is_sleepable && !(flags & BPF_F_TIMER_SLEEPABLE)) { > + ret = -EINVAL; > + goto out; > + } Nit: the BPF_F_TIMER_ABS and BPF_F_TIMER_CPU_PIN don't affect sleepable timers, should this check be changed to: '(t->is_sleepable && flags != BPF_F_TIMER_SLEEPABLE)' ? [...] > @@ -12151,6 +12175,16 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn, > } > } > > + if (is_async_callback_calling_kfunc(meta.func_id)) { > + err = push_callback_call(env, insn, insn_idx, meta.subprogno, > + set_timer_callback_state); Nit: still think that this fragment would be better as: if (is_bpf_timer_set_sleepable_cb_impl_kfunc(meta.func_id)) { err = push_callback_call(env, insn, insn_idx, meta.subprogno, set_timer_callback_state); Because of the 'set_timer_callback_state' passed to push_callback_call(). > + if (err) { > + verbose(env, "kfunc %s#%d failed callback verification\n", > + func_name, meta.func_id); > + return err; > + } > + } > + > rcu_lock = is_kfunc_bpf_rcu_read_lock(&meta); > rcu_unlock = is_kfunc_bpf_rcu_read_unlock(&meta); >