• NeilBrown's avatar
    nfsd: optimise recalculate_deny_mode() for a common case · d43113fb
    NeilBrown authored
    recalculate_deny_mode() takes time that is linear in the number of
    stateids active on the file.
    
    When called from
      release_openowner -> free_ol_stateid_reaplist ->nfs4_free_ol_stateid
      -> release_all_access
    
    the number of times it is called is linear in the number of stateids.
    The net result is that time taken by release_openowner is quadratic in
    the number of stateids.
    
    When the nfsd server is shut down while there are many active stateids
    this can result in a soft lockup. ("CPU stuck for 302s" seen in one case).
    
    In many cases all the states have the same deny modes and there is no
    need to examine the entire list in recalculate_deny_mode().  In
    particular, recalculate_deny_mode() will only reduce the deny mode,
    never increase it.  So if some prefix of the list causes the original
    deny mode to be required, there is no need to examine the remainder of
    the list.
    
    So we can improve recalculate_deny_mode() to usually run in constant
    time, so release_openowner will typically be only linear in the number
    of states.
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    d43113fb
nfs4state.c 231 KB