diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c index e60313ce0..938b37dc1 100755 --- a/fs/nfsd/nfscache.c +++ b/fs/nfsd/nfscache.c @@ -117,21 +117,6 @@ static void nfsd_cacherep_free(struct svc_cacherep *rp) kmem_cache_free(drc_slab, rp); } -static unsigned long -nfsd_cacherep_dispose(struct list_head *dispose) -{ - struct svc_cacherep *rp; - unsigned long freed = 0; - - while (!list_empty(dispose)) { - rp = list_first_entry(dispose, struct svc_cacherep, c_lru); - list_del(&rp->c_lru); - nfsd_cacherep_free(rp); - freed++; - } - return freed; -} - static void nfsd_cacherep_unlink_locked(struct nfsd_net *nn, struct nfsd_drc_bucket *b, struct svc_cacherep *rp) @@ -274,41 +259,6 @@ nfsd_cache_bucket_find(__be32 xid, struct nfsd_net *nn) return &nn->drc_hashtbl[hash]; } -/* - * Remove and return no more than @max expired entries in bucket @b. - * If @max is zero, do not limit the number of removed entries. - */ -static void -nfsd_prune_bucket_locked(struct nfsd_net *nn, struct nfsd_drc_bucket *b, - unsigned int max, struct list_head *dispose) -{ - unsigned long expiry = jiffies - RC_EXPIRE; - struct svc_cacherep *rp, *tmp; - unsigned int freed = 0; - - lockdep_assert_held(&b->cache_lock); - - /* The bucket LRU is ordered oldest-first. */ - list_for_each_entry_safe(rp, tmp, &b->lru_head, c_lru) { - /* - * Don't free entries attached to calls that are still - * in-progress, but do keep scanning the list. - */ - if (rp->c_state == RC_INPROG) - continue; - - if (atomic_read(&nn->num_drc_entries) <= nn->max_drc_entries && - time_before(expiry, rp->c_timestamp)) - break; - - nfsd_cacherep_unlink_locked(nn, b, rp); - list_add(&rp->c_lru, dispose); - - if (max && ++freed > max) - break; - } -} - static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn, unsigned int max) { @@ -332,6 +282,11 @@ static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn, return freed; } +static long nfsd_prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn) +{ + return prune_bucket(b, nn, 3); +} + /* * Walk the LRU list and prune off entries that are older than RC_EXPIRE. * Also prune the oldest ones when the total exceeds the max number of entries. @@ -487,8 +442,6 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp) __wsum csum; struct nfsd_drc_bucket *b; int type = rqstp->rq_cachetype; - unsigned long freed; - LIST_HEAD(dispose); int rtn = RC_DOIT; rqstp->rq_cacherep = NULL; @@ -513,18 +466,20 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp) found = nfsd_cache_insert(b, rp, nn); if (found != rp) goto found_entry; - rqstp->rq_cacherep = rp; - rp->c_state = RC_INPROG; - nfsd_prune_bucket_locked(nn, b, 3, &dispose); - spin_unlock(&b->cache_lock); - - freed = nfsd_cacherep_dispose(&dispose); - trace_nfsd_drc_gc(nn, freed); nfsd_stats_rc_misses_inc(); + rqstp->rq_cacherep = rp; + rp->c_state = RC_INPROG; + atomic_inc(&nn->num_drc_entries); nfsd_stats_drc_mem_usage_add(nn, sizeof(*rp)); - goto out; + + nfsd_prune_bucket(b, nn); + +out_unlock: + spin_unlock(&b->cache_lock); +out: + return rtn; found_entry: /* We found a matching entry which is either in progress or done. */ @@ -562,10 +517,7 @@ found_entry: out_trace: trace_nfsd_drc_found(nn, rqstp, rtn); -out_unlock: - spin_unlock(&b->cache_lock); -out: - return rtn; + goto out_unlock; } /** diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h index 0e6c7ed9d..445d00f00 100755 --- a/fs/nfsd/trace.h +++ b/fs/nfsd/trace.h @@ -1171,28 +1171,6 @@ TRACE_EVENT(nfsd_drc_mismatch, __entry->ingress) ); -TRACE_EVENT_CONDITION(nfsd_drc_gc, - TP_PROTO( - const struct nfsd_net *nn, - unsigned long freed - ), - TP_ARGS(nn, freed), - TP_CONDITION(freed > 0), - TP_STRUCT__entry( - __field(unsigned long long, boot_time) - __field(unsigned long, freed) - __field(int, total) - ), - TP_fast_assign( - __entry->boot_time = nn->boot_time; - __entry->freed = freed; - __entry->total = atomic_read(&nn->num_drc_entries); - ), - TP_printk("boot_time=%16llx total=%d freed=%lu", - __entry->boot_time, __entry->total, __entry->freed - ) -); - TRACE_EVENT(nfsd_cb_args, TP_PROTO( const struct nfs4_client *clp,