Thread (8 messages) flat view 8 messages, 3 authors, 2011-03-29

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)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help