IB/iser: Extend iser_free_ib_conn_res()
Put all connection IB related resources release in this routine. One exception is the cm_id which cannot be destroyed as the routine is protected by the state mutex. Also move its position to avoid forward declaration. While at it fix qp NULL assignment. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Ariel Nahum <arieln@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
		
					parent
					
						
							
								6bb0279f95
							
						
					
				
			
			
				commit
				
					
						96f15198c1
					
				
			
		
					 1 changed files with 30 additions and 28 deletions
				
			
		| 
						 | 
					@ -495,27 +495,6 @@ out_err:
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * releases the QP object
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct ib_conn *ib_conn = &iser_conn->ib_conn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	iser_info("freeing conn %p cma_id %p qp %p\n",
 | 
					 | 
				
			||||||
		  ib_conn, ib_conn->cma_id,
 | 
					 | 
				
			||||||
		  ib_conn->qp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* qp is created only once both addr & route are resolved */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (ib_conn->qp != NULL) {
 | 
					 | 
				
			||||||
		ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
 | 
					 | 
				
			||||||
		rdma_destroy_qp(ib_conn->cma_id);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ib_conn->qp	  = NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * based on the resolved device node GUID see if there already allocated
 | 
					 * based on the resolved device node GUID see if there already allocated
 | 
				
			||||||
 * device for this device. If there's no such, create one.
 | 
					 * device for this device. If there's no such, create one.
 | 
				
			||||||
| 
						 | 
					@ -607,13 +586,42 @@ void iser_release_work(struct work_struct *work)
 | 
				
			||||||
	iser_conn_release(iser_conn);
 | 
						iser_conn_release(iser_conn);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * iser_free_ib_conn_res - release IB related resources
 | 
				
			||||||
 | 
					 * @iser_conn: iser connection struct
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This routine is called with the iser state mutex held
 | 
				
			||||||
 | 
					 * so the cm_id removal is out of here. It is Safe to
 | 
				
			||||||
 | 
					 * be invoked multiple times.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void iser_free_ib_conn_res(struct iser_conn *iser_conn)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ib_conn *ib_conn = &iser_conn->ib_conn;
 | 
				
			||||||
 | 
						struct iser_device *device = ib_conn->device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iser_info("freeing conn %p cma_id %p qp %p\n",
 | 
				
			||||||
 | 
							  iser_conn, ib_conn->cma_id, ib_conn->qp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iser_free_rx_descriptors(iser_conn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ib_conn->qp != NULL) {
 | 
				
			||||||
 | 
							ib_conn->device->cq_active_qps[ib_conn->cq_index]--;
 | 
				
			||||||
 | 
							rdma_destroy_qp(ib_conn->cma_id);
 | 
				
			||||||
 | 
							ib_conn->qp = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (device != NULL) {
 | 
				
			||||||
 | 
							iser_device_try_release(device);
 | 
				
			||||||
 | 
							ib_conn->device = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Frees all conn objects and deallocs conn descriptor
 | 
					 * Frees all conn objects and deallocs conn descriptor
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void iser_conn_release(struct iser_conn *iser_conn)
 | 
					void iser_conn_release(struct iser_conn *iser_conn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ib_conn *ib_conn = &iser_conn->ib_conn;
 | 
						struct ib_conn *ib_conn = &iser_conn->ib_conn;
 | 
				
			||||||
	struct iser_device  *device = ib_conn->device;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&ig.connlist_mutex);
 | 
						mutex_lock(&ig.connlist_mutex);
 | 
				
			||||||
	list_del(&iser_conn->conn_list);
 | 
						list_del(&iser_conn->conn_list);
 | 
				
			||||||
| 
						 | 
					@ -621,13 +629,7 @@ void iser_conn_release(struct iser_conn *iser_conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&iser_conn->state_mutex);
 | 
						mutex_lock(&iser_conn->state_mutex);
 | 
				
			||||||
	BUG_ON(iser_conn->state != ISER_CONN_DOWN);
 | 
						BUG_ON(iser_conn->state != ISER_CONN_DOWN);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	iser_free_rx_descriptors(iser_conn);
 | 
					 | 
				
			||||||
	iser_free_ib_conn_res(iser_conn);
 | 
						iser_free_ib_conn_res(iser_conn);
 | 
				
			||||||
	ib_conn->device = NULL;
 | 
					 | 
				
			||||||
	/* on EVENT_ADDR_ERROR there's no device yet for this conn */
 | 
					 | 
				
			||||||
	if (device != NULL)
 | 
					 | 
				
			||||||
		iser_device_try_release(device);
 | 
					 | 
				
			||||||
	mutex_unlock(&iser_conn->state_mutex);
 | 
						mutex_unlock(&iser_conn->state_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ib_conn->cma_id != NULL) {
 | 
						if (ib_conn->cma_id != NULL) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue