From: Trond Myklebust Date: Sat, 13 Mar 2004 16:38:41 +0000 (-0500) Subject: RPC: Make XIDs unique on a per-transport basis rather than globally unique. Gets rid X-Git-Tag: v2.6.5-rc1~31^2~1^2~15 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=4a50d68c0ff3117cd04cec4f2fd37dac9c82d203;p=history.git RPC: Make XIDs unique on a per-transport basis rather than globally unique. Gets rid of an unnecessary global spinlock. --- diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 393e6dc6a268..a352a71ecdcb 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -102,7 +102,6 @@ struct rpc_rqst { struct xdr_buf rq_private_buf; /* The receive buffer * used in the softirq. */ - /* * For authentication (e.g. auth_des) */ @@ -154,6 +153,11 @@ struct rpc_xprt { resvport : 1, /* use a reserved port */ stream : 1; /* TCP */ + /* + * XID + */ + __u32 xid; /* Next XID value to use */ + /* * State of TCP reply receive stuff */ diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index efde919a64fc..3073a4308d1b 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -57,6 +57,7 @@ #include #include #include +#include #include #include @@ -1330,22 +1331,14 @@ do_xprt_reserve(struct rpc_task *task) /* * Allocate a 'unique' XID */ -static u32 -xprt_alloc_xid(void) +static inline u32 xprt_alloc_xid(struct rpc_xprt *xprt) { - static spinlock_t xid_lock = SPIN_LOCK_UNLOCKED; - static int need_init = 1; - static u32 xid; - u32 ret; - - spin_lock(&xid_lock); - if (unlikely(need_init)) { - xid = get_seconds() << 12; - need_init = 0; - } - ret = xid++; - spin_unlock(&xid_lock); - return ret; + return xprt->xid++; +} + +static inline void xprt_init_xid(struct rpc_xprt *xprt) +{ + get_random_bytes(&xprt->xid, sizeof(xprt->xid)); } /* @@ -1359,7 +1352,7 @@ xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) req->rq_timeout = xprt->timeout; req->rq_task = task; req->rq_xprt = xprt; - req->rq_xid = xprt_alloc_xid(); + req->rq_xid = xprt_alloc_xid(xprt); INIT_LIST_HEAD(&req->rq_list); dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, req, req->rq_xid); @@ -1478,6 +1471,8 @@ xprt_setup(int proto, struct sockaddr_in *ap, struct rpc_timeout *to) req->rq_next = NULL; xprt->free = xprt->slot; + xprt_init_xid(xprt); + /* Check whether we want to use a reserved port */ xprt->resvport = capable(CAP_NET_BIND_SERVICE) ? 1 : 0;