From: Leon Hwang <leon.hwang@linux.dev>
To: Jiri Olsa <jolsa@kernel.org>, Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>
Cc: bpf@vger.kernel.org, linux-perf-users@vger.kernel.org,
Martin KaFai Lau <kafai@fb.com>,
Eduard Zingerman <eddyz87@gmail.com>,
Song Liu <songliubraving@fb.com>, Yonghong Song <yhs@fb.com>
Subject: Re: [PATCH bpf-next 1/2] bpf: Allow sleepable programs to use tail calls
Date: Fri, 30 Jan 2026 22:14:35 +0800 [thread overview]
Message-ID: <6e149b55-9700-411b-b330-00de0fb93378@linux.dev> (raw)
In-Reply-To: <20260130081208.1130204-2-jolsa@kernel.org>
On 2026/1/30 16:12, Jiri Olsa wrote:
> Allowing sleepable programs to use tail calls.
>
> Making sure we can't mix sleepable and non-sleepable bpf programs
> in tail call map (BPF_MAP_TYPE_PROG_ARRAY) and allowing it to be
> used in sleepable programs.
>
> Sleepable programs can be preempted and sleep which might bring
> new source of race conditions, but both direct and indirect tail
> calls should not be affected.
>
> Direct tail calls work by patching direct jump to callee into bpf
> caller program, so no problem there. We atomically switch from nop
> to jump instruction.
>
> Indirect tail call reads the callee from the map and then jumps to
> it. The callee bpf program can't disappear (be released) from the
> caller, because it is executed under rcu lock (rcu_read_lock_trace).
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
> include/linux/bpf.h | 1 +
> kernel/bpf/core.c | 4 +++-
> kernel/bpf/verifier.c | 1 +
> 3 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index 5524f9429e76..3b0ceb759075 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -287,6 +287,7 @@ struct bpf_map_owner {
> enum bpf_prog_type type;
> bool jited;
> bool xdp_has_frags;
> + bool sleepable;
> u64 storage_cookie[MAX_BPF_CGROUP_STORAGE_TYPE];
> const struct btf_type *attach_func_proto;
> enum bpf_attach_type expected_attach_type;
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index e0b8a8a5aaa9..5ebece600aeb 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -2401,6 +2401,7 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map,
> map->owner->type = prog_type;
> map->owner->jited = fp->jited;
> map->owner->xdp_has_frags = aux->xdp_has_frags;
> + map->owner->sleepable = fp->sleepable;
> map->owner->expected_attach_type = fp->expected_attach_type;
> map->owner->attach_func_proto = aux->attach_func_proto;
> for_each_cgroup_storage_type(i) {
> @@ -2412,7 +2413,8 @@ static bool __bpf_prog_map_compatible(struct bpf_map *map,
> } else {
> ret = map->owner->type == prog_type &&
> map->owner->jited == fp->jited &&
> - map->owner->xdp_has_frags == aux->xdp_has_frags;
> + map->owner->xdp_has_frags == aux->xdp_has_frags &&
> + map->owner->sleepable == fp->sleepable;
> if (ret &&
> map->map_type == BPF_MAP_TYPE_PROG_ARRAY &&
> map->owner->expected_attach_type != fp->expected_attach_type)
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index e7ff8394e0da..f185ebc6748d 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -21386,6 +21386,7 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env,
> case BPF_MAP_TYPE_STACK:
> case BPF_MAP_TYPE_ARENA:
> case BPF_MAP_TYPE_INSN_ARRAY:
> + case BPF_MAP_TYPE_PROG_ARRAY:
> break;
> default:
> verbose(env,
This change also prevents a bad use case: a sleepable program FD could
be inserted into a prog_array map whose owner is a non-sleepable program.
Looking at __bpf_prog_map_compatible(), are there any other program
properties we should consider checking to ensure compatibility when
updating a prog_array map?
From the tail call compatibility point of view, the restriction on
mixing sleepable and non-sleepable programs looks correct to me.
Acked-by: Leon Hwang <leon.hwang@linux.dev>
next prev parent reply other threads:[~2026-01-30 14:14 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-30 8:12 [PATCH bpf-next 0/2] bpf: tail calls in sleepable programs Jiri Olsa
2026-01-30 8:12 ` [PATCH bpf-next 1/2] bpf: Allow sleepable programs to use tail calls Jiri Olsa
2026-01-30 14:14 ` Leon Hwang [this message]
2026-01-30 17:34 ` Kumar Kartikeya Dwivedi
2026-01-30 20:17 ` Alexei Starovoitov
2026-01-30 8:12 ` [PATCH bpf-next 2/2] selftests/bpf: Add test for sleepable program tailcalls Jiri Olsa
2026-01-30 20:20 ` [PATCH bpf-next 0/2] bpf: tail calls in sleepable programs patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6e149b55-9700-411b-b330-00de0fb93378@linux.dev \
--to=leon.hwang@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=jolsa@kernel.org \
--cc=kafai@fb.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=songliubraving@fb.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox