• NeilBrown's avatar
    SUNRPC: stop using ->sv_nrthreads as a refcount · ec52361d
    NeilBrown authored
    The use of sv_nrthreads as a general refcount results in clumsy code, as
    is seen by various comments needed to explain the situation.
    
    This patch introduces a 'struct kref' and uses that for reference
    counting, leaving sv_nrthreads to be a pure count of threads.  The kref
    is managed particularly in svc_get() and svc_put(), and also nfsd_put();
    
    svc_destroy() now takes a pointer to the embedded kref, rather than to
    the serv.
    
    nfsd allows the svc_serv to exist with ->sv_nrhtreads being zero.  This
    happens when a transport is created before the first thread is started.
    To support this, a 'keep_active' flag is introduced which holds a ref on
    the svc_serv.  This is set when any listening socket is successfully
    added (unless there are running threads), and cleared when the number of
    threads is set.  So when the last thread exits, the nfs_serv will be
    destroyed.
    The use of 'keep_active' replaces previous code which checked if there
    were any permanent sockets.
    
    We no longer clear ->rq_server when nfsd() exits.  This was done
    to prevent svc_exit_thread() from calling svc_destroy().
    Instead we take an extra reference to the svc_serv to prevent
    svc_destroy() from being called.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    ec52361d
nfssvc.c 27.1 KB