[ofa-general] [PATCH] opensm/osm_trap_rcv.c: separate port disabling code
Sasha Khapyorsky
sashak at voltaire.com
Tue Nov 18 04:51:30 PST 2008
Separate port disabling code (activated with "babbling_port_policy")
into disable_port() function.
Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
opensm/opensm/osm_trap_rcv.c | 108 ++++++++++++++++--------------------------
1 files changed, 41 insertions(+), 67 deletions(-)
diff --git a/opensm/opensm/osm_trap_rcv.c b/opensm/opensm/osm_trap_rcv.c
index 3b05775..5de283b 100644
--- a/opensm/opensm/osm_trap_rcv.c
+++ b/opensm/opensm/osm_trap_rcv.c
@@ -232,6 +232,44 @@ static int __print_num_received(IN uint32_t num_received)
return 0;
}
+static int disable_port(osm_sm_t *sm, osm_physp_t *p)
+{
+ uint8_t payload[IB_SMP_DATA_SIZE];
+ osm_madw_context_t context;
+ ib_port_info_t *pi = (ib_port_info_t *)payload;
+ int ret;
+
+ /* If trap 131, might want to disable peer port if available */
+ /* but peer port has been observed not to respond to SM requests */
+
+ OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3810: "
+ "Disabling physical port 0x%016" PRIx64 " num:%u\n",
+ cl_ntoh64(osm_physp_get_port_guid(p)), p->port_num);
+
+ memcpy(payload, &p->port_info, sizeof(ib_port_info_t));
+
+ /* Set port to disabled/down */
+ ib_port_info_set_port_state(pi, IB_LINK_DOWN);
+ ib_port_info_set_port_phys_state(IB_PORT_PHYS_STATE_DISABLED, pi);
+
+ /* Issue set of PortInfo */
+ context.pi_context.node_guid = osm_node_get_node_guid(p->p_node);
+ context.pi_context.port_guid = osm_physp_get_port_guid(p);
+ context.pi_context.set_method = TRUE;
+ context.pi_context.light_sweep = FALSE;
+ context.pi_context.active_transition = FALSE;
+
+ ret = osm_req_set(sm, osm_physp_get_dr_path_ptr(p),
+ payload, sizeof(payload), IB_MAD_ATTR_PORT_INFO,
+ cl_hton32(osm_physp_get_port_num(p)),
+ CL_DISP_MSGID_NONE, &context);
+ if (ret)
+ OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 3811: "
+ "Request to set PortInfo failed\n");
+
+ return ret;
+}
+
/**********************************************************************
**********************************************************************/
static void
@@ -454,73 +492,9 @@ __osm_trap_rcv_process_request(IN osm_sm_t * sm,
Threshold for disabling a "babbling" port is exceeded */
if (sm->p_subn->opt.
babbling_port_policy
- && num_received >= 250) {
- uint8_t
- payload[IB_SMP_DATA_SIZE];
- ib_port_info_t *p_pi =
- (ib_port_info_t *) payload;
- const ib_port_info_t *p_old_pi;
- osm_madw_context_t context;
-
- /* If trap 131, might want to disable peer port if available */
- /* but peer port has been observed not to respond to SM requests */
-
- OSM_LOG(sm->p_log, OSM_LOG_ERROR,
- "ERR 3810: "
- "Disabling physical port lid:%u num:%u\n",
- cl_ntoh16(p_ntci->
- data_details.
- ntc_129_131.
- lid),
- p_ntci->data_details.
- ntc_129_131.port_num);
-
- p_old_pi = &p_physp->port_info;
- memcpy(payload, p_old_pi,
- sizeof(ib_port_info_t));
-
- /* Set port to disabled/down */
- ib_port_info_set_port_state
- (p_pi, IB_LINK_DOWN);
- ib_port_info_set_port_phys_state
- (IB_PORT_PHYS_STATE_DISABLED,
- p_pi);
-
- /* Issue set of PortInfo */
- context.pi_context.node_guid =
- osm_node_get_node_guid
- (osm_physp_get_node_ptr
- (p_physp));
- context.pi_context.port_guid =
- osm_physp_get_port_guid
- (p_physp);
- context.pi_context.set_method =
- TRUE;
- context.pi_context.light_sweep =
- FALSE;
- context.pi_context.
- active_transition = FALSE;
-
- status =
- osm_req_set(sm,
- osm_physp_get_dr_path_ptr
- (p_physp),
- payload,
- sizeof(payload),
- IB_MAD_ATTR_PORT_INFO,
- cl_hton32
- (osm_physp_get_port_num
- (p_physp)),
- CL_DISP_MSGID_NONE,
- &context);
-
- if (status == IB_SUCCESS)
- goto Exit;
-
- OSM_LOG(sm->p_log,
- OSM_LOG_ERROR, "ERR 3811: "
- "Request to set PortInfo failed\n");
- }
+ && num_received >= 250
+ && disable_port(sm, p_physp) == 0)
+ goto Exit;
OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
"Marking unhealthy physical port by lid:%u num:%u\n",
--
1.6.0.3.517.g759a
More information about the general
mailing list