[PATCH 3/3] opensm: Fix crash found with ucast cache

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


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_up
date field was reset.

Signed-off-by: Yevgeny Kliteynik <kliteyn@xxxxxxxxxxxxxx>
Signed-off-by: Hal Rosenstock <hal@xxxxxxxxxxxx>
Signed-off-by: Vladimir Koushnir <vladimirk@xxxxxxxxxxxx>
Signed-off-by: Alex Netes <alexne@xxxxxxxxxxxx>
---
 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 2629fc5..6de11aa 100644
--- a/opensm/osm_state_mgr.c
+++ b/opensm/osm_state_mgr.c
@@ -108,7 +108,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 b850009..2f37eba 100644
--- a/opensm/osm_ucast_mgr.c
+++ b/opensm/osm_ucast_mgr.c
@@ -905,7 +905,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.8.2

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


[Home]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Free Online Dating]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Devices]

Add to Google Powered by Linux