* [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements
@ 2024-10-21 13:39 Leon Hwang
0 siblings, 0 replies; 5+ messages in thread
From: Leon Hwang @ 2024-10-21 13:39 UTC (permalink / raw)
To: bpf; +Cc: ast, daniel, andrii, jolsa, eddyz87, leon.hwang,
kernel-patches-bot
This patch set introduces two enhancements aimed at improving tailcall
handling in the x64 JIT:
1. Tailcall info is propagated to a subprog only if the subprog is
tail_call_reachable.
2. Tailcall info is propagated through the trampoline only when the target
is a subprog and it is tail_call_reachable.
Leon Hwang (2):
bpf, x64: Propagate tailcall info only for tail_call_reachable
subprogs
bpf, verifier: Check trampoline attach target is tail_call_reachable
subprog
arch/x86/net/bpf_jit_comp.c | 4 +++-
include/linux/bpf.h | 1 +
kernel/bpf/verifier.c | 10 +++++++++-
3 files changed, 13 insertions(+), 2 deletions(-)
--
2.44.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements
@ 2024-10-28 13:40 Leon Hwang
2024-10-28 13:40 ` [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs Leon Hwang
2024-10-28 13:40 ` [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog Leon Hwang
0 siblings, 2 replies; 5+ messages in thread
From: Leon Hwang @ 2024-10-28 13:40 UTC (permalink / raw)
To: bpf
Cc: ast, daniel, andrii, yonghong.song, jolsa, eddyz87, leon.hwang,
kernel-patches-bot
This patch set introduces two enhancements aimed at improving tailcall
handling in the x64 JIT:
1. Tailcall info is propagated only for subprogs.
2. Tailcall info is propagated through the trampoline only when the target
is a subprog and it is tail_call_reachable.
v1 -> v2:
* Address comment from Alexei:
* Rather live with tail call inefficiency than abuse insns fields
further.
Leon Hwang (2):
bpf, x64: Propagate tailcall info only for subprogs
bpf, verifier: Check trampoline target is tail_call_reachable subprog
arch/x86/net/bpf_jit_comp.c | 3 ++-
include/linux/bpf.h | 1 +
kernel/bpf/verifier.c | 4 +++-
3 files changed, 6 insertions(+), 2 deletions(-)
--
2.44.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs
2024-10-28 13:40 [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements Leon Hwang
@ 2024-10-28 13:40 ` Leon Hwang
2024-10-28 16:06 ` Yonghong Song
2024-10-28 13:40 ` [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog Leon Hwang
1 sibling, 1 reply; 5+ messages in thread
From: Leon Hwang @ 2024-10-28 13:40 UTC (permalink / raw)
To: bpf
Cc: ast, daniel, andrii, yonghong.song, jolsa, eddyz87, leon.hwang,
kernel-patches-bot
In x64 JIT, propagate tailcall info only for subprogs, not for helpers
or kfuncs.
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
---
arch/x86/net/bpf_jit_comp.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 06b080b61aa57..eb08cc6d66401 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -2124,10 +2124,11 @@ st: if (is_imm8(insn->off))
/* call */
case BPF_JMP | BPF_CALL: {
+ bool pseudo_call = src_reg == BPF_PSEUDO_CALL;
u8 *ip = image + addrs[i - 1];
func = (u8 *) __bpf_call_base + imm32;
- if (tail_call_reachable) {
+ if (pseudo_call && tail_call_reachable) {
LOAD_TAIL_CALL_CNT_PTR(bpf_prog->aux->stack_depth);
ip += 7;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog
2024-10-28 13:40 [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements Leon Hwang
2024-10-28 13:40 ` [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs Leon Hwang
@ 2024-10-28 13:40 ` Leon Hwang
1 sibling, 0 replies; 5+ messages in thread
From: Leon Hwang @ 2024-10-28 13:40 UTC (permalink / raw)
To: bpf
Cc: ast, daniel, andrii, yonghong.song, jolsa, eddyz87, leon.hwang,
kernel-patches-bot
In the x86_64 JIT, tailcall info is propagated through the trampoline when
the target program is tail_call_reachable. However, this propagation is
unnecessary if the target is a main prog, or a subprog that is not
tail_call_reachable.
Since the verifier can determine if a subprog is tail_call_reachable, it
should only propagate tailcall info when the target is subprog and the
subprog is actually tail_call_reachable.
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
---
include/linux/bpf.h | 1 +
kernel/bpf/verifier.c | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index c3ba4d4751747..0c3b147c84af9 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1253,6 +1253,7 @@ struct bpf_attach_target_info {
struct module *tgt_mod;
const char *tgt_name;
const struct btf_type *tgt_type;
+ bool tgt_tail_call_reachable;
};
#define BPF_DISPATCHER_MAX 48 /* Fits in 2048B */
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 797cf3ed32e0f..2e2f027b86375 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -21946,6 +21946,8 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
bpf_log(log, "Subprog %s doesn't exist\n", tname);
return -EINVAL;
}
+ tgt_info->tgt_tail_call_reachable = subprog &&
+ aux->func[subprog]->aux->tail_call_reachable;
if (aux->func && aux->func[subprog]->aux->exception_cb) {
bpf_log(log,
"%s programs cannot attach to exception callback\n",
@@ -22315,7 +22317,7 @@ static int check_attach_btf_id(struct bpf_verifier_env *env)
if (!tr)
return -ENOMEM;
- if (tgt_prog && tgt_prog->aux->tail_call_reachable)
+ if (tgt_prog && tgt_info.tgt_tail_call_reachable)
tr->flags = BPF_TRAMP_F_TAIL_CALL_CTX;
prog->aux->dst_trampoline = tr;
--
2.44.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs
2024-10-28 13:40 ` [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs Leon Hwang
@ 2024-10-28 16:06 ` Yonghong Song
0 siblings, 0 replies; 5+ messages in thread
From: Yonghong Song @ 2024-10-28 16:06 UTC (permalink / raw)
To: Leon Hwang, bpf; +Cc: ast, daniel, andrii, jolsa, eddyz87, kernel-patches-bot
On 10/28/24 6:40 AM, Leon Hwang wrote:
> In x64 JIT, propagate tailcall info only for subprogs, not for helpers
> or kfuncs.
>
> Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-10-28 16:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-28 13:40 [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements Leon Hwang
2024-10-28 13:40 ` [PATCH bpf-next 1/2] bpf, x64: Propagate tailcall info only for subprogs Leon Hwang
2024-10-28 16:06 ` Yonghong Song
2024-10-28 13:40 ` [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog Leon Hwang
-- strict thread matches above, loose matches on Subject: below --
2024-10-21 13:39 [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements Leon Hwang
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.