splice() 中的 DMA 复制

sli*_*ter 5 linux-kernel splice dma

我是 linux 内核的新手。最近,我经历了内核 2.6.33 中的 sendfile 系统调用。以下是我的行程顺序:

   do_sendfile()
=> do_splice_direct()
=> splice_direct_to_actor()
=> do_splice_to()
=> do_splice_from()
=> splice_read,splice_write
Run Code Online (Sandbox Code Playgroud)

在整个序列中,我没有找到 splice 使用 DMA 副本的地方。那么DMA复制在哪里发生呢?

gby*_*gby 5

Splice 不做任何 DMA 复制。事实上, splice 的主要用途是完全避免复制——它试图传递对内存页的引用,而不是复制缓冲区。

提到的与 splice 相关的 DMA 将发生在“叶子” - splice 传递引用的这些页面的来源将由例如磁盘控制器 DMA 创建到缓冲区中,并将由以太网控制器 DMA 发送将页面内容作为数据包的一部分 - 至少在“完美”的零复制场景中,这是难以实现且罕见的。

Splice 不执行 DMA - 它不允许在第一个 DMA 到最后一个 DMA 之间进行复制。