Patch "dcache: don't need rcu in shrink_dentry_list()" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dcache: don't need rcu in shrink_dentry_list()
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dcache-don-t-need-rcu-in-shrink_dentry_list.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
60942f2f235ce7b817166cdf355eed729094834dMon Sep 17 00:00:00 2001
From: Miklos Szeredi <[email protected]>
Date: Fri, 2 May 2014 15:38:39 -0400
Subject: dcache: don't need rcu in shrink_dentry_list()
From: Miklos Szeredi <[email protected]>
commit 60942f2f235ce7b817166cdf355eed729094834d upstream.
Since now the shrink list is private and nobody can free the dentry while it is on the shrink list, we can remove RCU protection from this.
--- fs/dcache.c | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-)
fs/dcache.c +4 -23
@@ -797,23 +797,9 @@ static void shrink_dentry_list(struct li {struct dentry *dentry, *parent; -rcu_read_lock (); -for (;;) { - dentry = list_entry_rcu(list->prev, struct dentry, d_lru); -if (&dentry->d_lru == list) -break ;/* empty */ - -/* -* Get the dentry lock, and re-verify that the dentry is -* this on the shrinking list. If it is, we know that -* DCACHE_SHRINK_LIST and DCACHE_LRU_LIST are set. -*/ +while (!list_empty (list)) { + dentry = list_entry(list->prev, struct dentry, d_lru);spin_lock (&dentry->d_lock); - if (dentry != list_entry(list->prev, struct dentry, d_lru)) { -spin_unlock (&dentry->d_lock); -continue ; - } -/* * The dispose list is isolated and dentries are not accounted * to the LRU here, so we can simply remove it from the list
@@ -829,23 +815,20 @@ static void shrink_dentry_list(struct lispin_unlock (&dentry->d_lock);continue ; } -rcu_read_unlock (); parent =dentry_kill (dentry,0 );/* * If dentry_kill returns NULL, we have nothing more to do. */ -if (!parent) { -rcu_read_lock (); +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. */ -rcu_read_lock ();d_shrink_add (dentry, list);spin_unlock (&dentry->d_lock);continue ;
@@ -859,9 +842,7 @@ static void shrink_dentry_list(struct li dentry = parent;while (dentry && !lockref_put_or_lock (&dentry->d_lockref)) dentry =dentry_kill (dentry,1 ); -rcu_read_lock (); } -rcu_read_unlock (); } static enum lru_status
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/dcache-don-t-need-rcu-in-shrink_dentry_list.patch