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),发送后回收,减少反复映射。

改动要点
创建池:__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 — 本补丁原始链接

⚠️ 风险与局限

潜在回归 / 边界
默认关闭:需设备树 snps,pagepool-tx-buf-quirk 才启用,默认路径不变,回归风险低。
内存开销:page_pool 预分配缓冲,增加常驻内存。
适用性:部分硬件/场景可能不需要(quirk 化即为此)。review 会关注实际吞吐收益是否有数据支撑。
严重度:MINOR · 待 review:无 benchmark 数据支撑

✅ 关键洞察

  • 发现:stmmac Tx 路径 page_pool 化,减少高吞吐下反复 DMA 映射开销
  • 证据:无基准数据;收益为逻辑分析
  • 边界:设备树 quirk 按需启用,默认路径不变
  • 风险 / 建议:需 benchmark 支撑;page_pool 预分配增内存
⚠️ 免责声明

本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。