linux-fsdevel.vger.kernel.org archive mirror
 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: Tue, 27 May 2014 05:00:26 +0100	[thread overview]
Message-ID: <20140527040026.GT18016@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20140527031415.GS18016@ZenIV.linux.org.uk>

On Tue, May 27, 2014 at 04:14:15AM +0100, Al Viro wrote:

> As the matter of fact, let's try this instead - retry the same sucker
> immediately in case if trylocks fail.  Comments?

Better yet, let's take "move back to shrink list" into dentry_kill()
itself.  Then we get consistent locking rules for dentry_kill() and
instead of unlock_on_failure we simply pass it NULL or the shrink
list to put the sucker back.  Mika, could you test this one and see
if it fixes that livelock?  The difference in behaviour is that in
case of trylock failure we hit that sucker again without letting
it ride all the way around the list, same as we do for other dentry_kill()
callers.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
diff --git a/fs/dcache.c b/fs/dcache.c
index 42ae01e..77c95e5 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -448,7 +448,7 @@ EXPORT_SYMBOL(d_drop);
  * Returns dentry requiring refcount drop, or NULL if we're done.
  */
 static struct dentry *
-dentry_kill(struct dentry *dentry, int unlock_on_failure)
+dentry_kill(struct dentry *dentry, struct list_head *shrink_list)
 	__releases(dentry->d_lock)
 {
 	struct inode *inode;
@@ -464,10 +464,10 @@ dentry_kill(struct dentry *dentry, int unlock_on_failure)
 	inode = dentry->d_inode;
 	if (inode && !spin_trylock(&inode->i_lock)) {
 relock:
-		if (unlock_on_failure) {
-			spin_unlock(&dentry->d_lock);
-			cpu_relax();
-		}
+		if (shrink_list)
+			d_shrink_add(dentry, shrink_list);
+		spin_unlock(&dentry->d_lock);
+		cpu_relax();
 		return dentry; /* try again with same dentry */
 	}
 	if (!IS_ROOT(dentry))
@@ -579,7 +579,7 @@ repeat:
 	return;
 
 kill_it:
-	dentry = dentry_kill(dentry, 1);
+	dentry = dentry_kill(dentry, NULL);
 	if (dentry)
 		goto repeat;
 }
@@ -798,6 +798,7 @@ static void shrink_dentry_list(struct list_head *list)
 
 	while (!list_empty(list)) {
 		dentry = list_entry(list->prev, struct dentry, d_lru);
+again:
 		spin_lock(&dentry->d_lock);
 		/*
 		 * The dispose list is isolated and dentries are not accounted
@@ -815,23 +816,16 @@ static void shrink_dentry_list(struct list_head *list)
 			continue;
 		}
 
-		parent = dentry_kill(dentry, 0);
+		parent = dentry_kill(dentry, list);
 		/*
 		 * If dentry_kill returns NULL, we have nothing more to do.
 		 */
 		if (!parent)
 			continue;
 
-		if (unlikely(parent == dentry)) {
-			/*
-			 * trylocks have failed and d_lock has been held the
-			 * whole time, so it could not have been added to any
-			 * other lists. Just add it back to the shrink list.
-			 */
-			d_shrink_add(dentry, list);
-			spin_unlock(&dentry->d_lock);
-			continue;
-		}
+		 /* if trylocks have failed; just do it again */
+		if (unlikely(parent == dentry))
+			goto again;
 		/*
 		 * We need to prune ancestors too. This is necessary to prevent
 		 * quadratic behavior of shrink_dcache_parent(), but is also
@@ -840,7 +834,7 @@ static void shrink_dentry_list(struct list_head *list)
 		 */
 		dentry = parent;
 		while (dentry && !lockref_put_or_lock(&dentry->d_lockref))
-			dentry = dentry_kill(dentry, 1);
+			dentry = dentry_kill(dentry, NULL);
 	}
 }
 

  reply	other threads:[~2014-05-27  4:00 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20140526093741.GA1765@lahna.fi.intel.com>
2014-05-26 13:57 ` fs/dcache.c - BUG: soft lockup - CPU#5 stuck for 22s! [systemd-udevd:1667] Al Viro
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 [this message]
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 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

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=20140527040026.GT18016@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 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).