From: ftillier Date: Tue, 27 Sep 2005 00:45:47 +0000 (+0000) Subject: [WSD] Use socket reference count to control destruction. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=82fa07fbdfcb4b5fb1c3d670031a7d053aecbaf9;p=~shefty%2Frdma-win.git [WSD] Use socket reference count to control destruction. Signed-off-by: Fab Tillier (ftillier@silverstorm.com) git-svn-id: svn://openib.tc.cornell.edu/gen1@95 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/wsd/user/ibspdll.c b/trunk/ulp/wsd/user/ibspdll.c index d0fd7a52..7933df09 100644 --- a/trunk/ulp/wsd/user/ibspdll.c +++ b/trunk/ulp/wsd/user/ibspdll.c @@ -416,7 +416,7 @@ reject: IBSP_ERROR_EXIT( ("WPUCreateSocketHandle() failed: %d", *lpErrno) ); - free_socket_info( new_socket_info ); + deref_socket_info( new_socket_info ); return INVALID_SOCKET; } @@ -487,12 +487,13 @@ reject: { STAT_DEC( wpusocket_num ); } + new_socket_info->switch_socket = INVALID_SOCKET; CloseHandle( new_socket_info->h_event ); ib_destroy_socket( new_socket_info ); - free_socket_info( new_socket_info ); + deref_socket_info( new_socket_info ); /* Be nice and reject that connection. */ ib_reject( incoming->cm_req_received.h_cm_req, IB_REJ_INSUF_QP ); @@ -547,9 +548,10 @@ reject: { STAT_DEC( wpusocket_num ); } + new_socket_info->switch_socket = INVALID_SOCKET; ib_destroy_socket( new_socket_info ); - free_socket_info( new_socket_info ); + deref_socket_info( new_socket_info ); *lpErrno = WSAEACCES; @@ -2200,7 +2202,7 @@ IBSPSocket( error: if( socket_info ) - free_socket_info( socket_info ); + deref_socket_info( socket_info ); CL_ASSERT( *lpErrno != 0 ); diff --git a/trunk/ulp/wsd/user/ibspproto.h b/trunk/ulp/wsd/user/ibspproto.h index fa0a1029..eb84bd02 100644 --- a/trunk/ulp/wsd/user/ibspproto.h +++ b/trunk/ulp/wsd/user/ibspproto.h @@ -33,11 +33,7 @@ struct ibsp_socket_info * create_socket_info( void ); -void -free_socket_info( - struct ibsp_socket_info *socket_info ); - -void +void AL_API deref_socket_info( IN struct ibsp_socket_info *p_socket ); @@ -119,6 +115,7 @@ ibsp_initialize( void ); void ib_release_cq_tinfo( struct cq_thread_info *cq_tinfo ); + void ib_destroy_cq_tinfo( struct cq_thread_info *cq_tinfo ); @@ -135,10 +132,6 @@ void shutdown_and_destroy_socket_info( IN OUT struct ibsp_socket_info *socket_info ); -void -destroy_qp_and_release_ressources( - IN OUT struct ibsp_socket_info *socket_info ); - void ib_cq_comp( void *cq_context ); diff --git a/trunk/ulp/wsd/user/ibspstruct.h b/trunk/ulp/wsd/user/ibspstruct.h index 59316c44..45dc6ddb 100644 --- a/trunk/ulp/wsd/user/ibspstruct.h +++ b/trunk/ulp/wsd/user/ibspstruct.h @@ -234,8 +234,8 @@ struct ibsp_socket_info struct listen_req_param listen_req_param; } listen; - /* Event for blocking accept, connect, and disconnect */ - HANDLE h_event; + /* Event for blocking accept, and connect */ + HANDLE h_event; /* Variables associated with IBSPSelectEvent */ WSAEVENT event_select; /* Handle to Event Object */ diff --git a/trunk/ulp/wsd/user/sockinfo.c b/trunk/ulp/wsd/user/sockinfo.c index bdad2f76..883a9bc6 100644 --- a/trunk/ulp/wsd/user/sockinfo.c +++ b/trunk/ulp/wsd/user/sockinfo.c @@ -73,7 +73,7 @@ create_socket_info(void) socket_info->switch_socket = INVALID_SOCKET; /* * Preset to 1, IBSPCloseSocket will decrement it, and switch socket - * will be freed once it goes to zero after an upcall. + * will be freed once it goes to zero. */ socket_info->ref_cnt = 1; @@ -85,39 +85,20 @@ create_socket_info(void) /* - * Function: free_sock_info + * Function: deref_sock_info * * Description: - * This routine frees the socket context structure. + * This routine decrements a socket context's reference count, and if + * it reaches zero, frees the socket context structure. */ -void -free_socket_info( - struct ibsp_socket_info *socket_info ) -{ - IBSP_ENTER( IBSP_DBG_SI ); - - CL_ASSERT( !socket_info->conn_item.p_map ); - - cl_spinlock_destroy( &socket_info->buf_mem_list.mutex ); - cl_spinlock_destroy( &socket_info->mutex ); - - cl_spinlock_destroy( &socket_info->send_lock ); - cl_spinlock_destroy( &socket_info->recv_lock ); - - HeapFree( g_ibsp.heap, 0, socket_info ); - - IBSP_TRACE( IBSP_DBG_SI, ("socket_info (%p)\n", socket_info) ); - - IBSP_EXIT( IBSP_DBG_SI ); -} - - -void +void AL_API deref_socket_info( IN struct ibsp_socket_info *p_socket ) { int ret, error; + IBSP_ENTER( IBSP_DBG_SI ); + if( !cl_atomic_dec( &p_socket->ref_cnt ) ) { if( p_socket->switch_socket != INVALID_SOCKET ) @@ -141,13 +122,18 @@ deref_socket_info( p_socket->switch_socket = INVALID_SOCKET; } - /* - * This only works because the socket doesn't have its own CQ. If it - * did CQ destruction would have to be async since IBSPCloseSocket can - * be invoked from the CQ callback thread context, and freeing the - * socket structure would need to be delayed until the CQ's destroy - * callback. - */ - free_socket_info( p_socket ); + CL_ASSERT( !p_socket->qp ); + CL_ASSERT( !p_socket->conn_item.p_map ); + + cl_spinlock_destroy( &p_socket->buf_mem_list.mutex ); + cl_spinlock_destroy( &p_socket->mutex ); + + cl_spinlock_destroy( &p_socket->send_lock ); + cl_spinlock_destroy( &p_socket->recv_lock ); + + HeapFree( g_ibsp.heap, 0, p_socket ); + + IBSP_TRACE( IBSP_DBG_SI, ("Freed socket_info (%p)\n", p_socket) ); } + IBSP_EXIT( IBSP_DBG_SI ); }