Chinaunix

标题: 可否实现网卡到磁盘的零拷贝? [打印本页]

作者: okr001610    时间: 2009-04-21 10:54
标题: 可否实现网卡到磁盘的零拷贝?
前阵子在版里看了很多 网卡到用户空间 零拷贝的帖子,最近突然想到,可否实现网卡到磁盘的零拷贝呢?有几个问题想请教大家:

1.绕过page buffer,把网卡DMA_Ring上的skb写到raw devices上,或者用Direct I/O方式写到磁盘分区。
  磁盘的Direct I/O 是由DMA搞定,不需要CPU参与?

  另:读写raw devices == 使用Direct I/O方式读写没有格式化(文件系统)的分区 ?


2.考虑到page buffer的好处,把网卡DMA_Ring上的skb映射到page buffer上,这样就避免了CPU参与拷贝。
  但是不知能否映射?

3. sendfile()方式是否就是把page buffer复制到TX_Ring,再由网卡DMA到其FIFO上?
作者: epegasus    时间: 2009-04-21 10:58
从设备到设备的DMA?还得是跨几种总线?硬盘好象也要内存cache啊
如果是不走内存的话,就是2个是设备的互访问,连host桥都不走.

[ 本帖最后由 epegasus 于 2009-4-21 11:26 编辑 ]
作者: okr001610    时间: 2009-04-21 11:11
原帖由 epegasus 于 2009-4-21 10:58 发表
从设备到设备的DMA?还得是跨几种总线?硬盘好象也要内存cache啊
如果是不走内存的话,就是2个是设备的互访问,两host桥到不走.


厄....我是想能否设计一种网卡到磁盘的数据通路,尽量避免CPU参与复制
附件里是棒子的一篇论文,他们的思路是把 skb复制到page buffer里

[ 本帖最后由 okr001610 于 2009-4-21 11:15 编辑 ]

datapath.JPG (67.84 KB, 下载次数: 15)

datapath.JPG

Design and implementation of zero-copy data path for efficient file transmission.pdf

608.9 KB, 下载次数: 61


作者: epegasus    时间: 2009-04-21 11:20
这个问题我前几天也问过,不过我比较菜,找不到答案
我想如果硬件驱动本身和复杂的,你要在2中设备数据上做解析,那在dma前就要做这些工作,貌似要重设计硬件,不太现实.
http://linux.chinaunix.net/bbs/thread-1096162-1-4.html
作者: epegasus    时间: 2009-04-21 11:23
上图说明经过内存的中转,确实能做到..
作者: okr001610    时间: 2009-04-21 11:33
原帖由 epegasus 于 2009-4-21 11:23 发表
上图说明经过内存的中转,确实能做到..


棒子的设计,skb 与 page buffer之间还是得有一次cpu copy...
所以我想问的是,
1.skb 与 page buffer间能否映射(改网卡驱动也可以)
2.使用Direct I/O把skb写到磁盘上是不是就 zero copy了...?
作者: thomas_ar    时间: 2009-04-21 16:49
看看 splice 系统调用 真正的零拷贝,只是拷贝指针就实现buffer的拷贝
作者: emmoblin    时间: 2009-04-21 23:17
只要修改硬件什么都可以。
在网卡和硬盘之间添加一个dma设备,就能完成。
如果只是现在x86单靠软件是做不到得
作者: xiegang112    时间: 2009-04-22 11:12
iscsi enterprise target中,如果用block i/o就应该是0拷贝吧。
它把skb封装成bio,直接提交给block layer,相当于direct i/o。 bio生成request,提交到驱动,然后再到控制器。其中没有拷贝。
比如lsi的scsi host controller。request被scsi 层转化成命令后,提交各lsi驱动,该驱动把发送的数据和命令地址放在自己的ring buffer里,然后交给host controller dma。
block i/o的整个过程,没有memcpy操作,数据从网卡ring buffer到磁盘控制器ring buffer。
不知道这样算不算零拷贝?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2