From: Octavian Purdila <opurdila@ixiacom.com>
To: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, axboe@kernel.dk
Subject: Re: [PATCH] tcp: do not promote SPLICE_F_NONBLOCK to socket O_NONBLOCK
Date: Fri, 18 Jul 2008 20:04:44 +0300 [thread overview]
Message-ID: <200807182004.44664.opurdila@ixiacom.com> (raw)
In-Reply-To: <20080718160009.GA29740@2ka.mipt.ru>
On Friday 18 July 2008, Evgeniy Polyakov wrote:
> > It will take 17 because this is what the user requested. And when trying
> > to push the 17th on the pipe, it will block. I base this both on
> > experiments and on my understanding of the tcp splice receive
> > implementation.
>
> Seems like we do not understand each other. How it can take 17 if there
> are only 16 pages? By 'push' you mean splice-into-pipe or
> splice-out-of-pipe-into-other-fd? Where exactly will it block?
>
Suppose we have 20 packets in the socket queue and the pipe is empty and the
application calls splice(sock, pipe, 17, flags=0).
Then, tcp_splice_read will be called, which in turn calls tcp_read_sock.
tcp_read_sock will loop until all the 17 bytes will be read from the socket.
tcp_read_sock calls skb_splice_bits which calls splice_to_pipe.
Now while skb_splice_bits is carefull to only put a maximum of PIPE_BUFFERS
during its iteration, due to the looping in tcp_read_sock, we will end up
with 17 calls to splice_to_pipe. Thus on the 17th call, splice_to_pipe will
block.
Does this make sense?
Thanks,
tavi
next prev parent reply other threads:[~2008-07-18 17:07 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-17 13:33 [PATCH] tcp: do not promote SPLICE_F_NONBLOCK to socket O_NONBLOCK Octavian Purdila
2008-07-17 14:21 ` Evgeniy Polyakov
2008-07-17 14:47 ` Octavian Purdila
2008-07-17 17:41 ` Evgeniy Polyakov
2008-07-17 21:52 ` Octavian Purdila
2008-07-18 10:53 ` Evgeniy Polyakov
2008-07-18 11:18 ` Octavian Purdila
2008-07-18 12:24 ` Evgeniy Polyakov
2008-07-18 14:04 ` Octavian Purdila
2008-07-18 14:32 ` Evgeniy Polyakov
2008-07-18 15:50 ` Octavian Purdila
2008-07-18 16:00 ` Evgeniy Polyakov
2008-07-18 17:04 ` Octavian Purdila [this message]
2008-07-18 17:53 ` Evgeniy Polyakov
2008-07-18 18:16 ` Octavian Purdila
2008-07-18 18:35 ` Evgeniy Polyakov
2008-07-18 18:43 ` Octavian Purdila
2008-07-19 8:51 ` Evgeniy Polyakov
2008-07-19 11:18 ` Octavian Purdila
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200807182004.44664.opurdila@ixiacom.com \
--to=opurdila@ixiacom.com \
--cc=axboe@kernel.dk \
--cc=johnpol@2ka.mipt.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.