mirror of https://gitee.com/openkylin/linux.git
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: Chuck Lever <chuck.lever@oracle.com> Tested-by: Steve Wise <swise@opengridcomputing.com> Tested-by: Shirley Ma <shirley.ma@oracle.com> Tested-by: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
c93e986a29
commit
3111d72c7c
|
@ -1074,6 +1074,7 @@ rpcrdma_buffer_create(struct rpcrdma_buffer *buf, struct rpcrdma_ep *ep,
|
||||||
p += cdata->padding;
|
p += cdata->padding;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&buf->rb_mws);
|
INIT_LIST_HEAD(&buf->rb_mws);
|
||||||
|
INIT_LIST_HEAD(&buf->rb_all);
|
||||||
r = (struct rpcrdma_mw *)p;
|
r = (struct rpcrdma_mw *)p;
|
||||||
switch (ia->ri_memreg_strategy) {
|
switch (ia->ri_memreg_strategy) {
|
||||||
case RPCRDMA_FRMR:
|
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);
|
ib_dereg_mr(r->r.frmr.fr_mr);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
list_add(&r->mw_all, &buf->rb_all);
|
||||||
list_add(&r->mw_list, &buf->rb_mws);
|
list_add(&r->mw_list, &buf->rb_mws);
|
||||||
++r;
|
++r;
|
||||||
}
|
}
|
||||||
|
@ -1116,6 +1118,7 @@ rpcrdma_buffer_create(struct rpcrdma_buffer *buf, struct rpcrdma_ep *ep,
|
||||||
" failed %i\n", __func__, rc);
|
" failed %i\n", __func__, rc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
list_add(&r->mw_all, &buf->rb_all);
|
||||||
list_add(&r->mw_list, &buf->rb_mws);
|
list_add(&r->mw_list, &buf->rb_mws);
|
||||||
++r;
|
++r;
|
||||||
}
|
}
|
||||||
|
@ -1225,6 +1228,7 @@ rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
|
||||||
while (!list_empty(&buf->rb_mws)) {
|
while (!list_empty(&buf->rb_mws)) {
|
||||||
r = list_entry(buf->rb_mws.next,
|
r = list_entry(buf->rb_mws.next,
|
||||||
struct rpcrdma_mw, mw_list);
|
struct rpcrdma_mw, mw_list);
|
||||||
|
list_del(&r->mw_all);
|
||||||
list_del(&r->mw_list);
|
list_del(&r->mw_list);
|
||||||
switch (ia->ri_memreg_strategy) {
|
switch (ia->ri_memreg_strategy) {
|
||||||
case RPCRDMA_FRMR:
|
case RPCRDMA_FRMR:
|
||||||
|
|
|
@ -151,7 +151,7 @@ struct rpcrdma_rep {
|
||||||
* An external memory region is any buffer or page that is registered
|
* An external memory region is any buffer or page that is registered
|
||||||
* on the fly (ie, not pre-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
|
* call_allocate, rpcrdma_buffer_get() assigns one to each segment in
|
||||||
* an rpcrdma_req. Then rpcrdma_register_external() grabs these to keep
|
* an rpcrdma_req. Then rpcrdma_register_external() grabs these to keep
|
||||||
* track of registration metadata while each RPC is pending.
|
* track of registration metadata while each RPC is pending.
|
||||||
|
@ -175,6 +175,7 @@ struct rpcrdma_mw {
|
||||||
struct rpcrdma_frmr frmr;
|
struct rpcrdma_frmr frmr;
|
||||||
} r;
|
} r;
|
||||||
struct list_head mw_list;
|
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 */
|
atomic_t rb_credits; /* most recent server credits */
|
||||||
int rb_max_requests;/* client max requests */
|
int rb_max_requests;/* client max requests */
|
||||||
struct list_head rb_mws; /* optional memory windows/fmrs/frmrs */
|
struct list_head rb_mws; /* optional memory windows/fmrs/frmrs */
|
||||||
|
struct list_head rb_all;
|
||||||
int rb_send_index;
|
int rb_send_index;
|
||||||
struct rpcrdma_req **rb_send_bufs;
|
struct rpcrdma_req **rb_send_bufs;
|
||||||
int rb_recv_index;
|
int rb_recv_index;
|
||||||
|
|
Loading…
Reference in New Issue