summaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-07-15 21:12:08 +0200
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-07-16 13:11:58 +0200
commit3cf7292280d5e484747a5f0ee4b62327b037344c (patch)
tree31942b53680b0c64c364322c154753857a93eb93 /net/sunrpc
parentNFSv4: Validate the stateid before applying it to state recovery (diff)
downloadlinux-3cf7292280d5e484747a5f0ee4b62327b037344c.tar.xz
linux-3cf7292280d5e484747a5f0ee4b62327b037344c.zip
SUNRPC: Replace division by multiplication in calculation of queue length
When checking whether or not a particular xprt queue length is shorter than the average queue length for all xprts, prefer to use multiplication rather than division for performance reasons. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/xprtmultipath.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/net/sunrpc/xprtmultipath.c b/net/sunrpc/xprtmultipath.c
index 9d66ce53355d..5df4e7adedf0 100644
--- a/net/sunrpc/xprtmultipath.c
+++ b/net/sunrpc/xprtmultipath.c
@@ -322,7 +322,6 @@ struct rpc_xprt *xprt_iter_next_entry_roundrobin(struct rpc_xprt_iter *xpi)
struct rpc_xprt *xprt;
unsigned long xprt_queuelen;
unsigned long xps_queuelen;
- unsigned long xps_avglen;
do {
xprt = xprt_iter_next_entry_multiple(xpi,
@@ -333,8 +332,8 @@ struct rpc_xprt *xprt_iter_next_entry_roundrobin(struct rpc_xprt_iter *xpi)
if (xprt_queuelen <= 2)
break;
xps_queuelen = atomic_long_read(&xps->xps_queuelen);
- xps_avglen = DIV_ROUND_UP(xps_queuelen, xps->xps_nactive);
- } while (xprt_queuelen > xps_avglen);
+ /* Exit loop if xprt_queuelen <= average queue length */
+ } while (xprt_queuelen * READ_ONCE(xps->xps_nactive) > xps_queuelen);
return xprt;
}