eBPF Talk: fsession 简介
文章目录
fsession 是我跟 Menglong 大佬合作的杰作,已合入 bpf 社区,将在 v7.0 合入 Linux 主线。
目前,fsession 已支持 x86_64 和 arm64 架构。
TL;DR fsession 指的是一个新的 tracing attach type: BPF_TRACE_FSESSION,提供了
fentry + fexit 的能力;并提供 bpf_session_is_return() kfunc 用来区分 entry/exit。
同时,提供 bpf_session_cookie() kfunc 用来 entry -> exit 传递信息。
用法
类似于 fentry/fexit,直接使用 SEC("fsession") 即可:
|
|
类似于 fentry + fexit,该 bpf prog 在 icmp_rcv 运行前后各运行一次。
bpf_session_cookie() 用法如下:
|
|
实现
底层使用的是 BPF 版本的 trampoline:
- eBPF Talk: poke on x86【汇编慎入】
- eBPF Talk: perilogue on x86【汇编慎入】
- eBPF Talk: freplace on x86【汇编慎入】
- eBPF Talk: trampoline on x86【汇编慎入】
- eBPF Talk: trampoline on x86【续】【汇编慎入】
- eBPF Talk: trampoline stack on x86【汇编慎入】
不过,fsession 没有直接在 trampoline 里新增自己的实现代码,而是将 fsession 拆分成
fentry + fexit 这样的 2 个 trampoline link,从而复用 trampoline 里 fentry
和 fexit 的实现逻辑。
|
|
题外
在 Linux v7.0 合并窗口前,我给 arm64 新增 fsession 支持的 patch 合入了 bpf 社区;
该 patch 带上了 fsession 的第一个 bug fix: Menglong 大佬在迭代 fsession 时
漏掉了对其它架构的检查。
小记
该需求来源于 bpfsnoop。
在 bpfsnoop 里,bpfsnoop --output-fgraph 需要使用一个 bpf prog 对大量内核函数同时
进行 fentry 和 fexit,就想着在 trampoline 里复用一个 bpf prog 对内核函数同时进行
fentry + fexit 处理;即新增一个 tracing attach type farount。
在 2025 年上半年便完成了 PoC,但忙着推进
eBPF Talk: 新增 BPF_F_CPU 和 BPF_F_ALL_CPUS flag
和 bpf: Extend BPF syscall with common attributes support,就没有精力同时将 faround
推向社区。
在 2025 年下半年,跟 Menglong 大佬讨论时,一拍即合:由 Menglong 大佬基于 faround PoC
代码实现 fsession 并推向社区。
耗时接近 3 个月,历经 13 个版本,fsession 终于合入了 bpf 社区。
小结
当需要对内核函数、bpf prog 既要 fentry 也要 fexit 时,推荐使用 fsession,可以节省
一个 bpf prog + 一个 bpf link。
fsession 进阶用法,请参考 bpfsnoop: Add fsession support。
文章作者 Leon Hwang
上次更新 2026-02-02