All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Mason <chris.mason@oracle.com>
To: Nick Piggin <npiggin@kernel.dk>
Cc: linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	linux-ext4 <linux-ext4@vger.kernel.org>,
	linux-btrfs <linux-btrfs@vger.kernel.org>,
	Jan Kara <jack@suse.cz>, Eric Sandeen <sandeen@redhat.com>,
	"Theodore Ts'o" <tytso@mit.edu>
Subject: Re: [patch] fs: fix deadlocks in writeback_if_idle
Date: Tue, 23 Nov 2010 07:34:07 -0500	[thread overview]
Message-ID: <1290515274-sup-3895@think> (raw)
In-Reply-To: <20101123100239.GA4232@amd>

Excerpts from Nick Piggin's message of 2010-11-23 05:02:39 -0500:

[ ... ]

> 
> Avoid both these issues by issuing completely asynchronous writeback request in
> writeback_inodes_sb_if_idle. Don't let that fool you into thinking these
> functions don't suck any more.
> 
> ext4 now passes extensive stress testing with xfstests, fs_mark, dbench,
> with a writeback_inodes_if_idle call added directly into ext4_da_write_begin
> to trigger the path frequently. Previously it would spew lockdep stuff and
> hang in a number of ways very quickly.
> 
> Signed-off-by: Nick Piggin <npiggin@kernel.dk>
> 
> ---
>  fs/fs-writeback.c |   32 ++++++++++++++++++++------------
>  1 file changed, 20 insertions(+), 12 deletions(-)
> 
> Index: linux-2.6/fs/fs-writeback.c
> ===================================================================
> --- linux-2.6.orig/fs/fs-writeback.c    2010-11-23 20:57:23.000000000 +1100
> +++ linux-2.6/fs/fs-writeback.c    2010-11-23 20:59:10.000000000 +1100
> @@ -1152,16 +1152,17 @@ EXPORT_SYMBOL(writeback_inodes_sb);
>   *
>   * Invoke writeback_inodes_sb if no writeback is currently underway.
>   * Returns 1 if writeback was started, 0 if not.
> + *
> + * Even if 1 is returned, writeback may not be started if memory allocation
> + * fails. This function makes no guarantees about anything.
>   */
>  int writeback_inodes_sb_if_idle(struct super_block *sb)
>  {
>      if (!writeback_in_progress(sb->s_bdi)) {
> -        down_read(&sb->s_umount);
> -        writeback_inodes_sb(sb);
> -        up_read(&sb->s_umount);
> +        bdi_start_writeback(sb->s_bdi, get_nr_dirty_pages());

I'll put on my skis and channel Christoph for a minute.  This isn't
quite the same as the original.  writeback_inodes_sb() writes inodes on a
specific super block, while bdi_start_writeback() writes them for any SB
on that bdi.

For btrfs there's only one bdi per SB, but for most everyone else a disk
with a bunch of partitions is going to have multiple filesystems on the
same bdi.

My original btrfs patch just exported the bdi_ funcs so that btrfs could
do the above internally.  But Christoph objected, and I think he's
right.  We should either give everyone a bdi or make sure the writeback
func kicks only one filesystem.

-chris

  parent reply	other threads:[~2010-11-23 12:34 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-23 10:02 [patch] fs: fix deadlocks in writeback_if_idle Nick Piggin
2010-11-23 10:11 ` Nick Piggin
2010-11-23 13:18   ` Jan Kara
2010-11-25  3:52     ` Nick Piggin
2010-11-23 10:26 ` Boaz Harrosh
2010-11-23 10:54   ` Nick Piggin
2010-11-23 12:00     ` Boaz Harrosh
2010-11-23 12:34 ` Chris Mason [this message]
2010-11-23 12:52   ` Nick Piggin
2010-11-23 18:58     ` Chris Mason
2010-11-24  1:03       ` Nick Piggin
2010-11-24 13:10         ` Jan Kara
2010-11-25  3:53           ` Nick Piggin
2010-11-29 22:26             ` Andrew Morton
2010-11-30  0:01               ` Nick Piggin
2010-12-16  3:12                 ` Nick Piggin
2010-11-24 22:51         ` Andrew Morton
2010-11-25  4:07           ` Nick Piggin
2010-11-24 22:47   ` Andrew Morton
2010-11-25  9:41     ` Boaz Harrosh
2010-11-25 20:30       ` Andrew Morton
2010-11-30  0:50     ` Chris Mason
2010-11-23 12:54 ` Dmitry
2010-11-23 12:54 ` Dmitry

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=1290515274-sup-3895@think \
    --to=chris.mason@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=jack@suse.cz \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=npiggin@kernel.dk \
    --cc=sandeen@redhat.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /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.