RDS: destroy the ib state earlier during shutdown
authorsantosh.shilimkar@oracle.com <santosh.shilimkar@oracle.com>
Sat, 22 Aug 2015 22:45:24 +0000 (15:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 25 Aug 2015 20:35:29 +0000 (13:35 -0700)
Destroy ib state early during shutdown. Otherwise we can get callbacks
after the QP isn't really able to handle them.

Reviewed-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Signed-off-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rds/ib_cm.c

index f40d8f52b75398559cc36c6c236d83d0e1a5b653..94d4427377b237a5e2873c7304c476f4c50b1e54 100644 (file)
@@ -640,6 +640,16 @@ void rds_ib_conn_shutdown(struct rds_connection *conn)
                           (atomic_read(&ic->i_signaled_sends) == 0));
                tasklet_kill(&ic->i_recv_tasklet);
 
+               /* first destroy the ib state that generates callbacks */
+               if (ic->i_cm_id->qp)
+                       rdma_destroy_qp(ic->i_cm_id);
+               if (ic->i_send_cq)
+                       ib_destroy_cq(ic->i_send_cq);
+               if (ic->i_recv_cq)
+                       ib_destroy_cq(ic->i_recv_cq);
+               rdma_destroy_id(ic->i_cm_id);
+
+               /* then free the resources that ib callbacks use */
                if (ic->i_send_hdrs)
                        ib_dma_free_coherent(dev,
                                           ic->i_send_ring.w_nr *
@@ -663,14 +673,6 @@ void rds_ib_conn_shutdown(struct rds_connection *conn)
                if (ic->i_recvs)
                        rds_ib_recv_clear_ring(ic);
 
-               if (ic->i_cm_id->qp)
-                       rdma_destroy_qp(ic->i_cm_id);
-               if (ic->i_send_cq)
-                       ib_destroy_cq(ic->i_send_cq);
-               if (ic->i_recv_cq)
-                       ib_destroy_cq(ic->i_recv_cq);
-               rdma_destroy_id(ic->i_cm_id);
-
                /*
                 * Move connection back to the nodev list.
                 */