@ -405,7 +405,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
ret = PTR_ERR ( ic - > i_send_cq ) ;
ic - > i_send_cq = NULL ;
rdsdebug ( " ib_create_cq send failed: %d \n " , ret ) ;
goto out;
goto rds_ibdev_ out;
}
cq_attr . cqe = ic - > i_recv_ring . w_nr ;
@ -416,19 +416,19 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
ret = PTR_ERR ( ic - > i_recv_cq ) ;
ic - > i_recv_cq = NULL ;
rdsdebug ( " ib_create_cq recv failed: %d \n " , ret ) ;
goto out;
goto send_cq_ out;
}
ret = ib_req_notify_cq ( ic - > i_send_cq , IB_CQ_NEXT_COMP ) ;
if ( ret ) {
rdsdebug ( " ib_req_notify_cq send failed: %d \n " , ret ) ;
goto out;
goto recv_cq_ out;
}
ret = ib_req_notify_cq ( ic - > i_recv_cq , IB_CQ_SOLICITED ) ;
if ( ret ) {
rdsdebug ( " ib_req_notify_cq recv failed: %d \n " , ret ) ;
goto out;
goto recv_cq_ out;
}
/* XXX negotiate max send/recv with remote? */
@ -453,7 +453,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
ret = rdma_create_qp ( ic - > i_cm_id , ic - > i_pd , & attr ) ;
if ( ret ) {
rdsdebug ( " rdma_create_qp failed: %d \n " , ret ) ;
goto out;
goto recv_cq_ out;
}
ic - > i_send_hdrs = ib_dma_alloc_coherent ( dev ,
@ -463,7 +463,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
if ( ! ic - > i_send_hdrs ) {
ret = - ENOMEM ;
rdsdebug ( " ib_dma_alloc_coherent send failed \n " ) ;
goto out;
goto qp_ out;
}
ic - > i_recv_hdrs = ib_dma_alloc_coherent ( dev ,
@ -473,7 +473,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
if ( ! ic - > i_recv_hdrs ) {
ret = - ENOMEM ;
rdsdebug ( " ib_dma_alloc_coherent recv failed \n " ) ;
goto out;
goto send_hdrs_dma_ out;
}
ic - > i_ack = ib_dma_alloc_coherent ( dev , sizeof ( struct rds_header ) ,
@ -481,7 +481,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
if ( ! ic - > i_ack ) {
ret = - ENOMEM ;
rdsdebug ( " ib_dma_alloc_coherent ack failed \n " ) ;
goto out;
goto recv_hdrs_dma_ out;
}
ic - > i_sends = vzalloc_node ( ic - > i_send_ring . w_nr * sizeof ( struct rds_ib_send_work ) ,
@ -489,7 +489,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
if ( ! ic - > i_sends ) {
ret = - ENOMEM ;
rdsdebug ( " send allocation failed \n " ) ;
goto out;
goto ack_dma_ out;
}
ic - > i_recvs = vzalloc_node ( ic - > i_recv_ring . w_nr * sizeof ( struct rds_ib_recv_work ) ,
@ -497,7 +497,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
if ( ! ic - > i_recvs ) {
ret = - ENOMEM ;
rdsdebug ( " recv allocation failed \n " ) ;
goto out;
goto sends_ out;
}
rds_ib_recv_init_ack ( ic ) ;
@ -505,8 +505,33 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
rdsdebug ( " conn %p pd %p cq %p %p \n " , conn , ic - > i_pd ,
ic - > i_send_cq , ic - > i_recv_cq ) ;
out :
return ret ;
sends_out :
vfree ( ic - > i_sends ) ;
ack_dma_out :
ib_dma_free_coherent ( dev , sizeof ( struct rds_header ) ,
ic - > i_ack , ic - > i_ack_dma ) ;
recv_hdrs_dma_out :
ib_dma_free_coherent ( dev , ic - > i_recv_ring . w_nr *
sizeof ( struct rds_header ) ,
ic - > i_recv_hdrs , ic - > i_recv_hdrs_dma ) ;
send_hdrs_dma_out :
ib_dma_free_coherent ( dev , ic - > i_send_ring . w_nr *
sizeof ( struct rds_header ) ,
ic - > i_send_hdrs , ic - > i_send_hdrs_dma ) ;
qp_out :
rdma_destroy_qp ( ic - > i_cm_id ) ;
recv_cq_out :
if ( ! ib_destroy_cq ( ic - > i_recv_cq ) )
ic - > i_recv_cq = NULL ;
send_cq_out :
if ( ! ib_destroy_cq ( ic - > i_send_cq ) )
ic - > i_send_cq = NULL ;
rds_ibdev_out :
rds_ib_remove_conn ( rds_ibdev , conn ) ;
rds_ib_dev_put ( rds_ibdev ) ;
return ret ;
}