Re: zero copy for relay server
From: Changli Gao <hidden>
Date: 2011-03-29 02:00:31
On Tue, Mar 29, 2011 at 2:34 AM, Eric Dumazet [off-list ref] wrote:
Le lundi 28 mars 2011 à 23:48 +0530, Viral Mehta a écrit :quoted
Still, these are two system calls.Yes. Is it a problem ? What kind ?
I think he concerns the overhead of system calls. In order to omit a system call, I think you can implement sth. like this: splice2(infd, outfd, pipefd, ...) What you need do is maintaining pipes by yourself.
quoted
2. I believe underlying PIPE that we are using will also have some size limit (like in user space 4K or 64K, not sure)What kind of socket is able to deliver more than 64K frames ?
You can enlarge the size with fcntl(pipefd, F_SETPIPE_SZ,...).
quoted
So, all in all Why cant we have just one system call which really transfers "length" bytes of data form one socket to another ? Recv "length" bytes of data from socket A and send to socket B. I wanted to understand if there are any limitations or concerns that we still do not have any such system call .... ?The answer is : Once you try to implement this, you'll discover it'll be splice() based, using pipe as a buffer between the sockets.
Yes, but I think the internal buffer of pipe is pages, and it limits its use in socket context. See skb_splice_bits(), and I am afraid copy usually happens. Maybe the buffer of pipe should be any data but with proper tear down functions.
sendfile() is based on top of splice(), but it's faster to use splice().
Why? Thanks. -- Regards, Changli Gao(xiaosuo@gmail.com)