在bpf2bpf 里使用 tailcall 时,可以达到意想不到的效果: tailcall 目标 bpf prog 复用当前 subprog 的栈空间,而不是 subprog caller 的栈空间。 subprog caller 能获取到 tailcall 目标 bpf prog 的返回值。 tailcall in bpf2bpf 支持情况 从5.10 内核开始,x86 架构里 bpf2bpf 支持了 tailcall 特性,即...
在执行bpf_tail_call之前,打印before tail_call handle_udp 在bpf_tail_call调用函数handle_udp函数中,打印new udp packet captured (XDP) 在执行bpf_tail_call之后,打印after tail_call handle_udp 按照bpf_tail_call特性,如果bpf_tail_call执行成功,对应的eBPF程序将会执行并替换当前栈帧(当前eBPF的函数体就不再...
subprog 里使用 tailcall 的前提:bpf: allow for tailcalls in BPF subprograms for x64 JIT[2] since v5.10 kernel。 然而,在引入 tailcall in bpf2bpf 特性时,因为代码问题从而引入了这个问题。 在v5.19 内核里,commit ff672c67ee76 ("bpf, x86: Fix tail call count offset calculation on bpf2bpf c...
![bpf_tailcall_subprograms.png](images/bpf_tailcall_subprograms.png) 在实际跳转到目标程序之前,尾部调用将仅展开其当前堆栈帧。正如我们在上面的示例中所看到的,如果从子函数内部发生尾部调用,则当程序在 func2 执行时,函数的 (func1) 堆栈帧将出现在堆栈上。一旦最后一个函数 (func3) 函数终止,所有先前的...
bpf_tail_call_static(skb,&jmp_table,PARSE_IPV6); bpf_tail_call(skb,&jmp_table,PARSE_IPV6); break; } } Expand Down 2 changes: 2 additions & 0 deletions2tools/lib/bpf/bpf_helpers.h Original file line numberDiff line numberDiff line change ...
tailcall 是 v4.2 内核便已引入的一个特性,它允许一个 BPF 程序调用另一个程序,而无需返回原程序。 bpf: allow bpf programs to tail-call other bpf programs[1] 然而,在 BPF 子系统不断地引入新特性的同时,tailcall 跟新特性组合使用时,可能会引发一些问题。
bpf_tail_call(skb, &jmp_table, PARSE_VLAN); break; case ETH_P_MPLS_UC: case ETH_P_MPLS_MC: bpf_tail_call_static(skb, &jmp_table, PARSE_MPLS); bpf_tail_call(skb, &jmp_table, PARSE_MPLS); break; case ETH_P_IP: bpf_tail_call_static(skb, &jmp_table, PARSE_IP); bpf_tail_...