Sasha,

The following patch removes the SM from the sm_guid_table when IsSM is not present. v2 of this fixes the memory leak you pointed out in the original version. Compile tested only as I don't have an environment to recreate this anymore.

-- Hal

opensm/osm_port_info_rcv.c: Remove SM from sm_guid_tbl when IsSM is 
not present in PortInfo:CapabilityMask

SM should be removed from the sm_guid_tbl subsequent to a trap 144
indicating the capability mask changed (and the new capabilities
no longer include IsSM).

As a result of this, move clearing of SM state to be conditionalized on 
IsSM present rather than regardless of whether IsSM is set.

Prior to this patch, the OpenSM log is spammed with error messages on
SubnGets of SMInfo attribute.

Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>
---
v2 fixes memory leak pointed out by Sasha.

diff --git a/opensm/opensm/osm_port_info_rcv.c 
b/opensm/opensm/osm_port_info_rcv.c
index 47eb457..5988dc3 100644
--- a/opensm/opensm/osm_port_info_rcv.c
+++ b/opensm/opensm/osm_port_info_rcv.c
@@ -149,17 +149,17 @@ __osm_pi_rcv_process_endport(IN osm_sm_t * sm,
                         */
                        __osm_pi_rcv_set_sm(sm, p_physp);
        } else {
-               /*
-                  Before querying the SM - we want to make sure we clean its 
state, so
-                  if the querying fails we recognize that this SM is not 
active.
-                */
                p_sm_tbl = &sm->p_subn->sm_guid_tbl;
-               p_sm = (osm_remote_sm_t *) cl_qmap_get(p_sm_tbl, port_guid);
-               if (p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl))
-                       /* clean it up */
-                       p_sm->smi.pri_state = 0xF0 & p_sm->smi.pri_state;
-
                if (p_pi->capability_mask & IB_PORT_CAP_IS_SM) {
+                       /*
+                        * Before querying the SM - we want to make sure we
+                        * clean its state, so if the querying fails we
+                        * recognize that this SM is not active.
+                        */
+                       p_sm = (osm_remote_sm_t *) cl_qmap_get(p_sm_tbl, 
port_guid);
+                       if (p_sm != (osm_remote_sm_t *) cl_qmap_end(p_sm_tbl))
+                               /* clean it up */
+                               p_sm->smi.pri_state = 0xF0 & 
p_sm->smi.pri_state;
                        if (sm->p_subn->opt.ignore_other_sm)
                                OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
                                        "Ignoring SM on port 0x%" PRIx64 "\n",
@@ -171,7 +171,8 @@ __osm_pi_rcv_process_endport(IN osm_sm_t * sm,
                                        cl_ntoh64(port_guid));
 
                                /*
-                                  This port indicates it's an SM and it's not 
our own port.
+                                  This port indicates it's an SM and
+                                  it's not our own port.
                                   Acquire the SMInfo Attribute.
                                 */
                                memset(&context, 0, sizeof(context));
@@ -190,6 +191,9 @@ __osm_pi_rcv_process_endport(IN osm_sm_t * sm,
                                                "Failure requesting SMInfo 
(%s)\n",
                                                ib_get_err_str(status));
                        }
+               } else {
+                       p_sm = (osm_remote_sm_t *) cl_qmap_remove(p_sm_tbl, 
port_guid);
+                       free(p_sm);
                }
        }
 
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to