A routing engine that wants to make contributions to SL2VL maps in support
of routing free from credit loops may need to know the minimum number
of supported data VLs in the fabric.

This code tracks that value.

Signed-off-by: Jim Schutt <jasc...@sandia.gov>
---
 opensm/include/opensm/osm_subnet.h |    1 +
 opensm/opensm/osm_port_info_rcv.c  |   13 ++++++++++++-
 opensm/opensm/osm_state_mgr.c      |    6 ++++++
 opensm/opensm/osm_subnet.c         |    1 +
 4 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/opensm/include/opensm/osm_subnet.h 
b/opensm/include/opensm/osm_subnet.h
index 0302f91..c303e86 100644
--- a/opensm/include/opensm/osm_subnet.h
+++ b/opensm/include/opensm/osm_subnet.h
@@ -509,6 +509,7 @@ typedef struct osm_subn {
        uint16_t max_mcast_lid_ho;
        uint8_t min_ca_mtu;
        uint8_t min_ca_rate;
+       uint8_t min_data_vls;
        boolean_t ignore_existing_lfts;
        boolean_t subnet_initialization_error;
        boolean_t force_heavy_sweep;
diff --git a/opensm/opensm/osm_port_info_rcv.c 
b/opensm/opensm/osm_port_info_rcv.c
index 8a99064..b0d54c8 100644
--- a/opensm/opensm/osm_port_info_rcv.c
+++ b/opensm/opensm/osm_port_info_rcv.c
@@ -82,6 +82,7 @@ static void pi_rcv_process_endport(IN osm_sm_t * sm, IN 
osm_physp_t * p_physp,
        ib_api_status_t status;
        ib_net64_t port_guid;
        uint8_t rate, mtu;
+       unsigned data_vls;
        cl_qmap_t *p_sm_tbl;
        osm_remote_sm_t *p_sm;
 
@@ -91,7 +92,7 @@ static void pi_rcv_process_endport(IN osm_sm_t * sm, IN 
osm_physp_t * p_physp,
 
        /* HACK extended port 0 should be handled too! */
        if (osm_physp_get_port_num(p_physp) != 0) {
-               /* track the minimal endport MTU and rate */
+               /* track the minimal endport MTU, rate, and operational VLs */
                mtu = ib_port_info_get_mtu_cap(p_pi);
                if (mtu < sm->p_subn->min_ca_mtu) {
                        OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
@@ -107,6 +108,16 @@ static void pi_rcv_process_endport(IN osm_sm_t * sm, IN 
osm_physp_t * p_physp,
                                PRIx64 "\n", rate, cl_ntoh64(port_guid));
                        sm->p_subn->min_ca_rate = rate;
                }
+
+               data_vls = 1U << (ib_port_info_get_op_vls(p_pi) - 1);
+               if (data_vls >= IB_MAX_NUM_VLS)
+                       data_vls = IB_MAX_NUM_VLS - 1;
+               if ((uint8_t)data_vls < sm->p_subn->min_data_vls) {
+                       OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
+                               "Setting endport minimal data VLs to:%u defined 
by port:0x%"
+                               PRIx64 "\n", data_vls, cl_ntoh64(port_guid));
+                       sm->p_subn->min_data_vls = data_vls;
+               }
        }
 
        if (port_guid != sm->p_subn->sm_port_guid) {
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index c3f49dc..b6c41a6 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -1132,6 +1132,12 @@ repeat_discovery:
        sm->p_subn->force_reroute = FALSE;
        sm->p_subn->subnet_initialization_error = FALSE;
 
+       /* Reset tracking values in case limiting component got removed
+        * from fabric. */
+       sm->p_subn->min_ca_mtu = IB_MAX_MTU;
+       sm->p_subn->min_ca_rate = IB_MAX_RATE;
+       sm->p_subn->min_data_vls = IB_MAX_NUM_VLS - 1;
+
        /* rescan configuration updates */
        if (!config_parsed && osm_subn_rescan_conf_files(sm->p_subn) < 0)
                OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 331A: "
diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c
index 2cfcbe6..19ba730 100644
--- a/opensm/opensm/osm_subnet.c
+++ b/opensm/opensm/osm_subnet.c
@@ -526,6 +526,7 @@ ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, IN 
osm_opensm_t * p_osm,
        p_subn->max_mcast_lid_ho = IB_LID_MCAST_END_HO;
        p_subn->min_ca_mtu = IB_MAX_MTU;
        p_subn->min_ca_rate = IB_MAX_RATE;
+       p_subn->min_data_vls = IB_MAX_NUM_VLS - 1;
        p_subn->ignore_existing_lfts = TRUE;
 
        /* we assume master by default - so we only need to set it true if 
STANDBY */
-- 
1.5.6.GIT


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

Reply via email to