Linux 6.1中perf_buffer__new()失效,XDP用户态程序无输出求助
XDP程序在Linux 6.1版本中通过
perf_buffer__new()无法获取数据包数据 环境与现象
- 开发基于XDP的用户态应用,依赖
perf_buffer__new()接口获取数据包数据 - 跨内核版本测试结果:
- Linux 6.0及以下版本(如6.0.0-rc2+):samples/bpf目录下的
xdp_sample_pkts程序运行正常,可正常打印MAC头信息 - Linux 6.1.0-rc1+版本:程序启动后无任何输出,完全失效
- Linux 6.0及以下版本(如6.0.0-rc2+):samples/bpf目录下的
正常运行日志
root@akb:/home/akb/SRC/net/net-next/samples/bpf# uname -a Linux akb 6.0.0-rc2+ #153 SMP PREEMPT_DYNAMIC Tue Nov 8 16:52:50 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root@akb:/home/akb/SRC/net/net-next/samples/bpf# ./xdp_sample_pkts -S enp0s8 Pkt len: 60 bytes. Ethernet hdr: ff ff ff ff ff ff 30 42 40 c9 39 6c 08 06 Pkt len: 60 bytes. Ethernet hdr: ff ff ff ff ff ff 30 42 40 c9 39 6c 08 06
异常运行日志
root@akb:/home/akb/SRC/net/linux-net-next/samples/bpf# uname -a Linux akb 6.1.0-rc1+ #16 SMP PREEMPT_DYNAMIC Fri Nov 4 11:25:53 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root@akb:/home/akb/SRC/net/inux-net-next/samples/bpf# ./xdp_sample_pkts -S enp0s8 # 无任何输出
排查思路
确认BPF程序加载状态
- 执行
bpftool prog list检查xdp_sample_pkts对应的BPF程序是否成功挂载到目标网卡enp0s8 - 查看内核日志(
dmesg或journalctl -k),排查是否存在BPF程序加载失败、权限不足或验证错误的信息
- 执行
核对perf buffer相关内核变更
- 对比Linux 6.0与6.1版本的内核源码,重点检查
include/linux/bpf.h、kernel/bpf/perf_buffer.c中的API或逻辑变化 - 确认XDP程序中
bpf_perf_event_output()的调用参数是否符合新内核要求,比如map类型、flags参数是否有调整
- 对比Linux 6.0与6.1版本的内核源码,重点检查
跟踪XDP程序执行逻辑
- 使用
bpftool prog trace跟踪BPF程序的执行路径,确认数据包是否进入XDP程序,以及bpf_perf_event_output()是否被正确调用 - 检查XDP程序的返回值,排查是否因6.1内核中XDP动作(如XDP_PASS/XDP_DROP)的行为变化导致数据包未被捕获
- 使用
验证用户态perf buffer初始化
- 检查
perf_buffer__new()的返回值是否成功,确认是否需要针对6.1内核调整参数(如页面大小、队列数量) - 核对用户态回调函数的注册逻辑,排查是否因内核变更导致回调未被触发
- 检查
检查网卡驱动与XDP模式兼容性
- 确认目标网卡
enp0s8的驱动在6.1内核中是否支持-S指定的XDP_SKB模式,是否存在驱动适配问题 - 尝试切换XDP模式(如XDP_DRV/XDP_HW)测试,观察是否能恢复输出
- 确认目标网卡
内容的提问来源于stack exchange,提问作者Aravind Buduri
相关产品推荐
相关产品推荐

