Remote statndby SM(s) may change priority, etc.. Somehow it should be
detected - query remotes SMs for SMIfno in a light sweep.

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_madw.h |    1 +
 opensm/opensm/osm_sminfo_rcv.c   |   11 +++++++++--
 opensm/opensm/osm_state_mgr.c    |   23 +++++++++++++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/opensm/include/opensm/osm_madw.h b/opensm/include/opensm/osm_madw.h
index 70649a3..fd39272 100644
--- a/opensm/include/opensm/osm_madw.h
+++ b/opensm/include/opensm/osm_madw.h
@@ -249,6 +249,7 @@ typedef struct osm_mft_context {
 typedef struct osm_smi_context {
        ib_net64_t port_guid;
        boolean_t set_method;
+       boolean_t light_sweep;
 } osm_smi_context_t;
 /*********/
 
diff --git a/opensm/opensm/osm_sminfo_rcv.c b/opensm/opensm/osm_sminfo_rcv.c
index 47c346d..98c1994 100644
--- a/opensm/opensm/osm_sminfo_rcv.c
+++ b/opensm/opensm/osm_sminfo_rcv.c
@@ -307,7 +307,8 @@ Exit:
  **********************************************************************/
 static osm_signal_t
 __osm_sminfo_rcv_process_get_sm(IN osm_sm_t * sm,
-                               IN const osm_remote_sm_t * const p_sm)
+                               IN const osm_remote_sm_t * const p_sm,
+                               boolean_t light_sweep)
 {
        const ib_sm_info_t *p_smi;
 
@@ -398,6 +399,11 @@ __osm_sminfo_rcv_process_get_sm(IN osm_sm_t * sm,
                                   is done and all SMs are recongnized. */
                        }
                        break;
+               case IB_SMINFO_STATE_STANDBY:
+                       if (light_sweep &&
+                           __osm_sminfo_rcv_remote_sm_is_higher(sm, p_smi))
+                               sm->p_subn->force_heavy_sweep = TRUE;
+                       break;
                default:
                        /* any other state - do nothing */
                        break;
@@ -497,7 +503,8 @@ __osm_sminfo_rcv_process_get_response(IN osm_sm_t * sm,
                /* We already know this SM. Update the SMInfo attribute. */
                p_sm->smi = *p_smi;
 
-       __osm_sminfo_rcv_process_get_sm(sm, p_sm);
+       __osm_sminfo_rcv_process_get_sm(sm, p_sm,
+                                       
osm_madw_get_smi_context_ptr(p_madw)->light_sweep);
 
 _unlock_and_exit:
        CL_PLOCK_RELEASE(sm->p_lock);
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index 5c5167f..3cdb2cf 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -49,6 +49,7 @@
 #include <iba/ib_types.h>
 #include <complib/cl_passivelock.h>
 #include <complib/cl_debug.h>
+#include <complib/cl_qmap.h>
 #include <opensm/osm_sm.h>
 #include <opensm/osm_madw.h>
 #include <opensm/osm_switch.h>
@@ -495,6 +496,25 @@ Exit:
        return (status);
 }
 
+static void query_sm_info(cl_map_item_t *item, void *cxt)
+{
+       osm_madw_context_t context;
+       osm_remote_sm_t *r_sm = cl_item_obj(item, r_sm, map_item);
+       osm_sm_t *sm = cxt;
+       ib_api_status_t ret;
+
+       context.smi_context.port_guid = r_sm->p_port->guid;
+       context.smi_context.set_method = FALSE;
+       context.smi_context.light_sweep = TRUE;
+
+       ret = osm_req_get(sm, osm_physp_get_dr_path_ptr(r_sm->p_port->p_physp),
+                         IB_MAD_ATTR_SM_INFO, 0, CL_DISP_MSGID_NONE, &context);
+       if (ret != IB_SUCCESS)
+               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3314: "
+                       "Failure requesting SMInfo (%s)\n",
+                       ib_get_err_str(ret));
+}
+
 /**********************************************************************
  Initiates a lightweight sweep of the subnet.
  Used during normal sweeps after the subnet is up.
@@ -560,6 +580,9 @@ static ib_api_status_t __osm_state_mgr_light_sweep_start(IN 
osm_sm_t * sm)
                        }
                }
        }
+
+       cl_qmap_apply_func(&sm->p_subn->sm_guid_tbl, query_sm_info, sm);
+
        CL_PLOCK_RELEASE(sm->p_lock);
 
 _exit:
-- 
1.5.5.1.178.g1f811

_______________________________________________
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