BPF List
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>, bpf@vger.kernel.org
Cc: Andrii Nakryiko <andrii@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Eduard Zingerman <eddyz87@gmail.com>,
	kernel-team@fb.com
Subject: Re: [PATCH bpf-next v10 09/24] bpf: Refuse a landing pad that does not resume
Date: Sun, 11 Oct 2026 11:26:31 -0700	[thread overview]
Message-ID: <4e5d4bbe-9d03-470b-8a02-034381a6b53e@linux.dev> (raw)
In-Reply-To: <DM194GWC0XHZ.10Q1AUS5TQYNO@gmail.com>



On 10/10/26 5:08 PM, Alexei Starovoitov wrote:
> # CARRIED OVER from the unsent v9 draft (leftover of your v8 09 mail). Delete this line, or the file if you dropped it on purpose.
> On Thu, Oct 08, 2026 at 09:15 PM Yonghong Song <yonghong.song@linux.dev> wrote:
>> +		if (unlikely(env->cleanup_info_cnt)) {
>> +			err = bpf_exc_check_insn(env, insn);
>> +			if (error_recoverable_with_nospec(err) && state->speculative) {
>> +				insn_aux->nospec = true;
>> +				goto process_bpf_exit;
>> +			}
>> +			if (err)
>> +				return err;
>> +		}

Remove the error_recoverable_with_nospec():

+			if (error_recoverable_with_nospec(err) && state->speculative) {
+				insn_aux->nospec = true;
+				goto process_bpf_exit;
+			}

For selftest:

/* A pad whose speculative walk reaches an exit: a barrier, not a refusal. */
static __used __naked __noinline __u64 spec_exit_pad_frame(void)
{
         asm volatile (
         "r1 = %[input] ll;"
         "r6 = *(u64 *)(r1 + 0);"
         "r6 &= 7;"
"1:"    "call always_unwind;"           /* cleanup region */
"2:"
         "r0 = 0;"
         "exit;"
"3:"                                    /* landing pad */
         "if r6 > 7 goto 4f;"            /* never taken: walked speculatively */
         "call bpf_unwind_resume;"
"4:"
         "exit;"
         CLEANUP_REC("1b", "2b", "3b")
         :
         : __imm_addr(input)
         : __clobber_all);
}

SEC("?syscall")
__success __caps_unpriv(CAP_BPF) __success_unpriv
__xlated_unpriv("nospec")
int entry_spec_exit_pad(void *ctx)
{
         return spec_exit_pad_frame();
}

and get the following failure:

libbpf: prog 'entry_spec_exit_pad': BPF program load failed: -EINVAL
libbpf: prog 'entry_spec_exit_pad': failed to load: -EINVAL
libbpf: failed to load object 'exceptions_cleanup_shapes'
run_subtest:FAIL:unexpected_load_failure unexpected error: -22 (errno 22)
VERIFIER LOG:
=============
arg#0 reference type('UNKNOWN ') size cannot be determined: -22
0: R10=fp0
; return spec_exit_pad_frame(); @ exceptions_cleanup_shapes.c:1091
0: (85) call pc+1
caller:
  R10=fp0
callee:
  frame1: R10=fp0
