* [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog
2024-10-21 13:39 [PATCH bpf-next 0/2] bpf, x64: Introduce two tailcall enhancements Leon Hwang
@ 2024-10-21 13:39 ` Leon Hwang
2024-10-24 2:46 ` Yonghong Song
0 siblings, 1 reply; 6+ 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
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.
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 0c216e71cec76..32b56a759d788 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1220,6 +1220,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 6e7e42c7bc7b1..9a09621a8832c 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -21916,6 +21916,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",
@@ -22285,7 +22287,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] 6+ messages in thread
* Re: [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog
2024-10-21 13:39 ` [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog Leon Hwang
@ 2024-10-24 2:46 ` Yonghong Song
0 siblings, 0 replies; 6+ messages in thread
From: Yonghong Song @ 2024-10-24 2:46 UTC (permalink / raw)
To: Leon Hwang, bpf; +Cc: ast, daniel, andrii, jolsa, eddyz87, kernel-patches-bot
On 10/21/24 6:39 AM, Leon Hwang wrote:
> 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.
>
> Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Looks correct to me.
Acked-by: Yonghong Song <yonghong.song@linux.dev>
^ permalink raw reply [flat|nested] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ messages in thread
end of thread, other threads:[~2024-10-28 16:06 UTC | newest]
Thread overview: 6+ 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
2024-10-21 13:39 ` [PATCH bpf-next 2/2] bpf, verifier: Check trampoline target is tail_call_reachable subprog Leon Hwang
2024-10-24 2:46 ` Yonghong Song
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox