lkml.org 
[lkml]   [2014]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: fs/dcache.c - BUG: soft lockup - CPU#5 stuck for 22s! [systemd-udevd:1667]
From
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:

> dentry = list_entry(list->prev, struct dentry, d_lru);
> +
> + 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);
> + }
> + }

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?

Linus


\
 
 \ /
  Last update: 2014-05-29 09:41    [W:0.294 / U:0.012 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site