From: Chris Mason <chris.mason@fusionio.com>
To: Miao Xie <miaox@cn.fujitsu.com>
Cc: Linux Btrfs <linux-btrfs@vger.kernel.org>,
Josef Bacik <JBacik@fusionio.com>
Subject: Re: [RFC][PATCH] Btrfs: fix deadlock due to unsubmitted
Date: Thu, 7 Feb 2013 08:31:13 -0500 [thread overview]
Message-ID: <20130207133113.GC21679@shiny> (raw)
In-Reply-To: <51137DF7.7050006@cn.fujitsu.com>
On Thu, Feb 07, 2013 at 03:12:07AM -0700, Miao Xie wrote:
> The deadlock problem happened when running fsstress(a test program in LTP).
>
> Steps to reproduce:
> # mkfs.btrfs -b 100M <partition>
> # mount <partition> <mnt>
> # <Path>/fsstress -p 3 -n 10000000 -d <mnt>
>
> The reason is:
> btrfs_direct_IO()
> |->do_direct_IO()
> |->get_page()
> |->get_blocks()
> | |->btrfs_delalloc_resereve_space()
> | |->btrfs_add_ordered_extent() ------- Add a new ordered extent
> |->dio_send_cur_page(page0) -------------- We didn't submit bio here
> |->get_page()
> |->get_blocks()
> |->btrfs_delalloc_resereve_space()
> |->flush_space()
> |->btrfs_start_ordered_extent()
> |->wait_event() ---------- Wait the completion of
> the ordered extent that is
> mentioned above
>
> But because we didn't submit the bio that is mentioned above, the ordered
> extent can not complete, we would wait for its completion forever.
>
> There are two methods which can fix this deadlock problem:
> 1. submit the bio before we invoke get_blocks()
> 2. reserve the space before we do dio
>
> Though the 1st is the simplest way, we need modify the code of VFS, and it
> is likely to break contiguous requests, and introduce performance regression
> for the other filesystems.
>
> So we have to choose the 2nd way.
The 3rd option is to have get_blocks return -EAGAIN to the direct-io.c
code and let the higher levels submit the bios they have built.
Josef will probably go for option #4, which is dropping the generic code
completely and doing it all ourselves.
But I do like your approach, it makes sense here.
-chris
next prev parent reply other threads:[~2013-02-07 13:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-07 10:12 [RFC][PATCH] Btrfs: fix deadlock due to unsubmitted Miao Xie
2013-02-07 13:31 ` Chris Mason [this message]
2013-02-07 15:10 ` Josef Bacik
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=20130207133113.GC21679@shiny \
--to=chris.mason@fusionio.com \
--cc=JBacik@fusionio.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=miaox@cn.fujitsu.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;
as well as URLs for NNTP newsgroup(s).