Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3111d72c authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker
Browse files

xprtrdma: Chain together all MWs in same buffer pool



During connection loss recovery, need to visit every MW in a
buffer pool. Any MW that is in use by an RPC will not be on the
rb_mws list.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Tested-by: default avatarSteve Wise <swise@opengridcomputing.com>
Tested-by: default avatarShirley Ma <shirley.ma@oracle.com>
Tested-by: default avatarDevesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent c93e986a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1074,6 +1074,7 @@ rpcrdma_buffer_create(struct rpcrdma_buffer *buf, struct rpcrdma_ep *ep,
	p += cdata->padding;

	INIT_LIST_HEAD(&buf->rb_mws);
	INIT_LIST_HEAD(&buf->rb_all);
	r = (struct rpcrdma_mw *)p;
	switch (ia->ri_memreg_strategy) {
	case RPCRDMA_FRMR:
@@ -1098,6 +1099,7 @@ rpcrdma_buffer_create(struct rpcrdma_buffer *buf, struct rpcrdma_ep *ep,
				ib_dereg_mr(r->r.frmr.fr_mr);
				goto out;
			}
			list_add(&r->mw_all, &buf->rb_all);
			list_add(&r->mw_list, &buf->rb_mws);
			++r;
		}
@@ -1116,6 +1118,7 @@ rpcrdma_buffer_create(struct rpcrdma_buffer *buf, struct rpcrdma_ep *ep,
					" failed %i\n", __func__, rc);
				goto out;
			}
			list_add(&r->mw_all, &buf->rb_all);
			list_add(&r->mw_list, &buf->rb_mws);
			++r;
		}
@@ -1225,6 +1228,7 @@ rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
	while (!list_empty(&buf->rb_mws)) {
		r = list_entry(buf->rb_mws.next,
			struct rpcrdma_mw, mw_list);
		list_del(&r->mw_all);
		list_del(&r->mw_list);
		switch (ia->ri_memreg_strategy) {
		case RPCRDMA_FRMR:
+3 −1
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ struct rpcrdma_rep {
 * An external memory region is any buffer or page that is registered
 * on the fly (ie, not pre-registered).
 *
 * Each rpcrdma_buffer has a list of these anchored in rb_mws. During
 * Each rpcrdma_buffer has a list of free MWs anchored in rb_mws. During
 * call_allocate, rpcrdma_buffer_get() assigns one to each segment in
 * an rpcrdma_req. Then rpcrdma_register_external() grabs these to keep
 * track of registration metadata while each RPC is pending.
@@ -175,6 +175,7 @@ struct rpcrdma_mw {
		struct rpcrdma_frmr	frmr;
	} r;
	struct list_head	mw_list;
	struct list_head	mw_all;
};

/*
@@ -246,6 +247,7 @@ struct rpcrdma_buffer {
	atomic_t	rb_credits;	/* most recent server credits */
	int		rb_max_requests;/* client max requests */
	struct list_head rb_mws;	/* optional memory windows/fmrs/frmrs */
	struct list_head rb_all;
	int		rb_send_index;
	struct rpcrdma_req	**rb_send_bufs;
	int		rb_recv_index;