Fix a bug in the kal_cep_listen implementation.

Signed-off-by: Fab Tillier <[email protected]>

diff -dwup3 -X excl.txt -r 
\dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm_cep.c 
.\core\al\kernel\al_cm_cep.c
--- \dev\openib\ofw\gen1\branches\mlx4_30\trunk\core\al\kernel\al_cm_cep.c      
Fri Aug 03 17:24:07 2012
+++ .\core\al\kernel\al_cm_cep.c        Wed Aug 08 14:41:46 2012
@@ -4002,24 +4002,14 @@ __drep_cep(
        AL_EXIT( AL_DBG_CM );
 }
 
-/* Called with CEP manager lock held. */
-static int32_t
-__cleanup_cep(
+
+static inline void
+__cleanup_mad_list(
        IN                              kcep_t* const                           
p_cep )
 {
        ib_mad_element_t        *p_mad;
        kcep_t                          *p_new_cep;
 
-       AL_PRINT( TRACE_LEVEL_VERBOSE, AL_DBG_CM,
-               ("[ p_cep = %p (CID = %d)\n", p_cep, p_cep->cid) );
-
-       CL_ASSERT( p_cep );
-       CL_ASSERT( KeGetCurrentIrql() == DISPATCH_LEVEL );
-
-       /* If we've already come through here, we're done. */
-       CL_ASSERT( p_cep->state != CEP_STATE_DESTROY &&
-               p_cep->state != CEP_STATE_DREQ_DESTROY );
-
        /* Cleanup the pending MAD list. */
        while( p_cep->p_mad_head )
        {
@@ -4035,6 +4025,42 @@ __cleanup_cep(
                }
                ib_put_mad( p_mad );
        }
+}
+
+
+static void
+__cancel_listen(
+    IN              kcep_t* const               p_cep )
+{
+    CL_ASSERT( p_cep->state == CEP_STATE_LISTEN );
+    /* Remove from listen map. */
+    cl_rbmap_remove_item( &gp_cep_mgr->listen_map, &p_cep->listen_item );
+
+    if( p_cep->p_cmp_buf )
+    {
+        cl_free( p_cep->p_cmp_buf );
+        p_cep->p_cmp_buf = NULL;
+    }
+}
+
+
+/* Called with CEP manager lock held. */
+static int32_t
+__cleanup_cep(
+       IN                              kcep_t* const                           
p_cep )
+{
+       AL_PRINT( TRACE_LEVEL_VERBOSE, AL_DBG_CM,
+               ("[ p_cep = %p (CID = %d)\n", p_cep, p_cep->cid) );
+
+       CL_ASSERT( p_cep );
+       CL_ASSERT( KeGetCurrentIrql() == DISPATCH_LEVEL );
+
+       /* If we've already come through here, we're done. */
+       CL_ASSERT( p_cep->state != CEP_STATE_DESTROY &&
+               p_cep->state != CEP_STATE_DREQ_DESTROY );
+
+       /* Cleanup the pending MAD list. */
+    __cleanup_mad_list( p_cep );
 
        switch( p_cep->state )
        {
@@ -4094,14 +4120,7 @@ __cleanup_cep(
                break;
 
        case CEP_STATE_LISTEN:
-               /* Remove from listen map. */
-               cl_rbmap_remove_item( &gp_cep_mgr->listen_map, 
&p_cep->listen_item );
-
-               if( p_cep->p_cmp_buf )
-               {
-                       cl_free( p_cep->p_cmp_buf );
-                       p_cep->p_cmp_buf = NULL;
-               }
+        __cancel_listen( p_cep );
                break;
 
        case CEP_STATE_PRE_REQ:
@@ -4291,15 +4310,10 @@ kal_cep_cancel_listen(
                return IB_INVALID_HANDLE;
        }
 
-       cl_atomic_inc( &p_cep->ref_cnt );
-    /*
-     * Note that __cleanup_cep will decrement the ref_cnt.
-     */
-       __cleanup_cep( p_cep );
-    /*
-     * __cleanup_cep flipped the state to DESTROY, move it to IDLE.
-     */
+    __cleanup_mad_list( p_cep );
+    __cancel_listen( p_cep );
     p_cep->state = CEP_STATE_IDLE;
+
        KeReleaseInStackQueuedSpinLock( &hdl );
     return STATUS_SUCCESS;
 }

Attachment: ndv2.34.patch
Description: ndv2.34.patch

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to