From: Bron Gondwana <brong@fastmail.fm>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Bron Gondwana <brong@fastmail.fm>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Nick Piggin <npiggin@suse.de>,
Andrew Morton <akpm@linux-foundation.org>,
Rob Mueller <robm@fastmail.fm>, Andi Kleen <andi@firstfloor.org>,
Ingo Molnar <mingo@elte.hu>
Subject: Re: BUG: mmapfile/writev spurious zero bytes (x86_64/not i386, bisected, reproducable)
Date: Wed, 18 Jun 2008 13:14:06 +1000 [thread overview]
Message-ID: <20080618031406.GA4326@brong.net> (raw)
In-Reply-To: <alpine.LFD.1.10.0806171415060.2907@woody.linux-foundation.org>
On Tue, Jun 17, 2008 at 02:20:49PM -0700, Linus Torvalds wrote:
> On Tue, 17 Jun 2008, Linus Torvalds wrote:
> >
> > Hmm. Something like this *may* salvage it.
> >
> > Untested, so far (I'll reboot and test soon enough), but even if it fixes
> > things, it's not really very good.
>
> Ok, so I just rebooted with this, and it does indeed fix the bug.
>
> I'd be happier with a more complete fix (ie being byte-accurate and
> actually doing the partial copy when it hits a fault in the middle), but
> this seems to be the minimal fix, and at least fixes the totally bogus
> return values from the x86-64 __copy_user*() functions.
>
> Not that I checked that I got _all_ cases correct (and maybe there are
> other versions of __copy_user that I missed entirely), but Bron's
> test-case at least seems to work properly for me now.
>
> Bron? If you have a more complete test-suite (ie the real-world case that
> made you find this), it would be good to verify the whole thing.
Ok - I pulled the latest linus-2.6 git, and discovered
the patch was already in there, so I just built and
rebooted (git 952f4a0a9b27e6dbd5d32e330b3f609ebfa0b061).
Confirmed - fixed in both the test code and the cyr_dbtool
test case I was using previously (I would have posted that
instead, but building cyrus is a bit of pain. You need
bdb and sasl and all sorts of extraneous crap - and
cyrusdb_skiplist.c depends on about half of Cyrus'
infrastructure, so I couldn't just pull it out by itself)
For my sins, I appear to be becoming the world expert on
that particular file. I've debugged skiplist bugs many
times over, and completely rewritten the locking code.
It really does some pretty evil things - the memory accesses
look something like this:
[file...................]
[mmap^....^.^........^^..................................]
[file...................++++++++++++]
[mmap^....^.^........^^.^^ ^ ^^.....................]
Where (^) is the bits that get accessed. All reads are via
the mmap, all writes are done with retry_write or
retry_writev (Cyrus library functions that keep hammering
until all the bytes are written)
I was suspecting as early as Friday night (we've been
debugging this one for a few days now!) that it was page
break related, because the bug only seemed to be appearing
on seen databases with really long seen lists (they're in
ranged integer format like 1:5,7:9,12,14:22,24:...).
It didn't help that at first we were only finding out about
cases where the corruption hit exactly on the "navigational
components", hence breaking the skiplist logic. And then
the backpointer writes would scribble all over the corrupt
area as well, so that made it even stranger to debug!
OK - so I'll report this issue to the Cyrus mailing list.
Warn people not to run on kernels 2.6.23 -> 2.6.25.7 with
x86_64 kernels. At least not without the skanky little
patch that I'm planning to post:
int magic = 0;
for (i = 0; i < maplen; i++) magic ^= mapbase[i];
Since I've tested that as a viable workaround!
Bron.
next prev parent reply other threads:[~2008-06-18 3:14 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-17 6:00 BUG: mmapfile/writev spurious zero bytes (x86_64/not i386, bisected, reproducable) Bron Gondwana
2008-06-17 6:02 ` Bron Gondwana
2008-06-17 17:08 ` Linus Torvalds
2008-06-17 17:45 ` Linus Torvalds
2008-06-17 20:16 ` Linus Torvalds
2008-06-17 20:41 ` Linus Torvalds
2008-06-17 21:06 ` Linus Torvalds
2008-06-17 21:16 ` Andi Kleen
2008-06-17 21:24 ` Linus Torvalds
2008-06-17 21:30 ` Andi Kleen
2008-06-17 21:37 ` Linus Torvalds
2008-06-17 21:36 ` Al Viro
2008-06-17 21:42 ` Andi Kleen
2008-06-17 21:49 ` Linus Torvalds
2008-06-17 22:11 ` Al Viro
2008-06-17 22:21 ` Andi Kleen
2008-06-18 6:22 ` Nick Piggin
2008-06-17 21:20 ` Linus Torvalds
2008-06-18 2:27 ` Bron Gondwana
2008-06-18 3:14 ` Bron Gondwana [this message]
2008-06-18 4:03 ` Linus Torvalds
2008-06-18 5:11 ` Cyrus mmap vs lseek/write usage - (WAS: BUG: mmapfile/writev spurious zero bytes (x86_64/not i386, bisected, reproducable)) Bron Gondwana
2008-06-18 16:22 ` Linus Torvalds
2008-06-18 23:45 ` Robert Mueller
2008-06-19 0:20 ` Linus Torvalds
2008-10-03 11:44 ` BUG: mmapfile/writev spurious zero bytes still in the wild Bron Gondwana
2008-10-03 13:07 ` Andrew Morton
2008-10-04 0:13 ` Bron Gondwana
2008-06-17 21:15 ` BUG: mmapfile/writev spurious zero bytes (x86_64/not i386, bisected, reproducable) Andi Kleen
2008-06-17 20:58 ` Andi Kleen
2008-06-17 21:14 ` Linus Torvalds
2008-06-17 21:26 ` Andi Kleen
2008-06-17 21:31 ` Linus Torvalds
2008-06-17 21:34 ` Linus Torvalds
2008-06-17 21:34 ` Andi Kleen
2008-06-17 21:46 ` Linus Torvalds
2008-06-18 6:10 ` Nick Piggin
2008-06-18 2:21 ` Bron Gondwana
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=20080618031406.GA4326@brong.net \
--to=brong@fastmail.fm \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=robm@fastmail.fm \
--cc=torvalds@linux-foundation.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