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

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
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -126,13 +126,11 @@ frwr_mr_recycle_worker(struct work_struct *work)
 */
void frwr_reset(struct rpcrdma_req *req)
{
	while (!list_empty(&req->rl_registered)) {
	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);
}
}

/**
 * frwr_init_mr - Initialize one MR
@@ -532,8 +530,7 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
	 */
	frwr = NULL;
	prev = &first;
	while (!list_empty(&req->rl_registered)) {
		mr = rpcrdma_mr_pop(&req->rl_registered);
	while ((mr = rpcrdma_mr_pop(&req->rl_registered))) {

		trace_xprtrdma_mr_localinv(mr);
		r_xprt->rx_stats.local_inv_needed++;
@@ -632,8 +629,7 @@ void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
	 */
	frwr = NULL;
	prev = &first;
	while (!list_empty(&req->rl_registered)) {
		mr = rpcrdma_mr_pop(&req->rl_registered);
	while ((mr = rpcrdma_mr_pop(&req->rl_registered))) {

		trace_xprtrdma_mr_localinv(mr);
		r_xprt->rx_stats.local_inv_needed++;
+1 −6
Original line number Diff line number Diff line
@@ -841,12 +841,7 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
	 * chunks. Very likely the connection has been replaced,
	 * so these registrations are invalid and unusable.
	 */
	while (unlikely(!list_empty(&req->rl_registered))) {
		struct rpcrdma_mr *mr;

		mr = rpcrdma_mr_pop(&req->rl_registered);
		rpcrdma_mr_recycle(mr);
	}
	frwr_reset(req);

	/* This implementation supports the following combinations
	 * of chunk lists in one RPC-over-RDMA Call message:
+2 −4
Original line number Diff line number Diff line
@@ -1213,13 +1213,11 @@ struct rpcrdma_mr *
rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt)
{
	struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
	struct rpcrdma_mr *mr = NULL;
	struct rpcrdma_mr *mr;

	spin_lock(&buf->rb_mrlock);
	if (!list_empty(&buf->rb_mrs))
	mr = rpcrdma_mr_pop(&buf->rb_mrs);
	spin_unlock(&buf->rb_mrlock);

	if (!mr)
		goto out_nomrs;
	return mr;
+4 −3
Original line number Diff line number Diff line
@@ -338,7 +338,7 @@ rpcr_to_rdmar(const struct rpc_rqst *rqst)
static inline void
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 *
@@ -346,7 +346,8 @@ rpcrdma_mr_pop(struct list_head *list)
{
	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);
	if (mr)
		list_del_init(&mr->mr_list);
	return mr;
}