summaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtrdma/svc_rdma_transport.c
diff options
context:
space:
mode:
authorChuck Lever2016-05-04 16:53:30 +0200
committerJ. Bruce Fields2016-05-13 21:53:06 +0200
commit76ee8fd64ac9af36b03b68912c18b3d3cd5c99de (patch)
tree0e386437be480287bb80694350b596dbc7f8e317 /net/sunrpc/xprtrdma/svc_rdma_transport.c
parentsvcrdma: Post Receives only for forward channel requests (diff)
downloadkernel-qcow2-linux-76ee8fd64ac9af36b03b68912c18b3d3cd5c99de.tar.gz
kernel-qcow2-linux-76ee8fd64ac9af36b03b68912c18b3d3cd5c99de.tar.xz
kernel-qcow2-linux-76ee8fd64ac9af36b03b68912c18b3d3cd5c99de.zip
svcrdma: Drain QP before freeing svcrdma_xprt
If the server has forced a disconnect, the associated QP has not been moved to the Error state, and thus Receives are still posted. Ensure Receives (and any other outstanding WRs) are drained to release resources that can be freed during teardown of the svcrdma_xprt. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net/sunrpc/xprtrdma/svc_rdma_transport.c')
-rw-r--r--net/sunrpc/xprtrdma/svc_rdma_transport.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
index 02a112c7cb6a..dd9440137834 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
@@ -1180,6 +1180,9 @@ static void __svc_rdma_free(struct work_struct *work)
dprintk("svcrdma: %s(%p)\n", __func__, rdma);
+ if (rdma->sc_qp && !IS_ERR(rdma->sc_qp))
+ ib_drain_qp(rdma->sc_qp);
+
/* We should only be called from kref_put */
if (atomic_read(&xprt->xpt_ref.refcount) != 0)
pr_err("svcrdma: sc_xprt still in use? (%d)\n",