mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 23:13:00 +00:00
bpf: introduce in_sleepable() helper
No code change, but it'll allow to have only one place to change everything when we add in_sleepable in cur_state. Signed-off-by: Benjamin Tissoires <bentiss@kernel.org> Link: https://lore.kernel.org/r/20240221-hid-bpf-sleepable-v3-2-1fb378ca6301@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
55bad79e33
commit
dfe6625df4
|
@ -5255,6 +5255,11 @@ bad_type:
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static bool in_sleepable(struct bpf_verifier_env *env)
|
||||
{
|
||||
return env->prog->aux->sleepable;
|
||||
}
|
||||
|
||||
/* The non-sleepable programs and sleepable programs with explicit bpf_rcu_read_lock()
|
||||
* can dereference RCU protected pointers and result is PTR_TRUSTED.
|
||||
*/
|
||||
|
@ -5262,7 +5267,7 @@ static bool in_rcu_cs(struct bpf_verifier_env *env)
|
|||
{
|
||||
return env->cur_state->active_rcu_lock ||
|
||||
env->cur_state->active_lock.ptr ||
|
||||
!env->prog->aux->sleepable;
|
||||
!in_sleepable(env);
|
||||
}
|
||||
|
||||
/* Once GCC supports btf_type_tag the following mechanism will be replaced with tag check */
|
||||
|
@ -10164,7 +10169,7 @@ static int check_helper_call(struct bpf_verifier_env *env, struct bpf_insn *insn
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!env->prog->aux->sleepable && fn->might_sleep) {
|
||||
if (!in_sleepable(env) && fn->might_sleep) {
|
||||
verbose(env, "helper call might sleep in a non-sleepable prog\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -10194,7 +10199,7 @@ static int check_helper_call(struct bpf_verifier_env *env, struct bpf_insn *insn
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (env->prog->aux->sleepable && is_storage_get_function(func_id))
|
||||
if (in_sleepable(env) && is_storage_get_function(func_id))
|
||||
env->insn_aux_data[insn_idx].storage_get_func_atomic = true;
|
||||
}
|
||||
|
||||
|
@ -11535,7 +11540,7 @@ static bool check_css_task_iter_allowlist(struct bpf_verifier_env *env)
|
|||
return true;
|
||||
fallthrough;
|
||||
default:
|
||||
return env->prog->aux->sleepable;
|
||||
return in_sleepable(env);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12056,7 +12061,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
|
|||
}
|
||||
|
||||
sleepable = is_kfunc_sleepable(&meta);
|
||||
if (sleepable && !env->prog->aux->sleepable) {
|
||||
if (sleepable && !in_sleepable(env)) {
|
||||
verbose(env, "program must be sleepable to call sleepable kfunc %s\n", func_name);
|
||||
return -EACCES;
|
||||
}
|
||||
|
@ -19669,7 +19674,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
|
|||
}
|
||||
|
||||
if (is_storage_get_function(insn->imm)) {
|
||||
if (!env->prog->aux->sleepable ||
|
||||
if (!in_sleepable(env) ||
|
||||
env->insn_aux_data[i + delta].storage_get_func_atomic)
|
||||
insn_buf[0] = BPF_MOV64_IMM(BPF_REG_5, (__force __s32)GFP_ATOMIC);
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue
Block a user