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
