Request PortInfo for all switch ports right on first NodeInfo
receiving and don't wait for SwitchInfo request results. This will
simplify a subnet discovery flow and speed it up.
Remove switch->discovery_count which is not needed anymore.

Signed-off-by: Sasha Khapyorsky <[email protected]>
---
 opensm/include/opensm/osm_switch.h |    6 ---
 opensm/opensm/osm_node_info_rcv.c  |   83 ++++++++++++++----------------------
 opensm/opensm/osm_perfmgr.c        |    1 -
 opensm/opensm/osm_state_mgr.c      |    1 -
 opensm/opensm/osm_sw_info_rcv.c    |   71 ------------------------------
 5 files changed, 32 insertions(+), 130 deletions(-)

diff --git a/opensm/include/opensm/osm_switch.h 
b/opensm/include/opensm/osm_switch.h
index 6279727..3e3626b 100644
--- a/opensm/include/opensm/osm_switch.h
+++ b/opensm/include/opensm/osm_switch.h
@@ -103,7 +103,6 @@ typedef struct osm_switch {
        uint8_t *lft;
        uint8_t *new_lft;
        osm_mcast_tbl_t mcast_tbl;
-       uint32_t discovery_count;
        unsigned endport_links;
        unsigned need_update;
        void *priv;
@@ -145,11 +144,6 @@ typedef struct osm_switch {
 *      mcast_tbl
 *              Multicast forwarding table for this switch.
 *
-*      discovery_count
-*              The number of times this switch has been discovered
-*              during the current fabric sweep.  This number is reset
-*              to zero at the start of a sweep.
-*
 *      need_update
 *              When set indicates that switch was probably reset, so
 *              fwd tables and rest cached data should be flushed
diff --git a/opensm/opensm/osm_node_info_rcv.c 
b/opensm/opensm/osm_node_info_rcv.c
index ac86b9a..e40fc82 100644
--- a/opensm/opensm/osm_node_info_rcv.c
+++ b/opensm/opensm/osm_node_info_rcv.c
@@ -244,51 +244,43 @@ _exit:
 }
 
 /**********************************************************************
- The plock must be held before calling this function.
 **********************************************************************/
-static void
-__osm_ni_rcv_process_new_node(IN osm_sm_t * sm,
-                             IN osm_node_t * const p_node,
-                             IN const osm_madw_t * const p_madw)
+static void ni_rcv_get_port_info(IN osm_sm_t * sm, IN osm_node_t * node,
+                                IN const osm_madw_t * madw)
 {
-       ib_api_status_t status = IB_SUCCESS;
        osm_madw_context_t context;
-       osm_physp_t *p_physp;
-       ib_node_info_t *p_ni;
-       ib_smp_t *p_smp;
-       uint8_t port_num;
+       osm_physp_t *physp;
+       ib_node_info_t *ni;
+       unsigned port, num_ports;
+       ib_api_status_t status;
 
-       OSM_LOG_ENTER(sm->p_log);
+       ni = ib_smp_get_payload_ptr(osm_madw_get_smp_ptr(madw));
 
-       p_smp = osm_madw_get_smp_ptr(p_madw);
-       p_ni = (ib_node_info_t *) ib_smp_get_payload_ptr(p_smp);
-       port_num = ib_node_info_get_local_port_num(p_ni);
+       if (ni->node_type == IB_NODE_TYPE_SWITCH) {
+               port = 0;
+               num_ports = osm_node_get_num_physp(node);
+       } else {
+               port = ib_node_info_get_local_port_num(ni);
+               num_ports = port + 1;
+       }
 
-       /*
-          Request PortInfo & NodeDescription attributes for the port
-          that responded to the NodeInfo attribute.
-          Because this is a channel adapter or router, we are
-          not allowed to request PortInfo for the other ports.
-          Set the context union properly, so the recipient
-          knows which node & port are relevant.
-        */
-       p_physp = osm_node_get_physp_ptr(p_node, port_num);
+       physp = osm_node_get_physp_ptr(node, port);
 
-       context.pi_context.node_guid = p_ni->node_guid;
-       context.pi_context.port_guid = p_ni->port_guid;
+       context.pi_context.node_guid = osm_node_get_node_guid(node);
+       context.pi_context.port_guid = osm_physp_get_port_guid(physp);
        context.pi_context.set_method = FALSE;
        context.pi_context.light_sweep = FALSE;
        context.pi_context.active_transition = FALSE;
 
-       status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp),
-                            IB_MAD_ATTR_PORT_INFO,
-                            cl_hton32(port_num), CL_DISP_MSGID_NONE, &context);
-       if (status != IB_SUCCESS)
-               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D02: "
-                       "Failure initiating PortInfo request (%s)\n",
-                       ib_get_err_str(status));
-
-       OSM_LOG_EXIT(sm->p_log);
+       for (; port < num_ports; port++) {
+               status = osm_req_get(sm, osm_physp_get_dr_path_ptr(physp),
+                                    IB_MAD_ATTR_PORT_INFO, cl_hton32(port),
+                                    CL_DISP_MSGID_NONE, &context);
+               if (status != IB_SUCCESS)
+                       OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR OD02: "
+                               "Failure initiating PortInfo request (%s)\n",
+                               ib_get_err_str(status));
+       }
 }
 
 /**********************************************************************
@@ -359,7 +351,7 @@ __osm_ni_rcv_process_new_ca_or_router(IN osm_sm_t * sm,
 {
        OSM_LOG_ENTER(sm->p_log);
 
-       __osm_ni_rcv_process_new_node(sm, p_node, p_madw);
+       ni_rcv_get_port_info(sm, p_node, p_madw);
 
        /*
           A node guid of 0 is the corner case that indicates
@@ -384,10 +376,8 @@ __osm_ni_rcv_process_existing_ca_or_router(IN osm_sm_t * 
sm,
        ib_smp_t *p_smp;
        osm_port_t *p_port;
        osm_port_t *p_port_check;
-       osm_madw_context_t context;
        uint8_t port_num;
        osm_physp_t *p_physp;
-       ib_api_status_t status;
        osm_dr_path_t *p_dr_path;
        osm_bind_handle_t h_bind;
 
@@ -461,19 +451,7 @@ __osm_ni_rcv_process_existing_ca_or_router(IN osm_sm_t * 
sm,
                                 p_smp->initial_path);
        }
 
-       context.pi_context.node_guid = p_ni->node_guid;
-       context.pi_context.port_guid = p_ni->port_guid;
-       context.pi_context.set_method = FALSE;
-       context.pi_context.light_sweep = FALSE;
-
-       status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp),
-                            IB_MAD_ATTR_PORT_INFO,
-                            cl_hton32(port_num), CL_DISP_MSGID_NONE, &context);
-
-       if (status != IB_SUCCESS)
-               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D13: "
-                       "Failure initiating PortInfo request (%s)\n",
-                       ib_get_err_str(status));
+       ni_rcv_get_port_info(sm, p_node, p_madw);
 
 Exit:
        OSM_LOG_EXIT(sm->p_log);
@@ -513,6 +491,9 @@ __osm_ni_rcv_process_switch(IN osm_sm_t * sm,
                        "Failure initiating SwitchInfo request (%s)\n",
                        ib_get_err_str(status));
 
+       if (p_node->discovery_count == 1)
+               ni_rcv_get_port_info(sm, p_node, p_madw);
+
        OSM_LOG_EXIT(sm->p_log);
 }
 
@@ -536,7 +517,7 @@ __osm_ni_rcv_process_existing_switch(IN osm_sm_t * sm,
         */
        if (p_node->discovery_count == 1)
                __osm_ni_rcv_process_switch(sm, p_node, p_madw);
