vfs: decrapify dput(), fix cache behavior under normal load

We do not want to dirty the dentry->d_flags cacheline in dput() just to
set the DCACHE_REFERENCED flag when it is already set in the common case
anyway.  This way the first cacheline of the dentry (which contains the
RCU lookup information etc) can stay shared among multiple CPU's.

This finishes off some of the details of all the scalability patches
merged during the merge window.

Also don't mark dentry_kill() for inlining, since it's the uncommon path
and inlining it just makes the common path slower due to extra function
entry/exit overhead.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2013-10-31 15:43:02 -07:00
parent 0baab4fd6d
commit 358eec1824

View file

@ -542,7 +542,7 @@ EXPORT_SYMBOL(d_drop);
* If ref is non-zero, then decrement the refcount too. * If ref is non-zero, then decrement the refcount too.
* Returns dentry requiring refcount drop, or NULL if we're done. * Returns dentry requiring refcount drop, or NULL if we're done.
*/ */
static inline struct dentry * static struct dentry *
dentry_kill(struct dentry *dentry, int unlock_on_failure) dentry_kill(struct dentry *dentry, int unlock_on_failure)
__releases(dentry->d_lock) __releases(dentry->d_lock)
{ {
@ -630,7 +630,8 @@ void dput(struct dentry *dentry)
goto kill_it; goto kill_it;
} }
dentry->d_flags |= DCACHE_REFERENCED; if (!(dentry->d_flags & DCACHE_REFERENCED))
dentry->d_flags |= DCACHE_REFERENCED;
dentry_lru_add(dentry); dentry_lru_add(dentry);
dentry->d_lockref.count--; dentry->d_lockref.count--;