2: frame1: R10=fp0
; asm volatile ( @ exceptions_cleanup_shapes.c:1067
2: (18) r1 = 0x0                      ; frame1: R1=map_value(map=exceptio.bss,ks=4,vs=40)
4: (79) r6 = *(u64 *)(r1 +0)          ; frame1: R1=map_value(map=exceptio.bss,ks=4,vs=40) R6=scalar()
5: (57) r6 &= 7                       ; frame1: R6=scalar(smin=smin32=0,smax=umax=smax32=umax32=7,var_off=(0x0; 0x7))
6: (85) call pc+5
caller:
  frame1: R6=scalar(smin=smin32=0,smax=umax=smax32=umax32=7,var_off=(0x0; 0x7)) R10=fp0
callee:
  frame2: R1=map_value(map=exceptio.bss,ks=4,vs=40) R10=fp0
12: frame2: R1=map_value(map=exceptio.bss,ks=4,vs=40) R10=fp0
; asm volatile ( @ exceptions_cleanup_shapes.c:390
12: (85) call bpf_unwind#87213        ; frame1: R0=scalar()
; asm volatile ( @ exceptions_cleanup_shapes.c:1067
9: (25) if r6 > 0x7 goto pc+1
exit at insn 11 ends a landing pad: a catch pad is not supported yet, only cleanup pads that resume
processed 9 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
=============
#134/56  exceptions_cleanup/entry_spec_exit_pad @unpriv:FAIL


>> +
>>   		if (bpf_is_prune_point(env, env->insn_idx)) {
> since you're going to respin consider the following feedback:
>
> The special case for speculative paths is still here.
> in_pad is compared in func_states_equal() now, so there is no need
> to check before pruning.
> Call bpf_exc_check_insn() from do_check_insn() ?

Moving bpf_exc_check_insn() to do_check_insn() makes sense.
The above selftest succeeded (w.r.t speculative path).

> error_recoverable_with_nospec() after it does the same thing,
> and the error will be printed after the insn instead of before it.


  reply	other threads:[~2026-10-11 18:26 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-09  4:14 [PATCH bpf-next v10 00/24] bpf: Run exception cleanup landing pads when bpf_unwind() unwinds Yonghong Song
2026-10-09  4:14 ` [PATCH bpf-next v10 01/24] bpf: Pack bpf_insn_aux_data flags into bit fields Yonghong Song
2026-10-09  4:14 ` [PATCH bpf-next v10 02/24] bpf: Accept the compiler's exception cleanup table at program load Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 03/24] bpf: Add the bpf_unwind() and bpf_unwind_resume() kfuncs Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 04/24] bpf: Keep a call site's landing pad in insn_aux_data, add lookups Yonghong Song
2026-10-09  4:28   ` sashiko-bot
2026-10-09 15:10     ` Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 05/24] bpf: Mark covered call sites and check a program can take a table Yonghong Song
2026-10-09  4:34   ` sashiko-bot
2026-10-09 15:13     ` Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 06/24] bpf: Make exception landing pads reachable in the CFG Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 07/24] bpf: Verify an unwind through landing pads and epilogues Yonghong Song
2026-10-09  4:40   ` sashiko-bot
2026-10-09 15:24     ` Yonghong Song
2026-10-09  5:13   ` bot+bpf-ci
2026-10-09 15:25     ` Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 08/24] bpf: Refuse a callback that can unwind Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 09/24] bpf: Refuse a landing pad that does not resume Yonghong Song
2026-10-10 15:08   ` Alexei Starovoitov
2026-10-11 18:26     ` Yonghong Song [this message]
2026-10-09  4:15 ` [PATCH bpf-next v10 10/24] bpf: Do not use a private stack for a program that can unwind Yonghong Song
2026-10-09  4:45   ` sashiko-bot
2026-10-09 15:38     ` Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 11/24] bpf: Prepare JITed programs for dispatching cleanup pads Yonghong Song
2026-10-09  4:35   ` sashiko-bot
2026-10-09 16:12     ` Yonghong Song
2026-10-09  5:13   ` bot+bpf-ci
2026-10-09 16:39     ` Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 12/24] bpf: Dispatch cleanup pads by rewriting return addresses Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 13/24] bpf: Refuse a trampoline that calls a subprog that can unwind Yonghong Song
2026-10-09  4:15 ` [PATCH bpf-next v10 14/24] bpf, x86: Dispatch exception cleanup pads at run time Yonghong Song
2026-10-09  4:32   ` sashiko-bot
2026-10-09 16:51     ` Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 15/24] bpf, arm64: " Yonghong Song
2026-10-09  4:30   ` sashiko-bot
2026-10-09 16:55     ` Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 16/24] libbpf: Resolve the compiler's _Unwind_Resume to the kernel's kfunc Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 17/24] libbpf: Add cleanup_info to bpf_prog_load_opts Yonghong Song
2026-10-09  4:26   ` sashiko-bot
2026-10-09  4:16 ` [PATCH bpf-next v10 18/24] libbpf: Collect .bpf_cleanup records and pass them to the kernel Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 19/24] libbpf: Carry the exception cleanup table through the light skeleton Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 20/24] libbpf: Let the static linker carry .bpf_cleanup relocations Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 21/24] selftests/bpf: Add end-to-end and negative .bpf_cleanup exception tests Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 22/24] selftests/bpf: Add __set_global() and __ret_global() test tags Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 23/24] selftests/bpf: Cover more accepted .bpf_cleanup exception shapes Yonghong Song
2026-10-09  4:16 ` [PATCH bpf-next v10 24/24] selftests/bpf: Load an exception cleanup program from a light skeleton Yonghong Song
2026-10-10 15:15 ` [PATCH bpf-next v10 00/24] bpf: Run exception cleanup landing pads when bpf_unwind() unwinds Alexei Starovoitov
2026-10-11 17:30   ` Yonghong Song

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=4e5d4bbe-9d03-470b-8a02-034381a6b53e@linux.dev \
    --to=yonghong.song@linux.dev \
    --cc=alexei.starovoitov@gmail.com \
    --cc=andrii@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=kernel-team@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