From: Yevgeny Kliteynik <[email protected]>

OpenSM crashes in case of ucast_cache usage, but the bug itself is in discovery 
logic.

Consider the following scenario:
 - SM is running
 - SM gets some trap (let's say link state change)
 - SM starts heavy sweep
 - switch X discovered: setting p_sw->need_update to 2
 - while still in heavy sweep, more traps received
 - heavy sweep done (note: just the heavy sweep, w/o other stages, such as 
ucast manager)
 - there were traps, hence new heavy sweep started immediately
 - p_sw->need_update field of all switches is reset to default value of 1, 
which is also done for switch X
 - heavy sweep completed
 - proceeding to next stages ...

As a result, we get newly discovered switch X w/o configuration of LFT or other 
fields, but also w/o indication that this is a new switch, because 
p_sw->need_update field was reset.

Signed-off-by: Yevgeny Kliteynik <[email protected]>
Signed-off-by: Hal Rosenstock <[email protected]>
Signed-off-by: Vladimir Koushnir <[email protected]>
Signed-off-by: Alex Netes <[email protected]>
---
 opensm/osm_state_mgr.c | 3 ++-
 opensm/osm_ucast_mgr.c | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/opensm/osm_state_mgr.c b/opensm/osm_state_mgr.c
index 00e9c72..183be36 100644
--- a/opensm/osm_state_mgr.c
+++ b/opensm/osm_state_mgr.c
@@ -111,7 +111,8 @@ static void state_mgr_reset_switch_count(IN cl_map_item_t * 
p_map_item,
 {
        osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
 
-       p_sw->need_update = 1;
+       if (p_sw->max_lid_ho != 0)
+               p_sw->need_update = 1;
 }
 
 static void state_mgr_get_sw_info(IN cl_map_item_t * p_object, IN void 
*context)
diff --git a/opensm/osm_ucast_mgr.c b/opensm/osm_ucast_mgr.c
index f33cc4c..b4cf0f2 100644
--- a/opensm/osm_ucast_mgr.c
+++ b/opensm/osm_ucast_mgr.c
@@ -907,7 +907,7 @@ static void ucast_mgr_set_fwd_top(IN cl_map_item_t * 
p_map_item,
 
        OSM_LOG_ENTER(p_mgr->p_log);
 
-       CL_ASSERT(p_sw);
+       CL_ASSERT(p_sw && p_sw->max_lid_ho);
 
        p_node = p_sw->p_node;
 
-- 
1.7.11.2

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to