Introduce a 'jit_required' bitfield flag at the end of the flags group in struct bpf_prog. This bit tracks whether a program strictly requires the JIT compiler. Set this flag to 1 when a kfunc call is added at the end of bpf_add_kfunc_call(). In __bpf_prog_select_runtime(), check with fp->jit_required rather than bpf_prog_has_kfunc_call() to unify the logic. Suggested-by: Alexei Starovoitov Suggested-by: KaFai Wan Signed-off-by: Tiezhu Yang --- include/linux/bpf.h | 3 ++- kernel/bpf/core.c | 3 +-- kernel/bpf/verifier.c | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index ba09795e0bfd..4e2b059d71f3 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1880,7 +1880,8 @@ struct bpf_prog { call_get_func_ip:1, /* Do we call get_func_ip() */ call_session_cookie:1, /* Do we call bpf_session_cookie() */ tstamp_type_access:1, /* Accessed __sk_buff->tstamp_type */ - sleepable:1; /* BPF program is sleepable */ + sleepable:1, /* BPF program is sleepable */ + jit_required:1; /* program strictly requires JIT compiler */ enum bpf_prog_type type; /* Type of BPF program */ enum bpf_attach_type expected_attach_type; /* For some prog types */ u32 len; /* Number of filter blocks */ diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 649cce41e13f..5fcd19ccb41a 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2619,8 +2619,7 @@ struct bpf_prog *__bpf_prog_select_runtime(struct bpf_verifier_env *env, struct if (fp->bpf_func) goto finalize; - if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) || - bpf_prog_has_kfunc_call(fp)) + if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) || fp->jit_required) jit_needed = true; if (!bpf_prog_select_interpreter(fp)) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 25aea4271cd0..f496b45b9da4 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -2765,6 +2765,8 @@ int bpf_add_kfunc_call(struct bpf_verifier_env *env, u32 func_id, u16 offset) desc->func_model = func_model; sort(tab->descs, tab->nr_descs, sizeof(tab->descs[0]), kfunc_desc_cmp_by_id_off, NULL); + + env->prog->jit_required = 1; return 0; } -- 2.42.0