* [PATCH bpf-next v7 0/2] Introduce jit_required to prevent a kernel panic
@ 2026-07-02 14:36 Tiezhu Yang
2026-07-02 14:36 ` [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path Tiezhu Yang
2026-07-02 14:36 ` [PATCH bpf-next v7 2/2] bpf: Reject programs with inlined helpers if JIT is unavailable Tiezhu Yang
0 siblings, 2 replies; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-02 14:36 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis, KaFai Wan
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
This series introduces a 'jit_required' flag in struct bpf_prog
to track programs that strictly require JIT.
The aim is to reject loading programs with inlined helpers when
JIT is unavailable to prevent a kernel panic.
Tiezhu Yang (2):
bpf: Introduce jit_required flag and refactor kfunc path
bpf: Reject programs with inlined helpers if JIT is unavailable
include/linux/bpf.h | 3 ++-
kernel/bpf/core.c | 3 +--
kernel/bpf/fixups.c | 4 +++-
kernel/bpf/verifier.c | 2 ++
4 files changed, 8 insertions(+), 4 deletions(-)
--
2.42.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-02 14:36 [PATCH bpf-next v7 0/2] Introduce jit_required to prevent a kernel panic Tiezhu Yang
@ 2026-07-02 14:36 ` Tiezhu Yang
2026-07-03 13:55 ` KaFai Wan
2026-07-02 14:36 ` [PATCH bpf-next v7 2/2] bpf: Reject programs with inlined helpers if JIT is unavailable Tiezhu Yang
1 sibling, 1 reply; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-02 14:36 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis, KaFai Wan
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
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 <ast@kernel.org>
Suggested-by: KaFai Wan <kafai.wan@linux.dev>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
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
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH bpf-next v7 2/2] bpf: Reject programs with inlined helpers if JIT is unavailable
2026-07-02 14:36 [PATCH bpf-next v7 0/2] Introduce jit_required to prevent a kernel panic Tiezhu Yang
2026-07-02 14:36 ` [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path Tiezhu Yang
@ 2026-07-02 14:36 ` Tiezhu Yang
1 sibling, 0 replies; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-02 14:36 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis, KaFai Wan
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
When an architecture implements bpf_jit_inlines_helper_call() (such as
LoongArch, ARM64, PowerPC, and RISC-V), the verifier skips rewriting the
helper call offset (insn->imm) during the bpf_do_misc_fixups() phase,
because the helper is expected to be inlined by the JIT compiler. As a
result, insn->imm remains as the raw helper enum ID.
However, if JIT is disabled at runtime (net.core.bpf_jit_enable=0) or
if the JIT compilation later dynamically fails (e.g., due to OOM), the
core BPF subsystem falls back to the BPF interpreter.
When the interpreter executes (__bpf_call_base + insn->imm) with the
unpatched raw helper ID, it jumps into an unaligned invalid address
space, triggering an instruction alignment fault or a memory access
panic.
Fix this by setting 'jit_required' to 1 when helper call rewriting is
skipped for JIT inlining. During runtime selection, if JIT compilation
is not available, explicitly reject loading with -ENOTSUPP based on
this flag to safely prevent the kernel panic.
Fixes: 2ddec2c80b44 ("riscv, bpf: inline bpf_get_smp_processor_id()")
Suggested-by: Alexei Starovoitov <ast@kernel.org>
Suggested-by: KaFai Wan <kafai.wan@linux.dev>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
kernel/bpf/fixups.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
index 12a8a4eb757f..94e0457a0aa3 100644
--- a/kernel/bpf/fixups.c
+++ b/kernel/bpf/fixups.c
@@ -1841,8 +1841,10 @@ int bpf_do_misc_fixups(struct bpf_verifier_env *env)
}
/* Skip inlining the helper call if the JIT does it. */
- if (bpf_jit_inlines_helper_call(insn->imm))
+ if (bpf_jit_inlines_helper_call(insn->imm)) {
+ prog->jit_required = 1;
goto next_insn;
+ }
if (insn->imm == BPF_FUNC_get_route_realm)
prog->dst_needed = 1;
--
2.42.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-02 14:36 ` [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path Tiezhu Yang
@ 2026-07-03 13:55 ` KaFai Wan
2026-07-03 16:14 ` Tiezhu Yang
0 siblings, 1 reply; 11+ messages in thread
From: KaFai Wan @ 2026-07-03 13:55 UTC (permalink / raw)
To: Tiezhu Yang, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
> 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 <ast@kernel.org>
> Suggested-by: KaFai Wan <kafai.wan@linux.dev>
> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> ---
> 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
> */
In v6 you're using 'u8 jit_required', I thought it would be 'u8 jit_required:1', so we use one byte
and left 3 byte hole for future use.
This version left 2 bytes hole, same as v5, but it can easily be misleading because of the u16 type,
since we used 17 bits. I prefer v5, it has better readability.
> 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;
That's ok, and I think Sashiko is right about this patch.
> return 0;
> }
>
--
Thanks,
KaFai
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-03 13:55 ` KaFai Wan
@ 2026-07-03 16:14 ` Tiezhu Yang
2026-07-04 1:57 ` KaFai Wan
2026-07-04 2:05 ` KaFai Wan
0 siblings, 2 replies; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-03 16:14 UTC (permalink / raw)
To: KaFai Wan, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
On 7/3/26 21:55, KaFai Wan wrote:
> On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
>> 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 <ast@kernel.org>
>> Suggested-by: KaFai Wan <kafai.wan@linux.dev>
>> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
>> ---
>> 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
>> */
>
> In v6 you're using 'u8 jit_required', I thought it would be 'u8 jit_required:1', so we use one byte
> and left 3 byte hole for future use.
>
> This version left 2 bytes hole, same as v5, but it can easily be misleading because of the u16 type,
> since we used 17 bits. I prefer v5, it has better readability.
OK, I will use the previous layout in v8, like this:
```
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index ba09795e0bfd..463fae6a5c33 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1865,8 +1865,9 @@ struct bpf_prog_aux {
struct bpf_prog {
u16 pages; /* Number of allocated pages */
- u16 jited:1, /* Is our filter JIT'ed? */
+ u32 jited:1, /* Is our filter JIT'ed? */
jit_requested:1,/* archs need to JIT the prog */
+ jit_required:1, /* program strictly requires JIT compiler */
gpl_compatible:1, /* Is filter GPL compatible? */
cb_access:1, /* Is control block accessed? */
dst_needed:1, /* Do we need dst entry? */
```
>
>> 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;
>
> That's ok, and I think Sashiko is right about this patch.
>
>> return 0;
>> }
As discussed in another thread, I will update bpf_prog_has_kfunc_call()
in v8, like this:
```
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 25aea4271cd0..c34cc524651a 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2770,7 +2770,7 @@ int bpf_add_kfunc_call(struct bpf_verifier_env
*env, u32 func_id, u16 offset)
bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog)
{
- return !!prog->aux->kfunc_tab;
+ return prog->aux->kfunc_tab && prog->aux->kfunc_tab->nr_descs;
}
static int add_subprog_and_kfunc(struct bpf_verifier_env *env)
```
IIUC, there are two places to modify so far:
(1) struct bpf_prog
(2) bpf_prog_has_kfunc_call()
If you have any more comments, please let me know.
Thanks,
Tiezhu
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-03 16:14 ` Tiezhu Yang
@ 2026-07-04 1:57 ` KaFai Wan
2026-07-06 0:56 ` Tiezhu Yang
2026-07-04 2:05 ` KaFai Wan
1 sibling, 1 reply; 11+ messages in thread
From: KaFai Wan @ 2026-07-04 1:57 UTC (permalink / raw)
To: Tiezhu Yang, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
> On 7/3/26 21:55, KaFai Wan wrote:
> > On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
> > > 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 <ast@kernel.org>
> > > Suggested-by: KaFai Wan <kafai.wan@linux.dev>
> > > Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> > > ---
> > > 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
> > > */
> >
> > In v6 you're using 'u8 jit_required', I thought it would be 'u8 jit_required:1', so we use one
> > byte
> > and left 3 byte hole for future use.
> >
> > This version left 2 bytes hole, same as v5, but it can easily be misleading because of the u16
> > type,
> > since we used 17 bits. I prefer v5, it has better readability.
>
> OK, I will use the previous layout in v8, like this:
>
> ```
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index ba09795e0bfd..463fae6a5c33 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -1865,8 +1865,9 @@ struct bpf_prog_aux {
>
> struct bpf_prog {
> u16 pages; /* Number of allocated pages */
> - u16 jited:1, /* Is our filter JIT'ed? */
> + u32 jited:1, /* Is our filter JIT'ed? */
> jit_requested:1,/* archs need to JIT the prog */
> + jit_required:1, /* program strictly requires JIT compiler */
> gpl_compatible:1, /* Is filter GPL compatible? */
> cb_access:1, /* Is control block accessed? */
> dst_needed:1, /* Do we need dst entry? */
> ```
>
> >
> > > 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;
> >
> > That's ok, and I think Sashiko is right about this patch.
> >
> > > return 0;
> > > }
>
> As discussed in another thread, I will update bpf_prog_has_kfunc_call()
> in v8, like this:
>
> ```
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index 25aea4271cd0..c34cc524651a 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -2770,7 +2770,7 @@ int bpf_add_kfunc_call(struct bpf_verifier_env
> *env, u32 func_id, u16 offset)
>
> bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog)
> {
> - return !!prog->aux->kfunc_tab;
> + return prog->aux->kfunc_tab && prog->aux->kfunc_tab->nr_descs;
> }
>
> static int add_subprog_and_kfunc(struct bpf_verifier_env *env)
> ```
>
> IIUC, there are two places to modify so far:
> (1) struct bpf_prog
yes
> (2) bpf_prog_has_kfunc_call()
I think we can remove this func.
actually, I feed your patch to dsv4-pro and gpt-5.4 yesterday, both point out the we should do this
and change the log message.
diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
index 12a8a4eb757f..7fb92b5fa415 100644
--- a/kernel/bpf/fixups.c
+++ b/kernel/bpf/fixups.c
@@ -1378,7 +1378,6 @@ int bpf_fixup_call_args(struct bpf_verifier_env *env)
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
struct bpf_prog *prog = env->prog;
struct bpf_insn *insn = prog->insnsi;
- bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
int depth;
#endif
int i, err = 0;
@@ -1404,7 +1403,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env *env)
return err;
}
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
- if (has_kfunc_call) {
+ if (prog->jit_required) {
verbose(env, "calling kernel functions are not allowed in non-JITed programs\n");
return -EINVAL;
}
I think we can change the log message for general purpose no just for kunc, so we can know why prog
failed in patch#2 as you test yesterday.
>
> If you have any more comments, please let me know.
>
> Thanks,
> Tiezhu
>
--
Thanks,
KaFai
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-03 16:14 ` Tiezhu Yang
2026-07-04 1:57 ` KaFai Wan
@ 2026-07-04 2:05 ` KaFai Wan
1 sibling, 0 replies; 11+ messages in thread
From: KaFai Wan @ 2026-07-04 2:05 UTC (permalink / raw)
To: Tiezhu Yang, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
> On 7/3/26 21:55, KaFai Wan wrote:
> > On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
> > > 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 <ast@kernel.org>
> > > Suggested-by: KaFai Wan <kafai.wan@linux.dev>
> > > Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> > > ---
> > > 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
> > > */
> >
> > In v6 you're using 'u8 jit_required', I thought it would be 'u8 jit_required:1', so we use one
> > byte
> > and left 3 byte hole for future use.
> >
> > This version left 2 bytes hole, same as v5, but it can easily be misleading because of the u16
> > type,
> > since we used 17 bits. I prefer v5, it has better readability.
>
> OK, I will use the previous layout in v8, like this:
>
> ```
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index ba09795e0bfd..463fae6a5c33 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -1865,8 +1865,9 @@ struct bpf_prog_aux {
>
> struct bpf_prog {
> u16 pages; /* Number of allocated pages */
> - u16 jited:1, /* Is our filter JIT'ed? */
> + u32 jited:1, /* Is our filter JIT'ed? */
> jit_requested:1,/* archs need to JIT the prog */
> + jit_required:1, /* program strictly requires JIT compiler */
> gpl_compatible:1, /* Is filter GPL compatible? */
> cb_access:1, /* Is control block accessed? */
> dst_needed:1, /* Do we need dst entry? */
> ```
>
> >
> > > 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;
> >
> > That's ok, and I think Sashiko is right about this patch.
> >
> > > return 0;
> > > }
>
> As discussed in another thread, I will update bpf_prog_has_kfunc_call()
> in v8, like this:
>
> ```
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index 25aea4271cd0..c34cc524651a 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -2770,7 +2770,7 @@ int bpf_add_kfunc_call(struct bpf_verifier_env
> *env, u32 func_id, u16 offset)
>
> bool bpf_prog_has_kfunc_call(const struct bpf_prog *prog)
> {
> - return !!prog->aux->kfunc_tab;
> + return prog->aux->kfunc_tab && prog->aux->kfunc_tab->nr_descs;
!!prog->aux->kfunc_tab works fine when bpf_prog_has_kfunc_call() called currently, no need to check
prog->aux->kfunc_tab->nr_descs, see other thread.
> }
>
> static int add_subprog_and_kfunc(struct bpf_verifier_env *env)
> ```
>
> IIUC, there are two places to modify so far:
> (1) struct bpf_prog
> (2) bpf_prog_has_kfunc_call()
>
> If you have any more comments, please let me know.
>
> Thanks,
> Tiezhu
>
--
Thanks,
KaFai
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-04 1:57 ` KaFai Wan
@ 2026-07-06 0:56 ` Tiezhu Yang
2026-07-06 3:59 ` Leon Hwang
0 siblings, 1 reply; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-06 0:56 UTC (permalink / raw)
To: KaFai Wan, Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Martin KaFai Lau,
Song Liu, Yonghong Song, Jiri Olsa, Emil Tsalapatis
Cc: bpf, loongarch, Leon Hwang, Puranjay Mohan, Björn Töpel
On 2026/7/4 上午9:57, KaFai Wan wrote:
> On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
>> On 7/3/26 21:55, KaFai Wan wrote:
>>> On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
...
>>
>> IIUC, there are two places to modify so far:
>> (1) struct bpf_prog
>
> yes
>
>> (2) bpf_prog_has_kfunc_call()
>
> I think we can remove this func.
>
> actually, I feed your patch to dsv4-pro and gpt-5.4 yesterday, both point out the we should do this
> and change the log message.
>
> diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
> index 12a8a4eb757f..7fb92b5fa415 100644
> --- a/kernel/bpf/fixups.c
> +++ b/kernel/bpf/fixups.c
> @@ -1378,7 +1378,6 @@ int bpf_fixup_call_args(struct bpf_verifier_env *env)
> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
> struct bpf_prog *prog = env->prog;
> struct bpf_insn *insn = prog->insnsi;
> - bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
> int depth;
> #endif
> int i, err = 0;
> @@ -1404,7 +1403,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env *env)
> return err;
> }
> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
> - if (has_kfunc_call) {
> + if (prog->jit_required) {
> verbose(env, "calling kernel functions are not allowed in non-JITed programs\n");
> return -EINVAL;
> }
>
> I think we can change the log message for general purpose no just for kunc, so we can know why prog
> failed in patch#2 as you test yesterday.
Hi KaFai,
Thanks a lot for the explanations and suggestions,
I really appreciate it.
I will do the following changes in the next version v8:
1. Completely remove bpf_prog_has_kfunc_call().
2. Set jit_required at the entry of bpf_add_kfunc_call().
3. Generalize the error message to:
"program requires BPF JIT compiler but it is not available"
I have tested the updated v8 patch on LoongArch.
Here are the test results:
1. net.core.bpf_jit_enable = 1 and JIT compilation succeeded:
=> test PASS
2. net.core.bpf_jit_enable = 0 and JIT compilation succeeded:
=> returns -EINVAL (-22) and prints:
"program requires BPF JIT compiler but it is not available"
3. net.core.bpf_jit_enable = 1 and JIT compilation failed:
=> returns -ENOTSUPP (-524)
4. net.core.bpf_jit_enable = 0 and JIT compilation failed:
=> returns -EINVAL (-22) and prints:
"program requires BPF JIT compiler but it is not available"
As long as net.core.bpf_jit_enable = 0, it always returns early
in bpf_fixup_call_args() with -EINVAL and prints the error log.
Only when net.core.bpf_jit_enable = 1 and the runtime JIT compilation
dynamically fails, it safely falls back to the -ENOTSUPP runtime check.
I think it works exactly as expected.
Thanks,
Tiezhu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-06 0:56 ` Tiezhu Yang
@ 2026-07-06 3:59 ` Leon Hwang
2026-07-06 4:27 ` Tiezhu Yang
2026-07-06 10:58 ` KaFai Wan
0 siblings, 2 replies; 11+ messages in thread
From: Leon Hwang @ 2026-07-06 3:59 UTC (permalink / raw)
To: Tiezhu Yang, KaFai Wan, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi,
Martin KaFai Lau, Song Liu, Yonghong Song, Jiri Olsa,
Emil Tsalapatis
Cc: bpf, loongarch, Puranjay Mohan, Björn Töpel
On 6/7/26 08:56, Tiezhu Yang wrote:
> On 2026/7/4 上午9:57, KaFai Wan wrote:
>> On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
>>> On 7/3/26 21:55, KaFai Wan wrote:
>>>> On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
>
> ...
>
>>>
>>> IIUC, there are two places to modify so far:
>>> (1) struct bpf_prog
>>
>> yes
>>
>>> (2) bpf_prog_has_kfunc_call()
>>
>> I think we can remove this func.
>>
>> actually, I feed your patch to dsv4-pro and gpt-5.4 yesterday, both
>> point out the we should do this
>> and change the log message.
>>
>> diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
>> index 12a8a4eb757f..7fb92b5fa415 100644
>> --- a/kernel/bpf/fixups.c
>> +++ b/kernel/bpf/fixups.c
>> @@ -1378,7 +1378,6 @@ int bpf_fixup_call_args(struct bpf_verifier_env
>> *env)
>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>> struct bpf_prog *prog = env->prog;
>> struct bpf_insn *insn = prog->insnsi;
>> - bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
>> int depth;
>> #endif
>> int i, err = 0;
>> @@ -1404,7 +1403,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env
>> *env)
>> return err;
>> }
>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>> - if (has_kfunc_call) {
>> + if (prog->jit_required) {
Agreed with this change.
Then, think it harder, pls.
Can we clean some code of __bpf_prog_select_runtime() btw?
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 649cce41e13f..bad55e119cb5 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -120,6 +120,9 @@ struct bpf_prog *bpf_prog_alloc_no_stats(unsigned
int size, gfp_t gfp_extra_flag
return NULL;
}
+#ifdef CONFIG_BPF_JIT_ALWAYS_ON
+ fp->jit_required = true;
+#endif
fp->pages = size / PAGE_SIZE;
fp->aux = aux;
fp->aux->main_prog_aux = aux;
@@ -2614,15 +2617,11 @@ struct bpf_prog
*__bpf_prog_select_runtime(struct bpf_verifier_env *env, struct
/* In case of BPF to BPF calls, verifier did all the prep
* work with regards to JITing, etc.
*/
- bool jit_needed = false;
+ bool jit_needed = fp->jit_required;
if (fp->bpf_func)
goto finalize;
- if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) ||
- bpf_prog_has_kfunc_call(fp))
- jit_needed = true;
-
if (!bpf_prog_select_interpreter(fp))
jit_needed = true;
WDYT?
Thanks,
Leon
>> verbose(env, "calling kernel functions are not allowed in
>> non-JITed programs\n");
>> return -EINVAL;
>> [...]
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-06 3:59 ` Leon Hwang
@ 2026-07-06 4:27 ` Tiezhu Yang
2026-07-06 10:58 ` KaFai Wan
1 sibling, 0 replies; 11+ messages in thread
From: Tiezhu Yang @ 2026-07-06 4:27 UTC (permalink / raw)
To: Leon Hwang, KaFai Wan, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi,
Martin KaFai Lau, Song Liu, Yonghong Song, Jiri Olsa,
Emil Tsalapatis
Cc: bpf, loongarch, Puranjay Mohan, Björn Töpel
On 2026/7/6 上午11:59, Leon Hwang wrote:
> On 6/7/26 08:56, Tiezhu Yang wrote:
>> On 2026/7/4 上午9:57, KaFai Wan wrote:
>>> On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
>>>> On 7/3/26 21:55, KaFai Wan wrote:
>>>>> On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
>>
>> ...
>>
>>>>
>>>> IIUC, there are two places to modify so far:
>>>> (1) struct bpf_prog
>>>
>>> yes
>>>
>>>> (2) bpf_prog_has_kfunc_call()
>>>
>>> I think we can remove this func.
>>>
>>> actually, I feed your patch to dsv4-pro and gpt-5.4 yesterday, both
>>> point out the we should do this
>>> and change the log message.
>>>
>>> diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
>>> index 12a8a4eb757f..7fb92b5fa415 100644
>>> --- a/kernel/bpf/fixups.c
>>> +++ b/kernel/bpf/fixups.c
>>> @@ -1378,7 +1378,6 @@ int bpf_fixup_call_args(struct bpf_verifier_env
>>> *env)
>>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>>> struct bpf_prog *prog = env->prog;
>>> struct bpf_insn *insn = prog->insnsi;
>>> - bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
>>> int depth;
>>> #endif
>>> int i, err = 0;
>>> @@ -1404,7 +1403,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env
>>> *env)
>>> return err;
>>> }
>>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>>> - if (has_kfunc_call) {
>>> + if (prog->jit_required) {
>
>
> Agreed with this change.
>
> Then, think it harder, pls.
>
> Can we clean some code of __bpf_prog_select_runtime() btw?
>
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index 649cce41e13f..bad55e119cb5 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -120,6 +120,9 @@ struct bpf_prog *bpf_prog_alloc_no_stats(unsigned
> int size, gfp_t gfp_extra_flag
> return NULL;
> }
>
> +#ifdef CONFIG_BPF_JIT_ALWAYS_ON
> + fp->jit_required = true;
> +#endif
> fp->pages = size / PAGE_SIZE;
> fp->aux = aux;
> fp->aux->main_prog_aux = aux;
> @@ -2614,15 +2617,11 @@ struct bpf_prog
> *__bpf_prog_select_runtime(struct bpf_verifier_env *env, struct
> /* In case of BPF to BPF calls, verifier did all the prep
> * work with regards to JITing, etc.
> */
> - bool jit_needed = false;
> + bool jit_needed = fp->jit_required;
>
> if (fp->bpf_func)
> goto finalize;
>
> - if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) ||
> - bpf_prog_has_kfunc_call(fp))
> - jit_needed = true;
> -
> if (!bpf_prog_select_interpreter(fp))
> jit_needed = true;
>
> WDYT?
Sorry, just saw your reply.
I have already sent out v8.
I think it is better to keep
the patch changes simple and focused.
The clean-up can be done as a follow-up
separate patch if necessary.
Thanks,
Tiezhu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path
2026-07-06 3:59 ` Leon Hwang
2026-07-06 4:27 ` Tiezhu Yang
@ 2026-07-06 10:58 ` KaFai Wan
1 sibling, 0 replies; 11+ messages in thread
From: KaFai Wan @ 2026-07-06 10:58 UTC (permalink / raw)
To: Leon Hwang, Tiezhu Yang, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi,
Martin KaFai Lau, Song Liu, Yonghong Song, Jiri Olsa,
Emil Tsalapatis
Cc: bpf, loongarch, Puranjay Mohan, Björn Töpel
On Mon, 2026-07-06 at 11:59 +0800, Leon Hwang wrote:
> On 6/7/26 08:56, Tiezhu Yang wrote:
> > On 2026/7/4 上午9:57, KaFai Wan wrote:
> > > On Sat, 2026-07-04 at 00:14 +0800, Tiezhu Yang wrote:
> > > > On 7/3/26 21:55, KaFai Wan wrote:
> > > > > On Thu, 2026-07-02 at 22:36 +0800, Tiezhu Yang wrote:
> >
> > ...
> >
> > > >
> > > > IIUC, there are two places to modify so far:
> > > > (1) struct bpf_prog
> > >
> > > yes
> > >
> > > > (2) bpf_prog_has_kfunc_call()
> > >
> > > I think we can remove this func.
> > >
> > > actually, I feed your patch to dsv4-pro and gpt-5.4 yesterday, both
> > > point out the we should do this
> > > and change the log message.
> > >
> > > diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
> > > index 12a8a4eb757f..7fb92b5fa415 100644
> > > --- a/kernel/bpf/fixups.c
> > > +++ b/kernel/bpf/fixups.c
> > > @@ -1378,7 +1378,6 @@ int bpf_fixup_call_args(struct bpf_verifier_env
> > > *env)
> > > #ifndef CONFIG_BPF_JIT_ALWAYS_ON
> > > struct bpf_prog *prog = env->prog;
> > > struct bpf_insn *insn = prog->insnsi;
> > > - bool has_kfunc_call = bpf_prog_has_kfunc_call(prog);
> > > int depth;
> > > #endif
> > > int i, err = 0;
> > > @@ -1404,7 +1403,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env
> > > *env)
> > > return err;
> > > }
> > > #ifndef CONFIG_BPF_JIT_ALWAYS_ON
> > > - if (has_kfunc_call) {
> > > + if (prog->jit_required) {
>
>
> Agreed with this change.
>
> Then, think it harder, pls.
>
> Can we clean some code of __bpf_prog_select_runtime() btw?
>
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index 649cce41e13f..bad55e119cb5 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -120,6 +120,9 @@ struct bpf_prog *bpf_prog_alloc_no_stats(unsigned
> int size, gfp_t gfp_extra_flag
> return NULL;
> }
>
> +#ifdef CONFIG_BPF_JIT_ALWAYS_ON
> + fp->jit_required = true;
> +#endif
Don't need #ifdef, fp->jit_required = IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) is fine. :)
> fp->pages = size / PAGE_SIZE;
> fp->aux = aux;
> fp->aux->main_prog_aux = aux;
> @@ -2614,15 +2617,11 @@ struct bpf_prog
> *__bpf_prog_select_runtime(struct bpf_verifier_env *env, struct
> /* In case of BPF to BPF calls, verifier did all the prep
> * work with regards to JITing, etc.
> */
> - bool jit_needed = false;
> + bool jit_needed = fp->jit_required;
>
> if (fp->bpf_func)
> goto finalize;
>
> - if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) ||
> - bpf_prog_has_kfunc_call(fp))
> - jit_needed = true;
> -
> if (!bpf_prog_select_interpreter(fp))
> jit_needed = true;
>
> WDYT?
>
> Thanks,
> Leon
>
> > > verbose(env, "calling kernel functions are not allowed in
> > > non-JITed programs\n");
> > > return -EINVAL;
> > > [...]
--
Thanks,
KaFai
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-07-06 10:58 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-02 14:36 [PATCH bpf-next v7 0/2] Introduce jit_required to prevent a kernel panic Tiezhu Yang
2026-07-02 14:36 ` [PATCH bpf-next v7 1/2] bpf: Introduce jit_required flag and refactor kfunc path Tiezhu Yang
2026-07-03 13:55 ` KaFai Wan
2026-07-03 16:14 ` Tiezhu Yang
2026-07-04 1:57 ` KaFai Wan
2026-07-06 0:56 ` Tiezhu Yang
2026-07-06 3:59 ` Leon Hwang
2026-07-06 4:27 ` Tiezhu Yang
2026-07-06 10:58 ` KaFai Wan
2026-07-04 2:05 ` KaFai Wan
2026-07-02 14:36 ` [PATCH bpf-next v7 2/2] bpf: Reject programs with inlined helpers if JIT is unavailable Tiezhu Yang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox