NFSD: De-duplicate hash bucket indexing
Clean up: The details of finding the right hash bucket are exactly the same in both nfsd_cache_lookup() and nfsd_cache_update(). Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
e377a3e698
commit
378a6109dd
|
@ -84,12 +84,6 @@ nfsd_hashsize(unsigned int limit)
|
||||||
return roundup_pow_of_two(limit / TARGET_BUCKET_SIZE);
|
return roundup_pow_of_two(limit / TARGET_BUCKET_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32
|
|
||||||
nfsd_cache_hash(__be32 xid, struct nfsd_net *nn)
|
|
||||||
{
|
|
||||||
return hash_32((__force u32)xid, nn->maskbits);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct svc_cacherep *
|
static struct svc_cacherep *
|
||||||
nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum,
|
nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum,
|
||||||
struct nfsd_net *nn)
|
struct nfsd_net *nn)
|
||||||
|
@ -241,6 +235,14 @@ lru_put_end(struct nfsd_drc_bucket *b, struct svc_cacherep *rp)
|
||||||
list_move_tail(&rp->c_lru, &b->lru_head);
|
list_move_tail(&rp->c_lru, &b->lru_head);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static noinline struct nfsd_drc_bucket *
|
||||||
|
nfsd_cache_bucket_find(__be32 xid, struct nfsd_net *nn)
|
||||||
|
{
|
||||||
|
unsigned int hash = hash_32((__force u32)xid, nn->maskbits);
|
||||||
|
|
||||||
|
return &nn->drc_hashtbl[hash];
|
||||||
|
}
|
||||||
|
|
||||||
static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn,
|
static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn,
|
||||||
unsigned int max)
|
unsigned int max)
|
||||||
{
|
{
|
||||||
|
@ -421,10 +423,8 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
||||||
{
|
{
|
||||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||||
struct svc_cacherep *rp, *found;
|
struct svc_cacherep *rp, *found;
|
||||||
__be32 xid = rqstp->rq_xid;
|
|
||||||
__wsum csum;
|
__wsum csum;
|
||||||
u32 hash = nfsd_cache_hash(xid, nn);
|
struct nfsd_drc_bucket *b = nfsd_cache_bucket_find(rqstp->rq_xid, nn);
|
||||||
struct nfsd_drc_bucket *b = &nn->drc_hashtbl[hash];
|
|
||||||
int type = rqstp->rq_cachetype;
|
int type = rqstp->rq_cachetype;
|
||||||
int rtn = RC_DOIT;
|
int rtn = RC_DOIT;
|
||||||
|
|
||||||
|
@ -528,7 +528,6 @@ void nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
|
||||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||||
struct svc_cacherep *rp = rqstp->rq_cacherep;
|
struct svc_cacherep *rp = rqstp->rq_cacherep;
|
||||||
struct kvec *resv = &rqstp->rq_res.head[0], *cachv;
|
struct kvec *resv = &rqstp->rq_res.head[0], *cachv;
|
||||||
u32 hash;
|
|
||||||
struct nfsd_drc_bucket *b;
|
struct nfsd_drc_bucket *b;
|
||||||
int len;
|
int len;
|
||||||
size_t bufsize = 0;
|
size_t bufsize = 0;
|
||||||
|
@ -536,8 +535,7 @@ void nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
|
||||||
if (!rp)
|
if (!rp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hash = nfsd_cache_hash(rp->c_key.k_xid, nn);
|
b = nfsd_cache_bucket_find(rp->c_key.k_xid, nn);
|
||||||
b = &nn->drc_hashtbl[hash];
|
|
||||||
|
|
||||||
len = resv->iov_len - ((char*)statp - (char*)resv->iov_base);
|
len = resv->iov_len - ((char*)statp - (char*)resv->iov_base);
|
||||||
len >>= 2;
|
len >>= 2;
|
||||||
|
|
Loading…
Reference in New Issue