All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Miklos Szeredi <mszeredi@suse.cz>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>
Subject: Re: fs/dcache.c - BUG: soft lockup - CPU#5 stuck for 22s! [systemd-udevd:1667]
Date: Thu, 29 May 2014 06:26:21 +0100	[thread overview]
Message-ID: <20140529052621.GH18016@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20140529051647.GG18016@ZenIV.linux.org.uk>

On Thu, May 29, 2014 at 06:16:47AM +0100, Al Viro wrote:
> On Wed, May 28, 2014 at 09:21:00PM -0700, Linus Torvalds wrote:
> > On Wed, May 28, 2014 at 8:11 PM, Al Viro <viro@zeniv.linux.org.uk> wrote:
> > >
> > > Here's an updated patch, hopefully slightly less vomit-inducing.
> > 
> > Hmm. Less vomit-inducing, except for this part:
> 
> > Ugh, that just *screams* for a helper function. Something like
> > 
> >         parent = get_parent_and_lock(dentry);
> > 
> > or whatever, with that trylock/renamelock dance separated out. The
> > rule would be that it would lock the "dentry", and return the
> > (similarly locked) parent. Or NULL for a root dentry, of course.
> > 
> > Please?
> 
> Already done in my current tree; see below for the next commit in there...
> I can separate that helper from the rest (dealing with the same livelock
> for dentry_kill(dentry, 1) caller in shrink_dentry_list()).  All of that
> is very much subject to reordering, resplitting, writing more decent commit
> messages, etc.

Except that it's from the wrong branch ;-/  Correct one follows:

commit fb860957449c07c6f1a1dd911e83a635b6f11f21
Author: Al Viro <viro@zeniv.linux.org.uk>
Date:   Thu May 29 00:37:49 2014 -0400

    deal with "put the parent" side of shrink_dentry_list()

diff --git a/fs/dcache.c b/fs/dcache.c
index 6c2a92e..628a791 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -793,30 +793,34 @@ restart:
 }
 EXPORT_SYMBOL(d_prune_aliases);
 
-static void shrink_dentry_list(struct list_head *list)
+static inline struct dentry *lock_parent(struct dentry *dentry)
 {
-	struct dentry *dentry, *parent;
+	struct dentry *parent = dentry->d_parent;
+	if (IS_ROOT(dentry))
+		return NULL;
+	if (unlikely(!spin_trylock(&parent->d_lock))) {
+		spin_unlock(&dentry->d_lock);
+		read_seqlock_excl(&rename_lock);
+		parent = NULL;
+		if (!IS_ROOT(dentry)) {
+			parent = dentry->d_parent;
+			spin_lock(&parent->d_lock);
+		}
+		read_sequnlock_excl(&rename_lock);
+		spin_lock(&dentry->d_lock);
+	}
+	return parent;
+}
 
