eBPF Talk: bpf2bpf & tailcall 报错分析
文章目录
终于要将 bpf2bpf
& tailcall
的组合落地到项目中了。
不过,当头一棒的是:tail_calls are not allowed when call stack of previous frames is 256 bytes. Too large
。
幸好学习过 eBPF Talk: tailcall on x86,知道该报错出在哪里:
|
|
就能够明白,报错是因为 bpf prog 消耗的栈空间不小于 256 字节。
该怎么解决呢?
解决办法不就是减小栈空间的使用量嘛。于是,我便分析了一下栈空间的消耗:
- 有个
struct tunnel
,消耗 44 字节。 - 有个
struct sflow
,消耗 48 字节。 - 有个
bpf_printk()
,消耗 77 字节。
而栈深度的计算方式是向上取整(32 的倍数),超过 224 字节就取 256 字节。
|
|
“杀栈凶手” 就是那个 bpf_printk()
,干掉后就不再报这个错了。
Q:
bpf_printk()
为什么消耗的是栈空间?A: 如果
bpf_printk()
的字符串不放在栈里,放在哪里?通过查看 BPF ELF 文件里的汇编、或者bpftool prog dump xlated
,可以确认bpf_printk()
的字符串就是放在栈上:
|
|
文章作者 Leon Hwang
上次更新 2023-05-23