From: Willy Tarreau <w@1wt.eu>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Jens Axboe <jens.axboe@oracle.com>,
Evgeniy Polyakov <zbr@ioremap.net>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Subject: Re: Data corruption issue with splice() on 2.6.27.10
Date: Wed, 7 Jan 2009 07:38:59 +0100 [thread overview]
Message-ID: <20090107063859.GA30749@1wt.eu> (raw)
In-Reply-To: <20090107044232.GA22218@gondor.apana.org.au>
On Wed, Jan 07, 2009 at 03:42:32PM +1100, Herbert Xu wrote:
> On Tue, Jan 06, 2009 at 06:37:05PM +0000, Jens Axboe wrote:
> >
> > I'll give this a spin tomorrow as well. A hunch tells me that this is
> > likely a page reuse issue, that splice is getting the reference to the
> > buffer dropped before the data has really been transmitted. IOW, the
> > page is likely fine reaching the ->sendpage() bit, but will be reused
> > before the data has actually been transmitted. So once you get that far,
> > other random data from that page is going out.
>
> I see the problem.
>
> The socket pipes in net/core/skbuff.c use references on the skb
> to hold down the memory in skb->head as well as the pages in the
> skb.
>
> Unfortunately, once the pipe is fed into sendpage we only use
> page reference counting to pin down the memory. So as soon as
> sendpage returns we drop the ref count on the skb, thus freeing
> the memory in skb->head, which is yet to be transmitted.
So this means that anything relying on sendpage() is at risk ? What
I find really strange is that I can only reproduce the issue if the
spliced data come from a real interface. If they come from the loopback
or from a file, there is no problem. Maybe the ref counting is different
depending on the origin of the data ?
> Moral: Using page reference counts on skb->head is wrong.
My question will sound stupid to some of you, but wouldn't increasing
the refcount on those skb solve the problem (and decreasing it once
the skb is effectively sent) ?
Regards,
Willy
next prev parent reply other threads:[~2009-01-07 6:42 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-24 15:28 Data corruption issue with splice() on 2.6.27.10 Willy Tarreau
2009-01-06 8:54 ` Jarek Poplawski
2009-01-06 9:41 ` Willy Tarreau
2009-01-06 10:01 ` Jarek Poplawski
2009-01-06 10:04 ` Willy Tarreau
2009-01-06 15:57 ` Willy Tarreau
2009-01-07 9:39 ` Jarek Poplawski
2009-01-07 12:22 ` Willy Tarreau
2009-01-07 12:24 ` Herbert Xu
2009-01-07 12:38 ` Jarek Poplawski
2009-01-07 12:31 ` Jarek Poplawski
2009-01-07 12:35 ` Jens Axboe
2009-01-07 12:40 ` Evgeniy Polyakov
2009-01-07 12:52 ` Willy Tarreau
2009-01-07 12:53 ` Herbert Xu
2009-01-07 12:57 ` Evgeniy Polyakov
2009-01-07 13:08 ` Willy Tarreau
2009-01-07 12:49 ` Jarek Poplawski
2009-01-07 12:52 ` Herbert Xu
2009-01-07 13:00 ` Willy Tarreau
2009-01-07 13:01 ` Herbert Xu
2009-01-07 13:02 ` Jarek Poplawski
2009-01-12 12:02 ` Herbert Xu
2009-01-12 12:45 ` Evgeniy Polyakov
2009-01-12 12:56 ` Herbert Xu
2009-01-12 12:59 ` Evgeniy Polyakov
2009-01-12 21:11 ` Herbert Xu
2009-01-12 13:15 ` Jarek Poplawski
2009-01-12 21:12 ` Herbert Xu
2009-01-19 7:32 ` Jarek Poplawski
2009-01-07 12:39 ` Willy Tarreau
2009-01-07 12:56 ` Jarek Poplawski
2009-01-07 12:44 ` Herbert Xu
2009-01-06 17:42 ` Ben Mansell
2009-01-06 18:15 ` Willy Tarreau
2009-01-08 7:16 ` Jarek Poplawski
2009-01-08 8:05 ` Willy Tarreau
2009-01-08 14:53 ` Ingo Molnar
2009-01-08 15:16 ` Ben Mansell
2009-01-08 17:14 ` Willy Tarreau
2009-01-06 18:32 ` Evgeniy Polyakov
2009-01-06 18:37 ` Jens Axboe
2009-01-06 18:55 ` Willy Tarreau
2009-01-07 4:42 ` Herbert Xu
2009-01-07 6:38 ` Willy Tarreau [this message]
2009-01-07 9:52 ` Herbert Xu
2009-01-07 9:54 ` Willy Tarreau
2009-01-07 11:52 ` Herbert Xu
2009-01-07 8:17 ` Jens Axboe
2009-01-07 11:29 ` Evgeniy Polyakov
2009-01-07 11:50 ` Herbert Xu
2009-01-07 11:56 ` Evgeniy Polyakov
2009-01-07 11:59 ` Herbert Xu
2009-01-07 12:15 ` Evgeniy Polyakov
2009-01-07 12:22 ` Herbert Xu
2009-01-07 12:27 ` Herbert Xu
2009-01-07 12:30 ` Herbert Xu
2009-01-07 12:37 ` Evgeniy Polyakov
2009-01-07 12:42 ` Herbert Xu
2009-01-07 12:46 ` Evgeniy Polyakov
2009-01-07 12:55 ` Willy Tarreau
2009-01-07 12:57 ` Herbert Xu
2009-01-07 13:02 ` Evgeniy Polyakov
2009-01-07 13:10 ` Jarek Poplawski
2009-01-07 13:15 ` Willy Tarreau
2009-01-07 13:22 ` Jarek Poplawski
2009-01-07 14:01 ` Jarek Poplawski
2009-01-06 18:50 ` Willy Tarreau
2009-01-19 8:39 ` Lennert Buytenhek
2009-01-19 9:53 ` Willy Tarreau
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=20090107063859.GA30749@1wt.eu \
--to=w@1wt.eu \
--cc=herbert@gondor.apana.org.au \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=zbr@ioremap.net \
/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).