From: Nick Piggin <nickpiggin@yahoo.com.au>
To: Andrew Morton <akpm@osdl.org>
Cc: andrea@suse.de, linux-kernel@vger.kernel.org, mason@suse.com
Subject: Re: [patch] fix the 2nd buffer race properly
Date: Thu, 28 Apr 2005 10:08:13 +1000 [thread overview]
Message-ID: <4270296D.9010109@yahoo.com.au> (raw)
In-Reply-To: <20050427105655.5edc13ce.akpm@osdl.org>
Andrew Morton wrote:
> Nick Piggin <nickpiggin@yahoo.com.au> wrote:
>
>>When running
>> fsstress -v -d $DIR/tmp -n 1000 -p 1000 -l 2
>> on an ext2 filesystem with 1024 byte block size, on SMP i386 with 4096 byte
>> page size over loopback to an image file on a tmpfs filesystem, I would
>> very quickly hit
>> BUG_ON(!buffer_async_write(bh));
>> in fs/buffer.c:end_buffer_async_write
>>
>> It seems that more than one request would be submitted for a given bh
>> at a time.
>>
>> What would happen is the following:
>> 2 threads doing __mpage_writepages on the same page.
>> Thread 1 - lock the page first, and enter __block_write_full_page.
>> Thread 1 - (eg.) mark_buffer_async_write on the first 2 buffers.
>> Thread 1 - set page writeback, unlock page.
>> Thread 2 - lock page, wait on page writeback
>> Thread 1 - submit_bh on the first 2 buffers.
>> => both requests complete, none of the page buffers are async_write,
>> end_page_writeback is called.
>> Thread 2 - wakes up. enters __block_write_full_page.
>> Thread 2 - mark_buffer_async_write on (eg.) the last buffer
>> Thread 1 - finds the last buffer has async_write set, submit_bh on that.
>> Thread 2 - submit_bh on the last buffer.
>> => oops.
>
>
> ah-hah. Thanks.
>
> There are two situations:
>
> a) Thread 2 comes in and tries to write a buffer which thread1 didn't write:
>
> Yes, thread 1 will get confused and will try to write thread 2's buffer.
>
> b) Thread 2 comes in and tries to write a buffer which thread 1 is
> writing. (Say, the buffer was redirtied by
> munmap->__set_page_dirty_buffers, which doesn't lock the page or the
> buffers)
>
I don't think b) happens, because thread 1 has to have finished all
its writes before the page will end writeback and thread 2 can go
anywhere.
> Thread 2 will fail the test_set_buffer_locked() and will redirty the page.
>
> That's all a bit too complex. How's about this instead?
>
Well you really don't need to hold the page locked for that long.
block_read_full_page, nobh_prepare_write both use the same sort of
array of buffer heads logic - I think it makes sense not to touch
any buffers after submitting them all for IO...?
--
SUSE Labs, Novell Inc.
next prev parent reply other threads:[~2005-04-28 0:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-27 13:15 [patch] fix the 2nd buffer race properly Nick Piggin
2005-04-27 13:20 ` Nick Piggin
2005-04-27 17:56 ` Andrew Morton
2005-04-28 0:08 ` Nick Piggin [this message]
2005-04-28 1:00 ` Andrew Morton
2005-04-28 1:29 ` Nick Piggin
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=4270296D.9010109@yahoo.com.au \
--to=nickpiggin@yahoo.com.au \
--cc=akpm@osdl.org \
--cc=andrea@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mason@suse.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.