+static void shrink_dentry_list(struct list_head *list)
+{
 	while (!list_empty(list)) {
 		struct inode *inode;
-		dentry = list_entry(list->prev, struct dentry, d_lru);
+		struct dentry *dentry = list_entry(list->prev, struct dentry, d_lru);
+		struct dentry *parent;
 
-		parent = NULL;
 		spin_lock(&dentry->d_lock);
-		if (!IS_ROOT(dentry)) {
-			parent = dentry->d_parent;
-			if (unlikely(!spin_trylock(&parent->d_lock))) {
-				spin_unlock(&dentry->d_lock);
-				parent = NULL;
-				read_seqlock_excl(&rename_lock);
-				if (!IS_ROOT(dentry)) {
-					parent = dentry->d_parent;
-					spin_lock(&parent->d_lock);
-				}
-				read_sequnlock_excl(&rename_lock);
-				spin_lock(&dentry->d_lock);
-			}
-		}
+		parent = lock_parent(dentry);
 
 		/*
 		 * The dispose list is isolated and dentries are not accounted
@@ -864,8 +868,26 @@ static void shrink_dentry_list(struct list_head *list)
 		 * fragmentation.
 		 */
 		dentry = parent;
-		while (dentry && !lockref_put_or_lock(&dentry->d_lockref))
-			dentry = dentry_kill(dentry);
+		while (dentry && !lockref_put_or_lock(&dentry->d_lockref)) {
+			parent = lock_parent(dentry);
+			if (dentry->d_lockref.count != 1) {
+				dentry->d_lockref.count--;
+				spin_unlock(&dentry->d_lock);
+				if (parent)
+					spin_unlock(&parent->d_lock);
+				break;
+			}
+			inode = dentry->d_inode;	/* can't be NULL */
+			if (unlikely(!spin_trylock(&inode->i_lock))) {
+				spin_unlock(&dentry->d_lock);
+				if (parent)
+					spin_unlock(&parent->d_lock);
+				cpu_relax();
+				continue;
+			}
+			__dentry_kill(dentry);
+			dentry = parent;
+		}
 	}
 }
 

      reply	other threads:[~2014-05-29  5:26 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-26  9:37 fs/dcache.c - BUG: soft lockup - CPU#5 stuck for 22s! [systemd-udevd:1667] Mika Westerberg
2014-05-26 13:57 ` Al Viro
2014-05-26 14:29   ` Mika Westerberg
2014-05-26 14:29     ` Mika Westerberg
2014-05-26 15:27     ` Al Viro
2014-05-26 16:42       ` Al Viro
2014-05-26 18:17       ` Linus Torvalds
2014-05-26 18:26         ` Al Viro
2014-05-26 20:24           ` Linus Torvalds
2014-05-27  1:40             ` Al Viro
2014-05-27  3:14               ` Al Viro
2014-05-27  4:00                 ` Al Viro
2014-05-27  7:04                   ` Mika Westerberg
2014-05-27  7:04                     ` Mika Westerberg
2014-05-28  3:19                     ` Al Viro
2014-05-28  7:37                       ` Mika Westerberg
2014-05-28 11:57                         ` Al Viro
2014-05-28 13:11                           ` Mika Westerberg
2014-05-28 14:19                             ` Al Viro
2014-05-28 18:39                               ` Al Viro
2014-05-28 19:43                                 ` Linus Torvalds
2014-05-28 20:02                                   ` Linus Torvalds
2014-05-28 20:25                                     ` Al Viro
2014-05-29 10:42                                     ` Mika Westerberg
2014-05-28 20:14                                   ` Al Viro
2014-05-28 21:11                                     ` Linus Torvalds
2014-05-28 21:28                                       ` Al Viro
2014-05-29  3:11                                 ` Al Viro
2014-05-29  3:52                                   ` Al Viro
2014-05-29  5:34                                     ` Al Viro
2014-05-29 10:51                                       ` Mika Westerberg
2014-05-29 10:51                                         ` Mika Westerberg
2014-05-29 11:04                                         ` Mika Westerberg
2014-05-29 13:30                                           ` Al Viro
2014-05-29 14:56                                             ` Mika Westerberg
2014-05-29 15:10                                             ` Linus Torvalds
2014-05-29 15:44                                               ` Al Viro
2014-05-29 16:23                                                 ` Al Viro
2014-05-29 16:29                                                   ` Linus Torvalds
2014-05-29 16:53                                                     ` Al Viro
2014-05-29 18:52                                                       ` Al Viro
2014-05-29 19:14                                                         ` Linus Torvalds
2014-05-30  4:50                                                           ` Al Viro
2014-05-30  5:00                                                             ` Linus Torvalds
2014-05-30  6:49                                                               ` Al Viro
2014-05-30  8:12                                                         ` Mika Westerberg
2014-05-30 15:21                                                           ` Al Viro
2014-05-30 15:31                                                             ` Linus Torvalds
2014-05-30 16:48                                                               ` [git pull] " Al Viro
2014-05-30 17:14                                                                 ` Al Viro
2014-05-31 14:18                                                                   ` Josh Boyer
2014-05-31 14:48                                                                     ` Linus Torvalds
2014-05-31 14:58                                                                       ` Josh Boyer
2014-05-31 16:12                                                                       ` Josh Boyer
2014-05-30 17:15                                                                 ` Sedat Dilek
2014-05-29  4:21                                   ` Linus Torvalds
2014-05-29  5:16                                     ` Al Viro
2014-05-29  5:26                                       ` Al Viro [this message]

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=20140529052621.GH18016@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=mszeredi@suse.cz \
    --cc=torvalds@linux-foundation.org \
    /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.