All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Alexander Beregalov <a.beregalov@gmail.com>,
	lachlan@sgi.com, Christoph Hellwig <hch@infradead.org>,
	Arjan van de Ven <arjan@infradead.org>,
	xfs@oss.sgi.com, linux-next@vger.kernel.or
Subject: Re: BUG: sleeping function called from invalid context at kernel/rwsem.c:131 XFS? (was: Re: linux-next: Tree for October 17)
Date: Wed, 22 Oct 2008 19:25:50 +1100	[thread overview]
Message-ID: <20081022082550.GM18495@disturbed> (raw)
In-Reply-To: <20081022075838.GK18495@disturbed>

On Wed, Oct 22, 2008 at 06:58:38PM +1100, Dave Chinner wrote:
> On Tue, Oct 21, 2008 at 03:42:16PM +0400, Alexander Beregalov wrote:
> > Bisected to:
> > dd509097cb0b76d3836385f80d6b2d6fd3b97757 is first bad commit
> > commit dd509097cb0b76d3836385f80d6b2d6fd3b97757
> > Author: Lachlan McIlroy <lachlan@sgi.com>
> > Date:   Mon Sep 29 14:56:40 2008 +1000
> > 
> >     [XFS] Unlock inode before calling xfs_idestroy()
> > 
> >     Lock debugging reported the ilock was being destroyed without being
> >     unlocked. We don't need to lock the inode until we are going to insert it
> >     into the radix tree.
> 
> Ah, OK, I see the problem, though I don't understand why I'm not
> seeing the might_sleep() triggering all the time given that I always
> build with:
> 
> $ grep SLEEP .config
> CONFIG_DEBUG_SPINLOCK_SLEEP=y
> 
> Basically the above commit moved xfs_ilock() inside
> radix_tree_preload()/radix_tree_preload_end(), which means we are
> taking a rwsem() while we have an elevated preempt count. I'll
> get a patch out to fix it.

Patch below (against the xfs master/linux-next branch) should fix the
regression. I've just started QA on it. Can you please check that
it works for you, Alexander?

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

XFS: Can't lock inodes in radix tree preload region

When we are inside a radix tree preload region, we cannot
sleep. Recently we moved the inode locking inside the
preload region for the inode radix tree. Fix that,
and fix a missed unlock in another error path in the
same code at the same time.

Signed-off-by: Dave Chinner <david@fromorbit.com>
---
 fs/xfs/xfs_iget.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
index fbc6088..837cae7 100644
--- a/fs/xfs/xfs_iget.c
+++ b/fs/xfs/xfs_iget.c
@@ -159,18 +159,19 @@ xfs_iget_cache_miss(
 		goto out_destroy;
 	}
 
+	if (lock_flags)
+		xfs_ilock(ip, lock_flags);
+
 	/*
 	 * Preload the radix tree so we can insert safely under the
-	 * write spinlock.
+	 * write spinlock. Note that we cannot sleep inside the preload
+	 * region.
 	 */
 	if (radix_tree_preload(GFP_KERNEL)) {
 		error = EAGAIN;
-		goto out_destroy;
+		goto out_unlock;
 	}
 
-	if (lock_flags)
-		xfs_ilock(ip, lock_flags);
-
 	mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
 	first_index = agino & mask;
 	write_lock(&pag->pag_ici_lock);
@@ -181,7 +182,7 @@ xfs_iget_cache_miss(
 		WARN_ON(error != -EEXIST);
 		XFS_STATS_INC(xs_ig_dup);
 		error = EAGAIN;
-		goto out_unlock;
+		goto out_preload_end;
 	}
 
 	/* These values _must_ be set before releasing the radix tree lock! */