-       else if (!p_node->sw || p_node->sw->discovery_count == 0) {
+       else if (!p_node->sw) {
                /* we don't have the SwitchInfo - retry to get it */
                OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
                        "Retry to get SwitchInfo on node GUID:0x%" PRIx64 "\n",
diff --git a/opensm/opensm/osm_perfmgr.c b/opensm/opensm/osm_perfmgr.c
index 6d325cb..58b5dc2 100644
--- a/opensm/opensm/osm_perfmgr.c
+++ b/opensm/opensm/osm_perfmgr.c
@@ -726,7 +726,6 @@ static void reset_port_count(cl_map_item_t * const 
p_map_item, void *cxt)
 static void reset_switch_count(cl_map_item_t * const p_map_item, void *cxt)
 {
        osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
-       p_sw->discovery_count = 0;
        p_sw->need_update = 0;
 }
 
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index a1efd1a..0d7cf15 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -115,7 +115,6 @@ __osm_state_mgr_reset_switch_count(IN cl_map_item_t * const 
p_map_item,
 {
        osm_switch_t *p_sw = (osm_switch_t *) p_map_item;
 
-       p_sw->discovery_count = 0;
        p_sw->need_update = 1;
 }
 
diff --git a/opensm/opensm/osm_sw_info_rcv.c b/opensm/opensm/osm_sw_info_rcv.c
index 751c6f4..2f2775a 100644
--- a/opensm/opensm/osm_sw_info_rcv.c
+++ b/opensm/opensm/osm_sw_info_rcv.c
@@ -55,53 +55,6 @@
 #include <opensm/osm_helper.h>
 #include <opensm/osm_opensm.h>
 
-/**********************************************************************
- The plock must be held before calling this function.
-**********************************************************************/
-static void si_rcv_get_port_info(IN osm_sm_t * sm, IN osm_switch_t * const 
p_sw)
-{
-       osm_madw_context_t context;
-       uint8_t port_num;
-       osm_physp_t *p_physp;
-       osm_node_t *p_node;
-       uint8_t num_ports;
-       ib_api_status_t status = IB_SUCCESS;
-
-       OSM_LOG_ENTER(sm->p_log);
-
-       CL_ASSERT(p_sw);
-
-       p_node = p_sw->p_node;
-
-       CL_ASSERT(osm_node_get_type(p_node) == IB_NODE_TYPE_SWITCH);
-
-       /*
-          Request PortInfo attribute for each port on the switch.
-        */
-       p_physp = osm_node_get_physp_ptr(p_node, 0);
-
-       context.pi_context.node_guid = osm_node_get_node_guid(p_node);
-       context.pi_context.port_guid = osm_physp_get_port_guid(p_physp);
-       context.pi_context.set_method = FALSE;
-       context.pi_context.light_sweep = FALSE;
-       context.pi_context.active_transition = FALSE;
-
-       num_ports = osm_node_get_num_physp(p_node);
-
-       for (port_num = 0; port_num < num_ports; port_num++) {
-               status = osm_req_get(sm, osm_physp_get_dr_path_ptr(p_physp),
-                                    IB_MAD_ATTR_PORT_INFO, cl_hton32(port_num),
-                                    CL_DISP_MSGID_NONE, &context);
-               if (status != IB_SUCCESS)
-                       /* continue the loop despite the error */
-                       OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3602: "
-                               "Failure initiating PortInfo request (%s)\n",
-                               ib_get_err_str(status));
-       }
-
-       OSM_LOG_EXIT(sm->p_log);
-}
-
 #if 0
 /**********************************************************************
  The plock must be held before calling this function.
@@ -307,12 +260,6 @@ static void si_rcv_process_new(IN osm_sm_t * sm, IN 
osm_node_t * const p_node,
           info we just received.
         */
        osm_switch_set_switch_info(p_sw, p_si);
-       p_sw->discovery_count++;
-
-       /*
-          Get the PortInfo attribute for every port.
-        */
-       si_rcv_get_port_info(sm, p_sw);
 
        /*
           Don't bother retrieving the current unicast and multicast tables
@@ -392,24 +339,6 @@ static boolean_t si_rcv_process_existing(IN osm_sm_t * sm,
                                                     OSM_LOG_DEBUG);
                                is_change_detected = TRUE;
                        }
-               } else {
-                       /*
-                          This is a heavy sweep.  Get information regardless
-                          of the state change bit.
-                        */
-                       p_sw->discovery_count++;
-                       OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
-                               "discovery_count is:%u\n",
-                               p_sw->discovery_count);
-
-                       /* If this is the first discovery - then get the 
port_info */
-                       if (p_sw->discovery_count == 1)
-                               si_rcv_get_port_info(sm, p_sw);
-                       else
-                               OSM_LOG(sm->p_log, OSM_LOG_DEBUG,
-                                       "Not discovering again through 
switch:0x%"
-                                       PRIx64 "\n",
-                                       osm_node_get_node_guid(p_sw->p_node));
                }
        }
 
-- 
1.6.1.2.319.gbd9e

_______________________________________________
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