RDS: Properly unmap when getting a remote access error
authorSherman Pun <sherman.pun@sun.com>
Thu, 11 Mar 2010 13:50:05 +0000 (13:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Mar 2010 04:17:00 +0000 (21:17 -0700)
If the RDMA op has aborted with a remote access error,
in addition to what we already do (tell userspace it has
completed with an error) also unmap it and put() the rm.

Otherwise, hangs may occur on arches that track maps and
will not exit without proper cleanup.

Signed-off-by: Andy Grover <andy.grover@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rds/ib_send.c

index c18228aec7798d6eb2ae202cfad36c76071f47c2..17fa80803ab01ccbd0fa1279ed448c1bd51d501d 100644 (file)
@@ -243,8 +243,12 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context)
                                struct rds_message *rm;
 
                                rm = rds_send_get_message(conn, send->s_op);
-                               if (rm)
+                               if (rm) {
+                                       if (rm->m_rdma_op)
+                                               rds_ib_send_unmap_rdma(ic, rm->m_rdma_op);
                                        rds_ib_send_rdma_complete(rm, wc.status);
+                                       rds_message_put(rm);
+                               }
                        }
 
                        oldest = (oldest + 1) % ic->i_send_ring.w_nr;