lkml.org 
[lkml]   [2010]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 25/28] fs: dcache reduce prune_one_dentry locking
    prune_one_dentry can avoid quite a bit of locking in the common case where
    ancestors have an elevated refcount. Alternatively, we could have gone the
    other way and made fewer trylocks in the case where d_count goes to zero, but
    is probably less common.

    Signed-off-by: Nick Piggin <npiggin@kernel.dk>

    ---
    fs/dcache.c | 27 +++++++++++++++------------
    1 file changed, 15 insertions(+), 12 deletions(-)

    Index: linux-2.6/fs/dcache.c
    ===================================================================
    --- linux-2.6.orig/fs/dcache.c 2010-11-17 00:52:38.000000000 +1100
    +++ linux-2.6/fs/dcache.c 2010-11-17 01:05:38.000000000 +1100
    @@ -547,26 +547,29 @@ static void prune_one_dentry(struct dent
    * Prune ancestors.
    */
    while (dentry) {
    - spin_lock(&dcache_inode_lock);
    -again:
    +relock:
    spin_lock(&dentry->d_lock);
    + if (dentry->d_count > 1) {
    + dentry->d_count--;
    + spin_unlock(&dentry->d_lock);
    + return;
    + }
    + if (!spin_trylock(&dcache_inode_lock)) {
    +relock2:
    + spin_unlock(&dentry->d_lock);
    + cpu_relax();
    + goto relock;
    + }
    +
    if (IS_ROOT(dentry))
    parent = NULL;
    else
    parent = dentry->d_parent;
    if (parent && !spin_trylock(&parent->d_lock)) {
    - spin_unlock(&dentry->d_lock);
    - goto again;
    - }
    - dentry->d_count--;
    - if (dentry->d_count) {
    - if (parent)
    - spin_unlock(&parent->d_lock);
    - spin_unlock(&dentry->d_lock);
    spin_unlock(&dcache_inode_lock);
    - return;
    + goto relock2;
    }
    -
    + dentry->d_count--;
    dentry_lru_del(dentry);
    __d_drop(dentry);
    dentry = d_kill(dentry, parent);



    \
     
     \ /
      Last update: 2010-11-16 15:31    [W:5.016 / U:0.908 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site