All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anton Protopopov <a.s.protopopov@gmail.com>
To: bot+bpf-ci@kernel.org
Cc: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
	eddyz87@gmail.com, memxor@gmail.com, almagui@kernel.org,
	john.fastabend@gmail.com, qmo@kernel.org, brauner@kernel.org,
	kpsingh@kernel.org, yonghong.song@linux.dev, jolsa@kernel.org,
	emil@etsalapatis.com, ihor.solodrai@linux.dev, sashal@kernel.org,
	bpf@vger.kernel.org, linux-kernel@vger.kernel.org,
	martin.lau@kernel.org, mason@kernel.org
Subject: Re: [PATCH v2 bpf-next 13/18] bpf: Check the return values of fmod_ret programs on found targets
Date: Tue, 10 Nov 2026 14:30:41 +0000	[thread overview]
Message-ID: <avMqkcLz6kf-XXtE@mail.gmail.com> (raw)
In-Reply-To: <1760ad16d930af8fe5c9bdcc74de2ecb3307c2ae57db0bdcead7505d5d9ff630@mail.kernel.org>

On 26/11/09 05:42PM, bot+bpf-ci@kernel.org wrote:
> > bpf: Check the return values of fmod_ret programs on found targets
> 
> TL;DR: The fmod_ret return check may wrongly reject valid programs: when
> states returning two allowed constants merge at a shared exit, R0 becomes a
> range, not a constant, and the load fails.
> 
> > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> > --- a/kernel/bpf/verifier.c
> > +++ b/kernel/bpf/verifier.c
> 
> [ ... ]
> 
> > +/* The program must return a constant: 0 or one of the values of the tag */
> > +static int check_fmodret_retval(struct bpf_verifier_env *env, int regno,
> > +				const char *exit_ctx, const char *reg_name)
> > +{
> > +	const struct bpf_prog_aux *aux = env->prog->aux;
> > +	struct bpf_reg_state *reg = reg_state(env, regno);
> > +	u32 i;
> > +
> > +	if (reg->type == SCALAR_VALUE && tnum_is_const(reg->var_off) &&
> > +	    fmodret_retval_allowed(aux, reg->var_off.value))
> > +		return 0;
> 
> Can this reject valid programs when two allowed constants are joined at a
> shared exit?
> 
> The main pass is the fixpoint in kernel/bpf/flow.c, and flow_merge() joins
> states that reach the same basic-block head.  For SCALAR_VALUE, join_reg()
> -> join_range() produces the union range.  flow_join_makes_up() only
> refuses the join when flow_gap() finds values in the union that neither
> state has, and only while flow_has_room().  The FLOW_NEED_ARG table has no
> entry for R0 at BPF_EXIT, so flow_needed_consts_differ() does not keep the
> constants apart.

Yes. This flow.c code was merged after my code was written.
(I will fix my code by allowing not only constants.)

> For a target tagged "bpf_fmodret_retval:-12,-11":
> 
>   r2 = *(u64 *)(r1 + 0)
>   r0 = -11
>   if r2 == 0 goto +1
>   r0 = -12
>   exit
> 
> The states at exit (R0=-11 and R0=-12) are disjoint but leave no gap, so
> they become R0=[-12,-11] and tnum_is_const() fails.  The load then fails
> with:
> 
>   At program exit the register R0 must be a constant, it should be 0 or
>   one of -12,-11
> 
> even though every path returns an allowed value.
> 
> The same can happen with the common pattern "r0 = 0 ... r0 = -1; exit" when
> the tag contains -1, since the 64-bit constants 0 and 0xffffffffffffffff
> touch on the circle and are joined.  Once a program uses half of the state
> limits, flow_has_room() is false and even gapped values such as -34 and -22
> are joined.
> 
> The selftest join_both_paths avoids this only by using two separate exit
> instructions, and whether exits are merged is the compiler's choice.
> 
> Every other exit check so far was a range check via retval_range_within(),
> but this one needs set membership.  Should R0 at the main-prog exit (and R1
> at bpf_throw without a callback) be added to the FLOW_NEED_ARG table for
> programs with fmodret_retvals, or should a small bounded range be accepted
> when every value in it is 0 or in the list?
> 
> The feature becomes reachable once 1c163e52401e ("resolve_btfids: Tag
> fmod_ret candidates as targets") emits the tags, and no later commit in the
> series changes this.
> 
> 
> ---
> AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
> See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
> 
> CI run summary: https://github.com/kernel-patches/bpf/actions/runs/42662799554


  reply	other threads:[~2026-11-10 14:19 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-09 17:05 [PATCH v2 bpf-next 00/18] Auto-detect BPF fmodret targets Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 01/18] bpf: Add BTF ID sets for fmod_ret targets Anton Protopopov
2026-11-09 17:42   ` bot+bpf-ci
2026-11-10 14:00     ` Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 02/18] bpf: Add a btf_id_set8_entry helper Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 03/18] bpf: Build fmod_ret target sets from BTF decl tags Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 04/18] selftests/bpf: Declare bpf_fentry_test1 in tracing tests Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 05/18] bpf: Declare fmod_ret targets with BTF_FMODRET sets Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 06/18] selftests/bpf: Test fmod_ret BTF decl tags and attach permission Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 07/18] scripts: Add LLVM plugin infrastructure Anton Protopopov
2026-11-09 17:45   ` sashiko-bot
2026-11-10 14:02     ` Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 08/18] bpf: Add the bpf_scan_ir LLVM plugin Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 09/18] bpf: Find fmod_ret candidates in bpf_scan_ir Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 10/18] bpf: Allow writes to private stack objects " Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 11/18] bpf: Follow PHIs " Anton Protopopov
2026-11-09 17:42   ` bot+bpf-ci
2026-11-10 14:04     ` Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 12/18] bpf: Follow integer casts " Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 13/18] bpf: Check the return values of fmod_ret programs on found targets Anton Protopopov
2026-11-09 17:42   ` bot+bpf-ci
2026-11-10 14:30     ` Anton Protopopov [this message]
2026-11-09 17:05 ` [PATCH v2 bpf-next 14/18] bpf: Require the JIT for fmod_ret programs on found 64-bit targets Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 15/18] resolve_btfids: Tag fmod_ret candidates as targets Anton Protopopov
2026-11-09 17:42   ` bot+bpf-ci
2026-11-10 15:17     ` Anton Protopopov
2026-11-09 18:13   ` sashiko-bot
2026-11-10 15:19     ` Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 16/18] selftests/bpf: Test fmod_ret candidates found by bpf_scan_ir Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 17/18] selftests/bpf: Enable bpf_scan_ir in the config Anton Protopopov
2026-11-09 17:05 ` [PATCH v2 bpf-next 18/18] bpftool: List and show fmod_ret targets Anton Protopopov
2026-11-09 17:42   ` bot+bpf-ci
2026-11-10 15:30     ` Anton Protopopov

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=avMqkcLz6kf-XXtE@mail.gmail.com \
    --to=a.s.protopopov@gmail.com \
    --cc=almagui@kernel.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bot+bpf-ci@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=brauner@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=emil@etsalapatis.com \
    --cc=ihor.solodrai@linux.dev \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.lau@kernel.org \
    --cc=mason@kernel.org \
    --cc=memxor@gmail.com \
    --cc=qmo@kernel.org \
    --cc=sashal@kernel.org \
    --cc=yonghong.song@linux.dev \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.