eBPF Talk: 共享的 tailcall PROG_ARRAY bpf map
文章目录
在研究 eBPF Talk: trace tailcall 程序?NO! 时,产生了疑惑:
- 静态
tailcall
使用的 PROG_ARRAY bpf map 能在多个进程之间共享吗?
TL;DR 能。且在更新 PROG_ARRAY bpf map 时,会更新静态 tailcall
的所有 bpf prog。
设计 demo
为了验证上述疑惑,我设计了如下 demo:
- 将
tailcall
的 PROG_ARRAY bpf map pin 到/sys/fs/bpf/tailcall-shared_progs
。 - 在一个进程里更新该 PROG_ARRAY bpf map。
- 在另一个进程里也更新该 PROG_ARRAY bpf map。
- 尝试在 XDP 里使用该 PROG_ARRAY bpf map。
demo 效果如下:
|
|
demo 源代码
P.S. demo 源代码:GitHub - Asphaltt/learn-by-example
使用的 bpf 代码如下:
|
|
kprobe
tcp 连接的两个关键函数。- 有两个用于更新 PROG_ARRAY bpf map 的 bpf prog。
Go 的代码比较啰嗦,就不贴了,直接跳转原文去查看源代码吧。
demo 结论
通过 demo 验证了静态 tailcall
的 PROG_ARRAY bpf map 能在多个进程之间共享。
即,在第二个进程更新 PROG_ARRAY bpf map 时,第一个进程里所使用的 bpf prog 也被更新了。
通过 demo,印证了 eBPF Talk: 更新 tailcall PROG_ARRAY bpf map 所学到的知识。
你也可以通过 eBPF Talk: 动态或静态 tailcall 中 gdb 的方式查看 bpf prog 的汇编指令,来验证这一结论。
文章作者 Leon Hwang
上次更新 2023-08-22