Commit ed00c2f6 authored by Trond Myklebust's avatar Trond Myklebust Committed by J. Bruce Fields

knfsd: Further simplify the cache lookup

Order the structure so that the key can be compared using memcmp().
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 76ecec21
...@@ -19,18 +19,21 @@ ...@@ -19,18 +19,21 @@
* is much larger than a sockaddr_in6. * is much larger than a sockaddr_in6.
*/ */
struct svc_cacherep { struct svc_cacherep {
struct list_head c_lru; struct {
/* Keep often-read xid, csum in the same cache line: */
__be32 k_xid;
__wsum k_csum;
u32 k_proc;
u32 k_prot;
u32 k_vers;
unsigned int k_len;
struct sockaddr_in6 k_addr;
} c_key;
struct list_head c_lru;
unsigned char c_state, /* unused, inprog, done */ unsigned char c_state, /* unused, inprog, done */
c_type, /* status, buffer */ c_type, /* status, buffer */
c_secure : 1; /* req came from port < 1024 */ c_secure : 1; /* req came from port < 1024 */
struct sockaddr_in6 c_addr;
__be32 c_xid;
u32 c_prot;
u32 c_proc;
u32 c_vers;
unsigned int c_len;
__wsum c_csum;
unsigned long c_timestamp; unsigned long c_timestamp;
union { union {
struct kvec u_vec; struct kvec u_vec;
......
...@@ -131,15 +131,15 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum) ...@@ -131,15 +131,15 @@ nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum)
rp->c_type = RC_NOCACHE; rp->c_type = RC_NOCACHE;
INIT_LIST_HEAD(&rp->c_lru); INIT_LIST_HEAD(&rp->c_lru);
rp->c_xid = rqstp->rq_xid; memset(&rp->c_key, 0, sizeof(rp->c_key));
rp->c_proc = rqstp->rq_proc; rp->c_key.k_xid = rqstp->rq_xid;
memset(&rp->c_addr, 0, sizeof(rp->c_addr)); rp->c_key.k_proc = rqstp->rq_proc;
rpc_copy_addr((struct sockaddr *)&rp->c_addr, svc_addr(rqstp)); rpc_copy_addr((struct sockaddr *)&rp->c_key.k_addr, svc_addr(rqstp));
rpc_set_port((struct sockaddr *)&rp->c_addr, rpc_get_port(svc_addr(rqstp))); rpc_set_port((struct sockaddr *)&rp->c_key.k_addr, rpc_get_port(svc_addr(rqstp)));
rp->c_prot = rqstp->rq_prot; rp->c_key.k_prot = rqstp->rq_prot;
rp->c_vers = rqstp->rq_vers; rp->c_key.k_vers = rqstp->rq_vers;
rp->c_len = rqstp->rq_arg.len; rp->c_key.k_len = rqstp->rq_arg.len;
rp->c_csum = csum; rp->c_key.k_csum = csum;
} }
return rp; return rp;
} }
...@@ -330,27 +330,14 @@ nfsd_cache_csum(struct svc_rqst *rqstp) ...@@ -330,27 +330,14 @@ nfsd_cache_csum(struct svc_rqst *rqstp)
return csum; return csum;
} }
static bool static int
nfsd_cache_match(const struct svc_cacherep *key, const struct svc_cacherep *rp) nfsd_cache_key_cmp(const struct svc_cacherep *key, const struct svc_cacherep *rp)
{ {
/* Check RPC XID first */ if (key->c_key.k_xid == rp->c_key.k_xid &&
if (key->c_xid != rp->c_xid) key->c_key.k_csum != rp->c_key.k_csum)
return false;
/* compare checksum of NFS data */
if (key->c_csum != rp->c_csum) {
++payload_misses; ++payload_misses;
return false;
}
/* Other discriminators */
if (key->c_proc != rp->c_proc ||
key->c_prot != rp->c_prot ||
key->c_vers != rp->c_vers ||
key->c_len != rp->c_len ||
memcmp(&key->c_addr, &rp->c_addr, sizeof(key->c_addr)) != 0)
return false;
return true; return memcmp(&key->c_key, &rp->c_key, sizeof(key->c_key));
} }
/* /*
...@@ -367,7 +354,7 @@ nfsd_cache_insert(struct nfsd_drc_bucket *b, struct svc_cacherep *key) ...@@ -367,7 +354,7 @@ nfsd_cache_insert(struct nfsd_drc_bucket *b, struct svc_cacherep *key)
list_for_each_entry(rp, rh, c_lru) { list_for_each_entry(rp, rh, c_lru) {
++entries; ++entries;
if (nfsd_cache_match(key, rp)) { if (nfsd_cache_key_cmp(key, rp) == 0) {
ret = rp; ret = rp;
break; break;
} }
...@@ -510,7 +497,7 @@ nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp) ...@@ -510,7 +497,7 @@ nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
if (!rp) if (!rp)
return; return;
hash = nfsd_cache_hash(rp->c_xid); hash = nfsd_cache_hash(rp->c_key.k_xid);
b = &drc_hashtbl[hash]; b = &drc_hashtbl[hash];
len = resv->iov_len - ((char*)statp - (char*)resv->iov_base); len = resv->iov_len - ((char*)statp - (char*)resv->iov_base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment