From: Nathan Scott <nathans@sgi.com>
To: Stephane Doyon <sdoyon@max-t.com>
Cc: Christoph Hellwig <hch@infradead.org>, Suzuki <suzuki@in.ibm.com>,
linux-fsdevel@vger.kernel.org,
"linux-aio kvack.org" <linux-aio@kvack.org>,
lkml <linux-kernel@vger.kernel.org>, suparna <suparna@in.ibm.com>,
akpm@osdl.org, xfs@oss.sgi.com
Subject: Re: [RFC] Badness in __mutex_unlock_slowpath with XFS stress tests
Date: Tue, 11 Jul 2006 10:18:17 +1000 [thread overview]
Message-ID: <20060711101817.B1702118@wobbly.melbourne.sgi.com> (raw)
In-Reply-To: <Pine.LNX.4.64.0607101152040.3709@madrid.max-t.internal>; from sdoyon@max-t.com on Mon, Jul 10, 2006 at 12:46:23PM -0400
On Mon, Jul 10, 2006 at 12:46:23PM -0400, Stephane Doyon wrote:
> Hi,
Hi Stephane,
> A few months back, a fix was introduced for a mutex double unlock warning
> related to direct I/O in XFS. I believe that fix has a lock ordering
> problem that can cause a deadlock.
>
> The problem was that __blockdev_direct_IO() would unlock the i_mutex in
> the READ and DIO_OWN_LOCKING case, and the mutex would be unlocked again
> in xfs_read() soon after returning from __generic_file_aio_read(). Because
> there are lots of execution paths down from __generic_file_aio_read() that
> do not consistently release the i_mutex, the safest fix was deemed to be
> to reacquire the i_mutex before returning from __blockdev_direct_IO(). At
> this point however, the reader is holding an xfs ilock, and AFAICT the
> i_mutex is usually taken BEFORE the xfs ilock.
That is correct, yes. Hmm. Subtle. Painful. Thanks for the detailed
report and your analysis.
> We are seeing a deadlock between a process writing and another process
> reading the same file, when the reader is using direct I/O. (The writer
Is that a direct writer or a buffered writer?
> must apparently be growing the file, using either direct or buffered
> I/O.) Something like this, on XFS:
> (dd if=/dev/zero of=f bs=128K count=5000 & ) ; sleep 1 ; dd of=/dev/null
> if=f iflag=direct bs=128K count=5000
>
> Seen on kernels 2.6.16 and 2.6.17.
>
> The deadlock scenario appears to be this:
> -The reader goes into xfs_read(), takes the i_mutex and then an xfs_ilock
> XFS_IOLOCK_SHARED, then calls down to __generic_file_aio_read() which
> eventually goes down to __blockdev_direct_IO(). In there it drops the
> i_mutex.
> -The writer goes into xfs_write() and obtains the i_mutex. It then tries
> to get an xfs_ilock XFS_ILOCK_EXCL and must wait on it since it's held by
> the reader.
> -The reader, still in __blockdev_direct_IO(), executes directio_worker()
> and then tries to reacquire the i_mutex, and must wait on it because the
> writer has it.
>
> And so we have a deadlock.
*nod*. This will require some thought, I'm not sure I like the sound of
your suggested workaround there a whole lot, unfortunately, but maybe it
is all we can do at this stage. Let me ponder further and get back to you
(but if you want to prototype your fix further, that'd be most welcome, of
course).
cheers.
--
Nathan
next prev parent reply other threads:[~2006-07-11 0:19 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-09 7:54 Suzuki
2006-03-09 12:03 ` Christoph Hellwig
2006-03-09 22:30 ` Nathan Scott
2006-03-09 22:42 ` Christoph Hellwig
2006-03-09 23:14 ` Nathan Scott
2006-03-10 0:50 ` Nathan Scott
2006-03-10 15:49 ` Christoph Hellwig
2006-03-14 4:46 ` Suparna Bhattacharya
2006-03-17 17:22 ` Adrian Bunk
2006-03-18 3:34 ` Nathan Scott
2006-03-18 5:03 ` Adrian Bunk
2006-07-10 16:46 ` Stephane Doyon
2006-07-11 0:18 ` Nathan Scott [this message]
2006-07-11 13:40 ` Stephane Doyon
-- strict thread matches above, loose matches on Subject: below --
2006-03-09 7:17 Suzuki
2006-03-09 22:22 ` Nathan Scott
2006-03-10 6:06 ` Suzuki
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=20060711101817.B1702118@wobbly.melbourne.sgi.com \
--to=nathans@sgi.com \
--cc=akpm@osdl.org \
--cc=hch@infradead.org \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sdoyon@max-t.com \
--cc=suparna@in.ibm.com \
--cc=suzuki@in.ibm.com \
--cc=xfs@oss.sgi.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®