Commit 265a38d4 authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker

xprtrdma: Simplify rpcrdma_mr_pop

Clean up: rpcrdma_mr_pop call sites check if the list is empty
first. Let's replace the list_empty with less costly logic.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 39579056
...@@ -126,12 +126,10 @@ frwr_mr_recycle_worker(struct work_struct *work) ...@@ -126,12 +126,10 @@ frwr_mr_recycle_worker(struct work_struct *work)
*/ */
void frwr_reset(struct rpcrdma_req *req) void frwr_reset(struct rpcrdma_req *req)
{ {
while (!list_empty(&req->rl_registered)) { struct rpcrdma_mr *mr;
struct rpcrdma_mr *mr;
mr = rpcrdma_mr_pop(&req->rl_registered); while ((mr = rpcrdma_mr_pop(&req->rl_registered)))
rpcrdma_mr_unmap_and_put(mr); rpcrdma_mr_unmap_and_put(mr);
}
} }
/** /**
...@@ -532,8 +530,7 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) ...@@ -532,8 +530,7 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
*/ */
frwr = NULL; frwr = NULL;
prev = &first; prev = &first;
while (!list_empty(&req->rl_registered)) { while ((mr = rpcrdma_mr_pop(&req->rl_registered))) {
mr = rpcrdma_mr_pop(&req->rl_registered);
trace_xprtrdma_mr_localinv(mr); trace_xprtrdma_mr_localinv(mr);
r_xprt->rx_stats.local_inv_needed++; r_xprt->rx_stats.local_inv_needed++;
...@@ -632,8 +629,7 @@ void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) ...@@ -632,8 +629,7 @@ void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
*/ */
frwr = NULL; frwr = NULL;
prev = &first; prev = &first;
while (!list_empty(&req->rl_registered)) { while ((mr = rpcrdma_mr_pop(&req->rl_registered))) {
mr = rpcrdma_mr_pop(&req->rl_registered);
trace_xprtrdma_mr_localinv(mr); trace_xprtrdma_mr_localinv(mr);
r_xprt->rx_stats.local_inv_needed++; r_xprt->rx_stats.local_inv_needed++;
......
...@@ -841,12 +841,7 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst) ...@@ -841,12 +841,7 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
* chunks. Very likely the connection has been replaced, * chunks. Very likely the connection has been replaced,
* so these registrations are invalid and unusable. * so these registrations are invalid and unusable.
*/ */
while (unlikely(!list_empty(&req->rl_registered))) { frwr_reset(req);
struct rpcrdma_mr *mr;
mr = rpcrdma_mr_pop(&req->rl_registered);
rpcrdma_mr_recycle(mr);
}
/* This implementation supports the following combinations /* This implementation supports the following combinations
* of chunk lists in one RPC-over-RDMA Call message: * of chunk lists in one RPC-over-RDMA Call message:
......
...@@ -1213,13 +1213,11 @@ struct rpcrdma_mr * ...@@ -1213,13 +1213,11 @@ struct rpcrdma_mr *
rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt) rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt)
{ {
struct rpcrdma_buffer *buf = &r_xprt->rx_buf; struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
struct rpcrdma_mr *mr = NULL; struct rpcrdma_mr *mr;
spin_lock(&buf->rb_mrlock); spin_lock(&buf->rb_mrlock);
if (!list_empty(&buf->rb_mrs)) mr = rpcrdma_mr_pop(&buf->rb_mrs);
mr = rpcrdma_mr_pop(&buf->rb_mrs);
spin_unlock(&buf->rb_mrlock); spin_unlock(&buf->rb_mrlock);
if (!mr) if (!mr)
goto out_nomrs; goto out_nomrs;
return mr; return mr;
......
...@@ -338,7 +338,7 @@ rpcr_to_rdmar(const struct rpc_rqst *rqst) ...@@ -338,7 +338,7 @@ rpcr_to_rdmar(const struct rpc_rqst *rqst)
static inline void static inline void
rpcrdma_mr_push(struct rpcrdma_mr *mr, struct list_head *list) rpcrdma_mr_push(struct rpcrdma_mr *mr, struct list_head *list)
{ {
list_add_tail(&mr->mr_list, list); list_add(&mr->mr_list, list);
} }
static inline struct rpcrdma_mr * static inline struct rpcrdma_mr *
...@@ -346,8 +346,9 @@ rpcrdma_mr_pop(struct list_head *list) ...@@ -346,8 +346,9 @@ rpcrdma_mr_pop(struct list_head *list)
{ {
struct rpcrdma_mr *mr; struct rpcrdma_mr *mr;
mr = list_first_entry(list, struct rpcrdma_mr, mr_list); mr = list_first_entry_or_null(list, struct rpcrdma_mr, mr_list);
list_del_init(&mr->mr_list); if (mr)
list_del_init(&mr->mr_list);
return mr; return mr;
} }
......
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