net: stmmac: Use pagepool instead of streaming buffers for Tx
网络 · stmmac 网卡 Tx 路径 page_pool 化 · 减少 DMA 映射开销
💡 一句话总结
在 stmmac 网卡的高吞吐 Tx 场景下,作者把发送路径的 DMA buffer 从"每次 dma_map_single 流式映射"改为"page_pool 复用缓冲池"(通过 snps,pagepool-tx-buf-quirk 设备树属性启用),减少反复 DMA 映射/解映射的开销。补丁未提供基准数据,收益为逻辑分析。
📋 补丁基本信息
| 项目 | 内容 |
|---|---|
| 补丁类型 | 优化(网络 Tx 路径) |
| 状态 | In Review(net-next) |
| 当前版本 | PATCH net-next 2/3 · lore 链接 |
| 作者机构 | Muhammad Nazim (Altera/Intel) |
| 提交日期 | 2026-08-03 |
| 改动范围 | 4 文件,+70/-11 行 |
| 核心函数 | stmmac_xmit() / page_pool_alloc_pages() |
📊 速览卡片
核心机制
page_pool 化
优化目标
减 DMA 映射
适用场景
高吞吐 Tx
实测提升
未提供
🎯 解决什么问题
背景 / 原始动机
stmmac Tx 路径传统上对每个 skb 调用
dma_map_single() 做流式 DMA 映射,发送完成后 dma_unmap_single() 解映射——高吞吐下反复映射/解映射是开销。page_pool 提供可复用的 buffer 池,减少分配与映射成本。
系统层面:流式 DMA 映射 vs page_pool 复用
原路径:每 skb
dma_map_single + 完成后 dma_unmap_single。新路径(tx_buf_quirk 启用时):从 tx_q->page_pool 分配页,用 page_pool_get_dma_addr() 拿已映射的 DMA 地址,发送后 page_pool_recycle_direct() 回收——避免反复 map/unmap。
场景层面
高吞吐网络 Tx(大量小包、高 PPS)时,DMA 映射/解映射的反复开销累积明显(解读(AI 分析))。通过设备树
snps,pagepool-tx-buf-quirk 按需启用,不影响默认路径。
🧩 核心机制
为每个 Tx 队列创建 page_pool,发送时从池取页(预映射 DMA),发送后回收,减少反复映射。
改动要点
创建池:
Tx 用池:
回收:
__alloc_dma_tx_desc_resources() 里 page_pool_create(),PP_FLAG_DMA_MAP 预映射。Tx 用池:
stmmac_xmit() 在 quirk 下 page_pool_alloc_pages(),拷 skb 数据入页,page_pool_get_dma_addr() 拿地址。回收:
stmmac_tx_clean() 里 page_pool_recycle_direct()。
🔬 关键代码
+ tx_buf_page = page_pool_alloc_pages(tx_q->page_pool, gfp);
+ if (!tx_buf_page)
+ goto dma_map_err;
+
+ dma_addr = page_pool_get_dma_addr(tx_buf_page);
+ stmmac_set_tx_dma_entry(tx_q, first_entry,
+ STMMAC_TXBUF_T_DMA, dma_addr,
+ nopaged_len, false);
+ tx_q->tx_skbuff_dma[first_entry].page = tx_buf_page;
+
+ dma_sync_single_for_cpu(priv->device, dma_addr, ...);
+ skb_copy_from_linear_data(skb, page_address(tx_buf_page), ...);
+ dma_sync_single_for_device(priv->device, dma_addr, ...);▲ Tx 用 page_pool 页 + 预映射 DMA 地址,替代每次 dma_map_single(逐字 diff)。
📈 性能影响
**补丁未提供基准数据。** 收益为逻辑分析(解读(AI 分析)):高吞吐 Tx 下减少反复 DMA 映射/解映射开销;且通过设备树属性按需启用,不影响默认路径。
🔗 交叉引用
📌 关联工作
block: introduce dma map backed bio type — 同日报另一篇 DMA 映射优化(块层侧),同为"减少反复 DMA 映射"方向
PATCH net-next 2/3 lore — 本补丁原始链接
PATCH net-next 2/3 lore — 本补丁原始链接
⚠️ 风险与局限
潜在回归 / 边界
默认关闭:需设备树
内存开销:page_pool 预分配缓冲,增加常驻内存。
适用性:部分硬件/场景可能不需要(quirk 化即为此)。review 会关注实际吞吐收益是否有数据支撑。
snps,pagepool-tx-buf-quirk 才启用,默认路径不变,回归风险低。内存开销:page_pool 预分配缓冲,增加常驻内存。
适用性:部分硬件/场景可能不需要(quirk 化即为此)。review 会关注实际吞吐收益是否有数据支撑。
严重度:MINOR · 待 review:无 benchmark 数据支撑
✅ 关键洞察
- 发现:stmmac Tx 路径 page_pool 化,减少高吞吐下反复 DMA 映射开销
- 证据:无基准数据;收益为逻辑分析
- 边界:设备树 quirk 按需启用,默认路径不变
- 风险 / 建议:需 benchmark 支撑;page_pool 预分配增内存
⚠️ 免责声明
本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。