You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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+版本:程序启动后无任何输出,完全失效

正常运行日志

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
# 无任何输出

排查思路

  1. 确认BPF程序加载状态

    • 执行bpftool prog list检查xdp_sample_pkts对应的BPF程序是否成功挂载到目标网卡enp0s8
    • 查看内核日志(dmesg或journalctl -k),排查是否存在BPF程序加载失败、权限不足或验证错误的信息
  2. 核对perf buffer相关内核变更

    • 对比Linux 6.0与6.1版本的内核源码,重点检查include/linux/bpf.h、kernel/bpf/perf_buffer.c中的API或逻辑变化
    • 确认XDP程序中bpf_perf_event_output()的调用参数是否符合新内核要求,比如map类型、flags参数是否有调整
  3. 跟踪XDP程序执行逻辑

    • 使用bpftool prog trace跟踪BPF程序的执行路径,确认数据包是否进入XDP程序,以及bpf_perf_event_output()是否被正确调用
    • 检查XDP程序的返回值,排查是否因6.1内核中XDP动作(如XDP_PASS/XDP_DROP)的行为变化导致数据包未被捕获
  4. 验证用户态perf buffer初始化

    • 检查perf_buffer__new()的返回值是否成功,确认是否需要针对6.1内核调整参数(如页面大小、队列数量)
    • 核对用户态回调函数的注册逻辑,排查是否因内核变更导致回调未被触发
  5. 检查网卡驱动与XDP模式兼容性

    • 确认目标网卡enp0s8的驱动在6.1内核中是否支持-S指定的XDP_SKB模式,是否存在驱动适配问题
    • 尝试切换XDP模式(如XDP_DRV/XDP_HW)测试,观察是否能恢复输出

内容的提问来源于stack exchange,提问作者Aravind Buduri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:50:25