ib/cm: update port attributes earlier in destruction path
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 12 May 2009 17:16:33 +0000 (17:16 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 12 May 2009 17:16:33 +0000 (17:16 +0000)
The CM tries to modify the port attributes during the cleanup
phase of port cep destruction.  However, if the stack is
being brought down, by the time ib_modify_hca is called, the
h_ca handle is invalid.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2169 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/kernel/al_cm_cep.c

index 694debb..be0a004 100644 (file)
@@ -2409,6 +2409,7 @@ __destroying_port_cep(
 {\r
        cep_agent_t                     *p_port_cep;\r
        KLOCK_QUEUE_HANDLE      hdl;\r
+       ib_port_attr_mod_t      port_attr_mod;\r
 \r
        AL_ENTER( AL_DBG_CM );\r
 \r
@@ -2433,6 +2434,16 @@ __destroying_port_cep(
                p_port_cep->h_pd = NULL;\r
        }\r
 \r
+       if( p_port_cep->h_ca )\r
+       {\r
+               /* Update local port attributes */\r
+               port_attr_mod.cap.cm = FALSE;\r
+               ib_modify_ca( p_port_cep->h_ca, p_port_cep->port_num,\r
+                       IB_CA_MOD_IS_CM_SUPPORTED, &port_attr_mod );\r
+               deref_al_obj( &p_port_cep->h_ca->obj );\r
+               p_port_cep->h_ca = NULL;\r
+       }\r
+\r
        AL_EXIT( AL_DBG_CM );\r
 }\r
 \r
@@ -2447,22 +2458,10 @@ __free_port_cep(
        IN                              al_obj_t                                        *p_obj )\r
 {\r
        cep_agent_t                     *p_port_cep;\r
-       ib_port_attr_mod_t      port_attr_mod;\r
 \r
        AL_ENTER( AL_DBG_CM );\r
 \r
        p_port_cep = PARENT_STRUCT( p_obj, cep_agent_t, obj );\r
-\r
-       if( p_port_cep->h_ca )\r
-       {\r
-               /* Update local port attributes */\r
-               port_attr_mod.cap.cm = FALSE;\r
-               ib_modify_ca( p_port_cep->h_ca, p_port_cep->port_num,\r
-                       IB_CA_MOD_IS_CM_SUPPORTED, &port_attr_mod );\r
-\r
-               deref_al_obj( &p_port_cep->h_ca->obj );\r
-       }\r
-\r
        destroy_al_obj( &p_port_cep->obj );\r
        cl_free( p_port_cep );\r
 \r