@@ -193,9 +194,12 @@ xfs_iget_cache_miss(
 	*ipp = ip;
 	return 0;
 
-out_unlock:
+out_preload_end:
 	write_unlock(&pag->pag_ici_lock);
 	radix_tree_preload_end();
+out_unlock:
+	if (lock_flags)
+		xfs_iunlock(ip, lock_flags);
 out_destroy:
 	xfs_destroy_inode(ip);
 	return error;

WARNING: multiple messages have this Message-ID (diff)
From: Dave Chinner <david@fromorbit.com>
To: Alexander Beregalov <a.beregalov@gmail.com>,
	lachlan@sgi.com, Christoph Hellwig <hch@infradead.org>,
	Arjan van de Ven <arjan@infradead.org>,
	xfs@oss.sgi.com, linux-next@vger.kernel.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: BUG: sleeping function called from invalid context at kernel/rwsem.c:131 XFS? (was: Re: linux-next: Tree for October 17)
Date: Wed, 22 Oct 2008 19:25:50 +1100	[thread overview]
Message-ID: <20081022082550.GM18495@disturbed> (raw)
In-Reply-To: <20081022075838.GK18495@disturbed>

On Wed, Oct 22, 2008 at 06:58:38PM +1100, Dave Chinner wrote:
> On Tue, Oct 21, 2008 at 03:42:16PM +0400, Alexander Beregalov wrote:
> > Bisected to:
> > dd509097cb0b76d3836385f80d6b2d6fd3b97757 is first bad commit
> > commit dd509097cb0b76d3836385f80d6b2d6fd3b97757
> > Author: Lachlan McIlroy <lachlan@sgi.com>
> > Date:   Mon Sep 29 14:56:40 2008 +1000
> > 
> >     [XFS] Unlock inode before calling xfs_idestroy()
> > 
> >     Lock debugging reported the ilock was being destroyed without being
> >     unlocked. We don't need to lock the inode until we are going to insert it
> >     into the radix tree.
> 
> Ah, OK, I see the problem, though I don't understand why I'm not
> seeing the might_sleep() triggering all the time given that I always
> build with:
> 
> $ grep SLEEP .config
> CONFIG_DEBUG_SPINLOCK_SLEEP=y
> 
> Basically the above commit moved xfs_ilock() inside
> radix_tree_preload()/radix_tree_preload_end(), which means we are
> taking a rwsem() while we have an elevated preempt count. I'll
> get a patch out to fix it.

Patch below (against the xfs master/linux-next branch) should fix the
regression. I've just started QA on it. Can you please check that
it works for you, Alexander?

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

XFS: Can't lock inodes in radix tree preload region

When we are inside a radix tree preload region, we cannot
sleep. Recently we moved the inode locking inside the
preload region for the inode radix tree. Fix that,
and fix a missed unlock in another error path in the
same code at the same time.

Signed-off-by: Dave Chinner <david@fromorbit.com>
---
 fs/xfs/xfs_iget.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
index fbc6088..837cae7 100644
--- a/fs/xfs/xfs_iget.c
+++ b/fs/xfs/xfs_iget.c
@@ -159,18 +159,19 @@ xfs_iget_cache_miss(
 		goto out_destroy;
 	}
 
+	if (lock_flags)
+		xfs_ilock(ip, lock_flags);
+
 	/*
 	 * Preload the radix tree so we can insert safely under the
-	 * write spinlock.
+	 * write spinlock. Note that we cannot sleep inside the preload
+	 * region.
 	 */
 	if (radix_tree_preload(GFP_KERNEL)) {
 		error = EAGAIN;
-		goto out_destroy;
+		goto out_unlock;
 	}
 
-	if (lock_flags)
-		xfs_ilock(ip, lock_flags);
-
 	mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
 	first_index = agino & mask;
 	write_lock(&pag->pag_ici_lock);
@@ -181,7 +182,7 @@ xfs_iget_cache_miss(
 		WARN_ON(error != -EEXIST);
 		XFS_STATS_INC(xs_ig_dup);
 		error = EAGAIN;
-		goto out_unlock;
+		goto out_preload_end;
 	}
 
 	/* These values _must_ be set before releasing the radix tree lock! */
@@ -193,9 +194,12 @@ xfs_iget_cache_miss(
 	*ipp = ip;
 	return 0;
 
-out_unlock:
+out_preload_end:
 	write_unlock(&pag->pag_ici_lock);
 	radix_tree_preload_end();
+out_unlock:
+	if (lock_flags)
+		xfs_iunlock(ip, lock_flags);
 out_destroy:
 	xfs_destroy_inode(ip);
 	return error;

  parent reply	other threads:[~2008-10-22  8:25 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-17 12:43 BUG: sleeping function called from invalid context at kernel/rwsem.c:131 XFS? (was: Re: linux-next: Tree for October 17) Alexander Beregalov
2008-10-17 16:41 ` Christoph Hellwig
2008-10-17 16:54   ` Alexander Beregalov
2008-10-17 16:57     ` Christoph Hellwig
2008-10-17 17:13       ` Alexander Beregalov
2008-10-17 20:37         ` Christoph Hellwig
2008-10-17 20:55           ` Arjan van de Ven
2008-10-17 20:55             ` Arjan van de Ven
2008-10-17 20:55             ` Arjan van de Ven
2008-10-20 14:58             ` Alexander Beregalov
2008-10-20 16:33               ` Christoph Hellwig
2008-10-20 17:13                 ` Alexander Beregalov
2008-10-20 22:35                   ` Dave Chinner
2008-10-21 11:42                     ` Alexander Beregalov
2008-10-21 11:42                       ` Alexander Beregalov
2008-10-22  7:58                       ` Dave Chinner
2008-10-22  8:21                         ` Alexander Beregalov
2008-10-22  8:21                           ` Alexander Beregalov
2008-10-22  8:28                           ` Dave Chinner
2008-10-22  8:25                         ` Dave Chinner [this message]
2008-10-22  8:25                           ` Dave Chinner
2008-10-22  9:12                           ` Alexander Beregalov
2008-10-22  9:12                             ` Alexander Beregalov
2008-10-22 10:13                           ` Christoph Hellwig
2008-10-22 10:13                             ` Christoph Hellwig
2008-10-22 21:10                             ` Dave Chinner
2008-10-22 15:06                           ` BUG: sleeping function called from invalid context at kernel/rwsem.c:131 XFS? Johannes Weiner

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=20081022082550.GM18495@disturbed \
    --to=david@fromorbit.com \
    --cc=a.beregalov@gmail.com \
    --cc=arjan@infradead.org \
    --cc=hch@infradead.org \
    --cc=lachlan@sgi.com \
    --cc=linux-next@vger.kernel.or \
    --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 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.