xprtrdma: On disconnect, don't ignore pending CQEs
xprtrdma is currently throwing away queued completions during a reconnect. RPC replies posted just before connection loss, or successful completions that change the state of an FRMR, can be missed. 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
6ab59945f2
commit
a7bc211ac9
|
@ -310,6 +310,13 @@ rpcrdma_recvcq_upcall(struct ib_cq *cq, void *cq_context)
|
|||
rpcrdma_recvcq_poll(cq, ep);
|
||||
}
|
||||
|
||||
static void
|
||||
rpcrdma_flush_cqs(struct rpcrdma_ep *ep)
|
||||
{
|
||||
rpcrdma_recvcq_upcall(ep->rep_attr.recv_cq, ep);
|
||||
rpcrdma_sendcq_upcall(ep->rep_attr.send_cq, ep);
|
||||
}
|
||||
|
||||
#ifdef RPC_DEBUG
|
||||
static const char * const conn[] = {
|
||||
"address resolved",
|
||||
|
@ -872,9 +879,7 @@ rpcrdma_ep_connect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
|
|||
if (rc && rc != -ENOTCONN)
|
||||
dprintk("RPC: %s: rpcrdma_ep_disconnect"
|
||||
" status %i\n", __func__, rc);
|
||||
|
||||
rpcrdma_clean_cq(ep->rep_attr.recv_cq);
|
||||
rpcrdma_clean_cq(ep->rep_attr.send_cq);
|
||||
rpcrdma_flush_cqs(ep);
|
||||
|
||||
xprt = container_of(ia, struct rpcrdma_xprt, rx_ia);
|
||||
id = rpcrdma_create_id(xprt, ia,
|
||||
|
@ -985,8 +990,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
|
|||
{
|
||||
int rc;
|
||||
|
||||
rpcrdma_clean_cq(ep->rep_attr.recv_cq);
|
||||
rpcrdma_clean_cq(ep->rep_attr.send_cq);
|
||||
rpcrdma_flush_cqs(ep);
|
||||
rc = rdma_disconnect(ia->ri_id);
|
||||
if (!rc) {
|
||||
/* returns without wait if not connected */
|
||||
|
|
Loading…
Reference in New Issue