netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Octavian Purdila <opurdila@ixiacom.com>
To: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
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 17:04:17 +0300	[thread overview]
Message-ID: <200807181704.17211.opurdila@ixiacom.com> (raw)
In-Reply-To: <20080718122414.GA10688@2ka.mipt.ru>

On Friday 18 July 2008, Evgeniy Polyakov wrote:
>
> It will block in sending and/or other than network reading. With your
> patch if receiving socket was opened in blocking mode, than there is no
> way to finish splice-in until whole requested number of bytes are read.
> SPLICE_F_NONBLOCK is an extension, consider it like recv() with temporal
> non-blocking flag.
>

The way is see it, and API and documentation is written, SPLICE_F_NONBLOCK was 
added only for choosing to block or not block on the _pipe_, not on the other 
fd. 

And, IMHO, it should be kept that way. If we need to make certain splice 
operations non-blocking for the other file descriptor, then maybe we should 
add a separate flag for that. But, again IMHO, overloading SPLICE_F_NONBLOCK 
with responsabilities for both the pipe and the other file descriptor is 
wrong is at is taking the freedom from the application of controlling things. 

And when you do that, sooner or later you will run in a scenario which 
requires workarounds in the applications to bypass the API assumptions. 

> > Sorry, it was an unfortunate example :) This is not about not enough data
> > being available. Lets change the number of packets in the example with 20
> > instead of 16 (and keep the size to 17) - the splice call will still
> > block because of the pipe being full. The pipe can only hold PIPE_BUFFERS
> > packets (which is 16 currently).
>
> Why? It will read its data from 16 packets, then send them into another end
> of the pipe :)
>

splice will consume one packet at a time and will try to feed them in the 
pipe. Since the pipe can only hold 16 descriptors, on the 17th it will block. 

> You propose to change a very useful splice feature (actually you would just
> remove it at all with the same results for reading network path, since
> it is essentially what you did :) - not to block when it is possible.
>
> This kind of non-blocking mode was added for performance issues too:
> consider application which reads from the network and writes into the
> file, while there is no data in the socket it can write what was already
> read into any object attached to the given end of the pipe.

I have my doubts about the benefit of using the non-blocking operations only 
for some splice calls :) But to solve both issues the solution would be to 
add a separate non-blocking flag for the other file descriptor. Is that ok?

Thanks,
tavi

  reply	other threads:[~2008-07-18 14:06 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 [this message]
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=200807181704.17211.opurdila@ixiacom.com \
    --to=opurdila@ixiacom.com \
    --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 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).