09 XDP 与 AF_XDP

09 XDP 与 AF_XDP

源码:stmmac_xdp.cstmmac_xdp.h
数据面:stmmac_main.cstmmac_rxstmmac_rx_zcstmmac_xdp_xmit

1. 模块划分

文件 职责
控制面 stmmac_xdp.c 挂载 BPF、绑定 XSK pool、队列模式切换
数据面 stmmac_main.c RX 运行 BPF、XDP_TX、AF_XDP zero-copy

2. XDP 挂载

2.1 ndo_bpf

1
.ndo_bpf = stmmac_bpf,

处理:

  • XDP_SETUP_PROGstmmac_xdp_set_prog()
  • XDP_SETUP_XSK_POOLstmmac_xdp_setup_pool()

2.2 stmmac_xdp_set_prog()

  1. 替换 priv->xdp_progbpf_prog_put 旧程序)
  2. 若从无 XDP 到有 XDP:可能需调整 RX headroom(stmmac_rx_offset()
  3. rx_copybreak 策略交互

3. AF_XDP Zero-Copy

3.1 启用 pool

stmmac_xdp_enable_pool()

  1. 校验 queue 同时具有 RX+TX 能力
  2. 校验 frame size 与 MTU/buffer 一致
  3. 绑定 rx_q->xsk_pool / tx_q->xsk_pool
  4. 设置 af_xdp_zc_qps bitmap
  5. 重启队列:释放旧 page_pool ring,按 XSK umem 重建 descriptor

3.2 NAPI 模式切换

启用 XSK 后 channel 使用 rxtx_napi(合并 poll):

1
rx_napi = rx_q->xsk_pool ? &ch->rxtx_napi : &ch->rx_napi;

stmmac_napi_poll_rxtx() 同时处理 TX clean 与 stmmac_rx_zc()

3.3 stmmac_rx_zc()

  • DMA 直接写入 XSK buffer(用户态 umem)
  • 通过 xsk_buff_alloc / xsk_buff_free 管理
  • 完成后 xsk_tx_completed() / xsk_wake_up() 通知用户态

4. XDP 数据路径(非 zero-copy)

stmmac_rx() 中:

1
2
3
4
5
6
7
8
9
10
11
if (stmmac_xdp_is_enabled(priv)) {
xdp.data = page_address(buf->page) + offset;
xdp.frame_sz = frame_size;
act = bpf_prog_run_xdp(priv->xdp_prog, &xdp);
switch (act) {
case XDP_PASS: /* 继续建 skb */
case XDP_DROP: /* 回收 page */
case XDP_TX: /* stmmac_xdp_xmit */
case XDP_REDIRECT: /* bpf_redirect */
}
}

5. XDP 发送

入口 说明
ndo_xdp_xmit stmmac_xdp_xmit() — bulk XDP 帧发送
XDP_TX action RX 中直接转发到 TX ring
ndo_xsk_wakeup stmmac_xsk_wakeup() — 用户态 kick

stmmac_tx_info.buf_type 区分:

  • STMMAC_TXBUF_T_SKB
  • STMMAC_TXBUF_T_XDP_TX
  • STMMAC_TXBUF_T_XDP_NDO
  • STMMAC_TXBUF_T_XSK_TX

6. 队列要求

AF_XDP zero-copy 要求:

  • 同一 queue index 必须 RX 和 TX 均启用
  • 通常 dedicated queue(如 queue 0 给 XDP,其它给内核栈)

7. 与 page_pool 关系

模式 RX 缓冲来源
普通 page_pool
XDP(无 ZC) page_pool + XDP headroom
AF_XDP ZC xsk_buff_pool(umem)

模式切换需 down/up 接口 或驱动内部 queue reset。

8. 调试

1
2
3
4
5
# 加载 XDP 程序
ip link set dev eth0 xdp obj prog.o sec xdp

# AF_XDP
xdp-loader load eth0 prog.o

9. 相关文档

文章互动

阅读 --

留言

0 条留言

正在加载留言…