public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: XFS Mailing List <xfs@oss.sgi.com>
Subject: Re: [PATCH 5/5] xfs: fix memory reclaim recursion deadlock on locked inode buffer
Date: Thu, 15 Jul 2010 13:42:13 -0500	[thread overview]
Message-ID: <1279219333.2054.64.camel@doink> (raw)
In-Reply-To: <1279154300-2018-6-git-send-email-david@fromorbit.com>

On Thu, 2010-07-15 at 10:38 +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> Calling into memory reclaim with a locked inode buffer can deadlock
> if memory reclaim tries to lock the inode buffer during inode
> teardown. Convert the relevant memory allocations to use KM_NOFS to
> avoid this deadlock condition.

Looks good.  I wasn't able to find the paths that
led to xfs_iroot_realloc() and xfs_idata_realloc()
but I'm sure they're there...

Reviewed-by: Alex Elder <aelder@sgi.com>

> Reported-by: Peter Watkins <treestem@gmail.com>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
>  fs/xfs/xfs_inode.c |   20 +++++++++++---------
>  1 files changed, 11 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 5715a9d..3c206b3 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -422,7 +422,7 @@ xfs_iformat(
>  	if (!XFS_DFORK_Q(dip))
>  		return 0;
>  	ASSERT(ip->i_afp == NULL);
> -	ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP);
> +	ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP|KM_NOFS);
>  	ip->i_afp->if_ext_max =
>  		XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
>  	switch (dip->di_aformat) {
> @@ -505,7 +505,7 @@ xfs_iformat_local(
>  		ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
>  	else {
>  		real_size = roundup(size, 4);
> -		ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
> +		ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP|KM_NOFS);
>  	}
>  	ifp->if_bytes = size;
>  	ifp->if_real_bytes = real_size;
> @@ -632,7 +632,7 @@ xfs_iformat_btree(
>  	}
>  
>  	ifp->if_broot_bytes = size;
> -	ifp->if_broot = kmem_alloc(size, KM_SLEEP);
> +	ifp->if_broot = kmem_alloc(size, KM_SLEEP|KM_NOFS);
>  	ASSERT(ifp->if_broot != NULL);
>  	/*
>  	 * Copy and convert from the on-disk structure
> @@ -2191,7 +2191,7 @@ xfs_iroot_realloc(
>  		 */
>  		if (ifp->if_broot_bytes == 0) {
>  			new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff);
> -			ifp->if_broot = kmem_alloc(new_size, KM_SLEEP);
> +			ifp->if_broot = kmem_alloc(new_size, KM_SLEEP|KM_NOFS);
>  			ifp->if_broot_bytes = (int)new_size;
>  			return;
>  		}
> @@ -2207,7 +2207,7 @@ xfs_iroot_realloc(
>  		new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
>  		ifp->if_broot = kmem_realloc(ifp->if_broot, new_size,
>  				(size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */
> -				KM_SLEEP);
> +				KM_SLEEP|KM_NOFS);
>  		op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
>  						     ifp->if_broot_bytes);
>  		np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
> @@ -2233,7 +2233,7 @@ xfs_iroot_realloc(
>  	else
>  		new_size = 0;
>  	if (new_size > 0) {
> -		new_broot = kmem_alloc(new_size, KM_SLEEP);
> +		new_broot = kmem_alloc(new_size, KM_SLEEP|KM_NOFS);
>  		/*
>  		 * First copy over the btree block header.
>  		 */
> @@ -2337,7 +2337,8 @@ xfs_idata_realloc(
>  		real_size = roundup(new_size, 4);
>  		if (ifp->if_u1.if_data == NULL) {
>  			ASSERT(ifp->if_real_bytes == 0);
> -			ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
> +			ifp->if_u1.if_data = kmem_alloc(real_size,
> +							KM_SLEEP|KM_NOFS);
>  		} else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
>  			/*
>  			 * Only do the realloc if the underlying size
> @@ -2348,11 +2349,12 @@ xfs_idata_realloc(
>  					kmem_realloc(ifp->if_u1.if_data,
>  							real_size,
>  							ifp->if_real_bytes,
> -							KM_SLEEP);
> +							KM_SLEEP|KM_NOFS);
>  			}
>  		} else {
>  			ASSERT(ifp->if_real_bytes == 0);
> -			ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP);
> +			ifp->if_u1.if_data = kmem_alloc(real_size,
> +							KM_SLEEP|KM_NOFS);
>  			memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data,
>  				ifp->if_bytes);
>  		}



_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2010-07-15 18:39 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-15  0:38 [PATCH 0/5] xfs: reclaim bug fixes Dave Chinner
2010-07-15  0:38 ` [PATCH 1/5] xfs: track AGs with reclaimable inodes in per-ag radix tree Dave Chinner
2010-07-15 18:01   ` Alex Elder
2010-07-16  5:17     ` Christoph Hellwig
2010-07-19  0:17       ` Dave Chinner
2010-07-19  0:24     ` Dave Chinner
2010-07-15  0:38 ` [PATCH 2/5] xfs: simplify and remove xfs_ireclaim Dave Chinner
2010-07-15 18:07   ` Alex Elder
2010-07-16  5:16   ` Christoph Hellwig
2010-07-15  0:38 ` [PATCH 3/5] xfs: fix xfs_trans_add_item() lockdep warnings Dave Chinner
2010-07-15 18:09   ` Alex Elder
2010-07-16  5:19   ` Christoph Hellwig
2010-07-19  0:24     ` Dave Chinner
2010-07-15  0:38 ` [PATCH 4/5] xfs: use GFP_NOFS for page cache allocation Dave Chinner
2010-07-15 18:10   ` Alex Elder
2010-07-16  5:21   ` Christoph Hellwig
2010-07-15  0:38 ` [PATCH 5/5] xfs: fix memory reclaim recursion deadlock on locked inode buffer Dave Chinner
2010-07-15 18:42   ` Alex Elder [this message]
2010-07-16  5:22   ` Christoph Hellwig
2010-07-16  5:23 ` [PATCH 0/5] xfs: reclaim bug fixes Christoph Hellwig
2010-07-19  0:30   ` Dave Chinner

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=1279219333.2054.64.camel@doink \
    --to=aelder@sgi.com \
    --cc=david@fromorbit.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