浏览代码

RDS: Properly unmap when getting a remote access error

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>
Sherman Pun 15 年之前
父节点
当前提交
450d06c020
共有 1 个文件被更改,包括 5 次插入1 次删除
  1. 5 1
      net/rds/ib_send.c

+ 5 - 1
net/rds/ib_send.c

@@ -243,8 +243,12 @@ void rds_ib_send_cq_comp_handler(struct ib_cq *cq, void *context)
 				struct rds_message *rm;
 				struct rds_message *rm;
 
 
 				rm = rds_send_get_message(conn, send->s_op);
 				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_ib_send_rdma_complete(rm, wc.status);
+					rds_message_put(rm);
+				}
 			}
 			}
 
 
 			oldest = (oldest + 1) % ic->i_send_ring.w_nr;
 			oldest = (oldest + 1) % ic->i_send_ring.w_nr;