[IBAL] work around for reference count leakage bugs. [mlnx: 4404]
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 2 Jun 2009 17:49:32 +0000 (17:49 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 2 Jun 2009 17:49:32 +0000 (17:49 +0000)
IBAL still has bugs, which cause reference count leakage, which stops the cascading destroying resources of IBAL.
It causes  in turn a freeze of IBBUS on HCA disable or system power down.
On checked builds IBAL forces destroying of the objects after some timeout.
On free version it waits endlessly.
This patch makes the behavior of free version to be like in checked version while sending a message to System Event Log.

git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2229 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/al_common.c

index 4875d91..3e8e2ef 100644 (file)
@@ -35,6 +35,7 @@
 #include "al_ci_ca.h"\r
 #include "al_common.h"\r
 #include "al_debug.h"\r
 #include "al_ci_ca.h"\r
 #include "al_common.h"\r
 #include "al_debug.h"\r
+#include "al_ca.h"\r
 \r
 #if defined(EVENT_TRACING)\r
 #ifdef offsetof\r
 \r
 #if defined(EVENT_TRACING)\r
 #ifdef offsetof\r
@@ -46,6 +47,7 @@
 #include "al_mgr.h"\r
 #include <complib/cl_math.h>\r
 #include "ib_common.h"\r
 #include "al_mgr.h"\r
 #include <complib/cl_math.h>\r
 #include "ib_common.h"\r
+#include "bus_ev_log.h"\r
 \r
 \r
 \r
 \r
 \r
 \r
@@ -498,7 +500,6 @@ sync_destroy_obj(
 \r
        if( deref_al_obj( p_obj ) )\r
        {\r
 \r
        if( deref_al_obj( p_obj ) )\r
        {\r
-       #ifdef _DEBUG_\r
                uint32_t                wait_us;\r
                /*\r
                 * Wait for all other references to go away.  We wait as long as the\r
                uint32_t                wait_us;\r
                /*\r
                 * Wait for all other references to go away.  We wait as long as the\r
@@ -529,13 +530,11 @@ sync_destroy_obj(
                                        &p_obj->event, AL_MAX_TIMEOUT_US, AL_WAIT_ALERTABLE );\r
                        } while( cl_status == CL_NOT_DONE );\r
                }\r
                                        &p_obj->event, AL_MAX_TIMEOUT_US, AL_WAIT_ALERTABLE );\r
                        } while( cl_status == CL_NOT_DONE );\r
                }\r
-       #else\r
-               do\r
-               {\r
-                       cl_status = cl_event_wait_on(\r
-                               &p_obj->event, EVENT_NO_TIMEOUT, AL_WAIT_ALERTABLE );\r
-               } while( cl_status == CL_NOT_DONE );\r
-       #endif\r
+               if ( p_obj->p_ci_ca && p_obj->p_ci_ca )\r
+                       CL_PRINT_TO_EVENT_LOG( p_obj->p_ci_ca->h_ca->p_fdo, EVENT_IBBUS_ANY_ERROR,\r
+                               ("IBAL stuck: AL object %s, ref_cnt: %d. Forcing object destruction.\n",\r
+                               ib_get_obj_type( p_obj ), p_obj->ref_cnt));\r
+\r
                CL_ASSERT( cl_status == CL_SUCCESS );\r
                if( cl_status != CL_SUCCESS )\r
                {\r
                CL_ASSERT( cl_status == CL_SUCCESS );\r
                if( cl_status != CL_SUCCESS )\r
                {\r