From: "Alexei Starovoitov" <alexei.starovoitov@gmail.com>
To: "shaos" <shawnq1@163.com>, "Amery Hung" <amery.hung@bytedance.com>
Cc: "Jamal Hadi Salim" <jhs@mojatatu.com>,
"Jiri Pirko" <jiri@resnulli.us>,
"Martin KaFai Lau" <martin.lau@kernel.org>,
"Toke Høiland-Jørgensen" <toke@redhat.com>,
netdev@vger.kernel.org, bpf@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] bpf: net_sched: reject bpf_throw() in qdisc teardown callbacks
Date: Tue, 03 Nov 2026 18:18:00 +0000 [thread overview]
Message-ID: <DMLS6BDLXMCV.1C0EN486O4XLV@gmail.com> (raw)
In-Reply-To: <6AEA1AAD.2E7977.08739@m16.mail.163.com>
On Tue, Nov 03, 2026 at 09:32 AM shaos <shawnq1@163.com> wrote:
> A BPF qdisc's generated reset/destroy epilogue cancels its watchdog
> timer. bpf_throw() unwinds directly to the exception callback and
> skips that epilogue.
That's a bug in the verifier. bpf_qdisc.c is the wrong place to fix it.
gen_epilogue() is a contract: the epilogue runs before the prog returns.
bpf_convert_ctx_accesses() puts the epilogue in place of BPF_EXIT
in the main prog only. The exception callback is a subprog.
So bpf_throw() breaks the contract for every gen_epilogue() user,
bpf_testmod included. Fix it there.
Then bpf_qdisc.c doesn't need to know about bpf_throw: no BTF id,
no QDISC_OPS_KF_TEARDOWN, no forward declaration.
Like:
diff --git a/kernel/bpf/fixups.c b/kernel/bpf/fixups.c
index ead7871..5363e88 100644
--- a/kernel/bpf/fixups.c
+++ b/kernel/bpf/fixups.c
@@ -909,6 +909,11 @@ int bpf_convert_ctx_accesses(struct bpf_verifier_env *env)
verifier_bug(env, "epilogue is too long");
return -EFAULT;
} else if (epilogue_cnt) {
+ /* bpf_throw() leaves via the exception callback */
+ if (env->seen_exception) {
+ verbose(env, "bpf_throw would skip the epilogue of the program\n");
+ return -EINVAL;
+ }
/* Save the ARG_PTR_TO_CTX for the epilogue to use */
subprogs[0].stack_depth += 8;
insn_buf[0] = BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_1,
> Fixes: 7a2dafda950b ("bpf: net_sched: Add a qdisc watchdog timer")
With the fix in the verifier it's
Fixes: 169c31761c8d ("bpf: Add gen_epilogue to bpf_verifier_ops")
Pls add a selftest as patch 2. bpf_testmod_st_ops has gen_epilogue().
A test_epilogue prog that calls bpf_throw(), with __failure and __msg(),
is enough. See progs/epilogue_exit.c.
Pls target bpf-next and cc ameryhung@gmail.com on respin.
pw-bot: cr
prev parent reply other threads:[~2026-11-03 18:18 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 17:32 [PATCH] bpf: net_sched: reject bpf_throw() in qdisc teardown callbacks shaos
2026-11-03 17:51 ` sashiko-bot
2026-11-03 18:18 ` Alexei Starovoitov [this message]
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=DMLS6BDLXMCV.1C0EN486O4XLV@gmail.com \
--to=alexei.starovoitov@gmail.com \
--cc=amery.hung@bytedance.com \
--cc=bpf@vger.kernel.org \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=shawnq1@163.com \
--cc=toke@redhat.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 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.