On Sun, Mar 16, 2025 at 7:41 PM Vincent Li <vincent.mc.li@xxxxxxxxx> wrote: > > On Sun, Mar 16, 2025 at 6:58 PM Hengqi Chen <hengqi.chen@xxxxxxxxx> wrote: > > > > Vincent reported that running XDP synproxy program on LoongArch > > results in the following error: > > JIT doesn't support bpf-to-bpf calls > > With dmesg: > > multi-func JIT bug 1391 != 1390 > > > > The root cause is that verifier will refill the imm with the > > correct addresses of bpf_calls for BPF_PSEUDO_FUNC instructions > > and then run the last pass of JIT. So we generate different JIT > > code for the same instruction in two passes (one for placeholder > > and one for real address). Let's use move_addr() instead. > > > > See commit 64f50f657572 ("LoongArch, bpf: Use 4 instructions for > > function address in JIT") for a similar fix. > > > > Fixes: 69c087ba6225 ("bpf: Add bpf_for_each_map_elem() helper") > > Fixes: bb035ef0cc91 ("LoongArch: BPF: Support mixing bpf2bpf and tailcalls") > > Reported-by: Vincent Li <vincent.mc.li@xxxxxxxxx> > > Closes: https://lore.kernel.org/loongarch/CAK3+h2yfM9FTNiXvEQBkvtuoJrvzmN4c_NZsFXqEk4Cj1tsBNA@xxxxxxxxxxxxxx/T/#u > > Signed-off-by: Hengqi Chen <hengqi.chen@xxxxxxxxx> > > --- > > arch/loongarch/net/bpf_jit.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/arch/loongarch/net/bpf_jit.c b/arch/loongarch/net/bpf_jit.c > > index ea357a3edc09..b25b0bb43428 100644 > > --- a/arch/loongarch/net/bpf_jit.c > > +++ b/arch/loongarch/net/bpf_jit.c > > @@ -930,7 +930,10 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext > > { > > const u64 imm64 = (u64)(insn + 1)->imm << 32 | (u32)insn->imm; > > > > - move_imm(ctx, dst, imm64, is32); > > + if (bpf_pseudo_func(insn)) > > + move_addr(ctx, dst, imm64); > > + else > > + move_imm(ctx, dst, imm64, is32); > > return 1; > > } > > > > -- > > 2.43.5 > > > > Thanks Hengqi for the quick fix! tested and verified working now. > > [root@fedora xdp-tools]# uname -a > Linux fedora 6.14.0-rc5 #2 SMP PREEMPT_DYNAMIC Sun Mar 16 17:16:21 PDT > 2025 loongarch64 GNU/Linux > > [root@fedora xdp-tools]# ./xdp-loader/xdp-loader load -vvv lo -m skb > -P 80 -p /sys/fs/bpf/xdp-synproxy-tailcall -n synproxy_tailcall > ./xdp-synproxy-tailcall/xdp_synproxy_tailcall.bpf.o > Current rlimit 8388608 already >= minimum 1048576 > Loading 1 files on interface 'lo'. > libbpf: loading object from > ./xdp-synproxy-tailcall/xdp_synproxy_tailcall.bpf.o > ... > libbpf: map 'tail_call_tbl': created successfully, fd=4 > libbpf: pinned map '/sys/fs/bpf/xdp-synproxy-tailcall/tail_call_tbl' > libbpf: found no pinned map to reuse at > '/sys/fs/bpf/xdp-synproxy-tailcall/values' > libbpf: map 'values': created successfully, fd=5 > libbpf: pinned map '/sys/fs/bpf/xdp-synproxy-tailcall/values' > libbpf: found no pinned map to reuse at > '/sys/fs/bpf/xdp-synproxy-tailcall/allowed_ports' > libbpf: map 'allowed_ports': created successfully, fd=6 > libbpf: pinned map '/sys/fs/bpf/xdp-synproxy-tailcall/allowed_ports' > libbpf: map 'xdp_synp.rodata': created successfully, fd=7 > libbpf: map 'tail_call_tbl': slot [0] set to prog 'syncookie_xdp' fd=65 > libxdp: Loaded XDP program synproxy_tailcall, got fd 66 > libxdp: Duplicated fd 66 to 3 for prog synproxy_tailcall > libxdp: Replacing XDP fd -1 with 3 on ifindex 1 > > [root@fedora xdp-tools]# bpftool prog > ... > 55: xdp name syncookie_xdp tag 1426f5e6593da050 gpl > loaded_at 2025-03-16T19:38:49-0700 uid 0 > xlated 8392B jited 6412B memlock 16384B map_ids 11,10,12 > btf_id 75 > > 56: xdp name synproxy_tailcall tag 0433e599459b925f gpl > loaded_at 2025-03-16T19:38:49-0700 uid 0 > xlated 192B jited 328B memlock 16384B map_ids 9,12 > btf_id 75 Sorry missed the Tested-by, you can add: Tested-by: Vincent Li <vincent.mc.li@xxxxxxxxx>