lkml.org 
[lkml]   [2008]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 6/6] NLM: Add reference counting to lockd
    On Tuesday January 8, jlayton@redhat.com wrote:
    > ...and only have lockd exit when the last reference is dropped.
    >
    > The problem is this:
    >
    > When a lock that a client is blocking on comes free, lockd does this in
    > nlmsvc_grant_blocked():
    >
    > nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops);
    >
    > the callback from this call is nlmsvc_grant_callback(). That function
    > does this at the end to wake up lockd:
    >
    > svc_wake_up(block->b_daemon);

    Uhmmm... Maybe there is an easier way.

    block->b_daemon will always be nlmsvc_serv, so can we simply make this

    svc_wake_up(nlmsvc_serv);
    with a little locking to make sure nlmsvc_serv is valid?

    Actually svc_wake_up is only called from lockd and goes through
    various hoops to find the right rqstp, which we could have known in
    advance.
    So store the rqstp in some global wrapped in a spinlock so we can
    access it safely and just:

    spin_lock(whatever)
    if (nlmsvc_rqstp)
    wake_up(&nlmsvc_rqstp->rq_wait)
    spin_unlock(whatever)


    That seems a somewhat simpler way of avoiding the particular problem.


    Hmmm.... I guess that nlmsvc_grant_callback could then be run after
    the 'lockd' module had been unloaded.
    Maybe nlm_shutdown_hosts could call rpc_killall_tasks(host->h_rpcclnt)
    on each host. That should ensure the callback wont happen afterwards.

    Maybe?

    NeilBrown



    \
     
     \ /
      Last update: 2008-01-10 04:31    [W:3.675 / U:0.532 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site