From: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
To: Octavian Purdila <opurdila@ixiacom.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] tcp: do not promote SPLICE_F_NONBLOCK to socket O_NONBLOCK
Date: Fri, 18 Jul 2008 14:53:44 +0400 [thread overview]
Message-ID: <20080718105344.GA481@2ka.mipt.ru> (raw)
In-Reply-To: <200807180052.33918.opurdila@ixiacom.com>
Hi.
On Fri, Jul 18, 2008 at 12:52:33AM +0300, Octavian Purdila (opurdila@ixiacom.com) wrote:
> You lost me here :)
>
> The way I interpret the man page text is that it is ok for splice to block,
> even if SPLICE_F_NONBLOCK is set. The comments near SPLICE_F_NONBLOCK says
> the same thing:
>
> #define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
> /* we may still block on the fd we splice */
> /* from/to, of course */
>
> Am I missing something?
tcp_splice_read:
timeo = sock_rcvtimeo(sk, flags & SPLICE_F_NONBLOCK);
So, if you set SPLICE_F_NONBLOCK, then reading from the network will not
block. Splice can block in reading from other descriptors though. It can
also block during writing.
> > > But more importantly, how can we solve the deadlock issue described in
> > > the patch? Do we need all of the complications of async I/O for such a
> > > simple and common usecase?
> >
> > I'm not sure I understand how it can deadlock, please explain it in more
> > details.
>
> For this "program":
>
> x=splice(socket, pipe, size, flags=0);
> if (x > 0)
> splice(pipe, file, x, flags=0);
>
> it is hard to come up with a non tiny value for size that does not deadlock
> the program, because the pipe size is measured in packets and not bytes and
> we have no control over the packet sizes.
>
> For example, if we set size=17 and we are unlucky and get 16 packets of 1 byte
> in a row, at the right time, the first splice call will block - and the
> program will deadlock since we can't reach the consumer.
It is not a deadlock. recv() on blocking socket with the same parameters
will behave exactly the same. Application designer should think about
how it is supposed to handle cases, when not enough data is available in
the receiving queue - either return or wait.
--
Evgeniy Polyakov
next prev parent reply other threads:[~2008-07-18 10:53 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 [this message]
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
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=20080718105344.GA481@2ka.mipt.ru \
--to=johnpol@2ka.mipt.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=opurdila@ixiacom.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).