lkml.org 
[lkml]   [2013]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v7 1/4] spinlock: A new lockref structure for lockless update of refcount
    From
    On Sun, Sep 8, 2013 at 5:03 PM, Al Viro <viro@zeniv.linux.org.uk> wrote:
    >
    > Well... unlazy_walk() is always followed by terminate_walk() very shortly,
    > but there's a minor problem - terminate_walk() uses "are we in RCU
    > mode?" for two things:
    > a) do we need to do path_put() here?
    > b) do we need to unlock?
    > If you introduce the third case ("no need to do unlock and no need to
    > do path_put()"), we'd better decide how to check for that case...

    Actually, I decided to take advantage of those two cases instead, and
    I have a patch that I think does the right thing. Basically, I start
    off unlazy_walk() with just doing that lockref_get_not_dead() on the
    parent dentry, and if that fails I just return an error in RCU mode
    (so terminate_walk() does what it always used to do, and we haven't
    done anything else to any refcounts).

    Now, if the lockref_get_not_dead() succeeded, that means that we have
    a reference on the nd->path.dentry, and we can now just do
    "mntget(nd->path.mnt);". Ta-Daa! We now have everything done for the
    non-RCU case for terminate_walk().

    So after that point, we clear LOOKUP_RCU, and make the rule be that
    any return (error or success) has to do unlock_rcu_walk(). And then
    all the other refcounts are easy, we can just "dput(dentry);" after
    that.

    I haven't tested it yet, I was going to reboot into it just now. But
    I'm attaching the patch here. Maybe I missed some detail, but it all
    seems simpler.

    Note that this patch requires the "lockref_get_not_dead()" cleanup at
    the top of my current -git.

    Linus
    [unhandled content-type:application/octet-stream]
    \
     
     \ /
      Last update: 2013-09-09 02:41    [W:2.591 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site