Re: Data corruption issue with splice() on 2.6.27.10

From: Ben Mansell
Date: Thu Jan 08 2009 - 10:16:31 EST


Ingo Molnar wrote:
* Willy Tarreau <w@xxxxxx> wrote:

On Thu, Jan 08, 2009 at 07:16:51AM +0000, Jarek Poplawski wrote:
On 06-01-2009 19:15, Willy Tarreau wrote:
...
Ah, so you might also have discovered a few annoyances with the API, eg
the fact that splice() returns after the first read in non-blocking mode,
as well as the fact that it never returns zero on close, but -EAGAIN,
which requires an additional recv(MSG_PEEK) to distinguish between a
close and a lack of data. But I leave that for a later discussion, let's
address the corruption issue first.
FYI, this should be just fixed:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4f7d54f59bc470f0aaa932f747a95232d7ebf8b1

Ah cool, thanks Jarek for notifying us. Indeed, it's the exact same patch
I had pending here ;-)

I'll ping Greg for a backport into -stable, as applications relying on this will clearly not work without that fix.

The other one I had consists in removing "|| !timeo" at the end of the loop, because otherwise splice() returns very small chunks (typically 1448 or 1460 bytes), leading to disastrous performance on high bandwidth links. At 10 Gbps, this means about 800000 calls to splice() per second!

looks interesting - would you mind to submit it?

FWIW, I've also tested this change with some splice() benchmarks. I can confirm that removing the "|| !timeo" works well and improves performance significantly.


Ben
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/