dma_map_single和dma_map_page

时间:2012-10-26 10:50:02

标签: intel dma

我想做多帧的dma来发送大帧(jumbo)。我能够发送普通帧(大小为1500)。我需要对dma有些怀疑。

  1. dma_map_single()与其他api相比有什么真正的优势。我们可以用dma_map_page做任何事情,对吗?

  2. 假设我们需要在驱动程序中传输一个大帧(jumbo),并且我已将此帧存储在多个缓冲区中。这些缓冲区在物理内存或虚拟内存中不连续。但是这些缓冲区位于内核空间中。我们怎么能把它作为一个框架发送。我们应该使用scatter-gather dma吗?这可能与其他dma_api一起使用吗?

1 个答案:

答案 0 :(得分:0)

  1. dma_map_single和dma_map_page最终会调用 dam_ops-> map_page - 最终的函数由arch和 内核配置。通常它将是x86机器上的intel_map_page IOMMU。
  2. 首先,从内核的角度来看,Jumbo帧是无关紧要的 在TX时间,因为网络堆栈将传输的缓冲区合并到一起 到64K数据包(LSO / TSO)和NIC最终会破解 单个64K数据包到几个MTU(ETH为9K / 1500)大小的数据包 有自己的L3标题。
  3. 对于您的问题,SKB可以有一个分散 - 收集列表 - 每个缓冲区然后进行dma映射。 然后将dma地址和缓冲区长度列表写入发送描述符中的NIC,知道如何将它们组合在一起以便发送。

    顺便提一下,内核中有分散列表的dma_map_sg API,它将返回一个带有dma地址列表的分散列表。这通常与NIC驱动程序无关。