BPF List
 help / color / mirror / Atom feed
* [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; 4+ 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] 4+ 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; 4+ 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] 4+ 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; 4+ 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] 4+ 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; 4+ 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] 4+ messages in thread

end of thread, other threads:[~2024-10-28 16:06 UTC | newest]

Thread overview: 4+ 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox