[RFC] socket的splice_read实现

Changli Gao xiaosuo在gmail.com
星期六 十二月 29 00:31:35 CST 2007


splice系统调用通过直接操作内存页面的方式可以避免某些不必要的缓冲区拷贝,但是目前socket部分只有写/发送支持,接收部分还没能支持。从网上搜到如下讨论http://marc.info/?t=118103098900005&r=1&w=2
,解决方法不是特别好,这应该也是它未能进官方内核的原因。

我想到两种方法:
1. 直接在splice_read中直接调用read,将数据写到pipe的内存页中。
2. 修改pipe让其支持除了pipe外的其它缓冲块,当splice_read的时候直接把skb中的数据连接(必要的时候增加引用计数)到pipe中,发送的时候也是用这个数据直接构造skb。

1的方法比较简单,对内核改动较小。但是如果是两个socket转发数据,至少还存在一次copy(从skb到pipe的page)。skb->
pipe page -> send_page比skb -> user buffer -> skb还是高效的。
2改动比较大,但是能够实现真正意义上的零拷贝,和tcp splice的效率应该可以做到相当。

大家有什么看法呢?

-- 
Regards,
Changli Gao(xiaosuo在gmail.com)


关于邮件列表 Linux-kernel 的更多信息