@@ -532,6 +532,7 @@ typedef struct osm_subn {
boolean_t in_sweep_hop_0;
boolean_t first_time_master_sweep;
boolean_t coming_out_of_standby;
+ boolean_t sweeping_enabled;
unsigned need_update;
cl_fmap_t mgrp_mgid_tbl;
void *mboxes[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1];
@@ -651,6 +652,11 @@ typedef struct osm_subn {
* The flag is set true if the SM state was standby and now
* changed to MASTER it is reset at the end of the sweep.
*
+* sweeping_enabled
+* FALSE - sweeping is administratively disabled, all
+* sweeping is inhibited, TRUE - sweeping is done
+* normally
+*
* need_update
* This flag should be on during first non-master heavy
* (including pre-master discovery stage)
@@ -150,6 +150,16 @@ static void help_reroute(FILE * out, int detail)
}
}
+static void help_sweep(FILE * out, int detail)
+{
+ fprintf(out, "sweep [on|off]\n");
+ if (detail) {
+ fprintf(out, "enable or disable sweeping\n");
+ fprintf(out, " [on] sweep normally\n");
+ fprintf(out, " [off] inhibit all sweeping\n");
+ }
+}
+
static void help_status(FILE * out, int detail)
{
fprintf(out, "status [loop]\n");
@@ -427,11 +437,15 @@ static void print_status(osm_opensm_t * p_osm, FILE * out)
p_osm->stats.sa_mads_ignored);
fprintf(out, "\n Subnet flags\n"
" ------------\n"
+ " Sweeping enabled : %d\n"
+ " Sweep interval (seconds) : %d\n"
" Ignore existing lfts : %d\n"
" Subnet Init errors : %d\n"
" In sweep hop 0 : %d\n"
" First time master sweep : %d\n"
" Coming out of standby : %d\n",
+ p_osm->subn.sweeping_enabled,
+ p_osm->subn.opt.sweep_interval,
p_osm->subn.ignore_existing_lfts,
p_osm->subn.subnet_initialization_error,
p_osm->subn.in_sweep_hop_0,
@@ -495,6 +509,23 @@ static void reroute_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
osm_opensm_sweep(p_osm);
}
+static void sweep_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
+{
+ char *p_cmd;
+
+ p_cmd = next_token(p_last);
+ if (!p_cmd ||
+ (strcmp(p_cmd, "on") != 0 && strcmp(p_cmd, "off") != 0)) {
+ fprintf(out, "Invalid sweep command\n");
+ help_sweep(out, 1);
+ } else {
+ if (strcmp(p_cmd, "on") == 0)
+ p_osm->subn.sweeping_enabled = TRUE;
+ else
+ p_osm->subn.sweeping_enabled = FALSE;
+ }
+}
+
static void logflush_parse(char **p_last, osm_opensm_t * p_osm, FILE * out)
{
fflush(p_osm->log.out_port);
@@ -1332,6 +1363,7 @@ static const struct command console_cmds[] = {
{"priority", &help_priority, &priority_parse},
{"resweep", &help_resweep, &resweep_parse},
{"reroute", &help_reroute, &reroute_parse},
+ {"sweep", &help_sweep, &sweep_parse},
{"status", &help_status, &status_parse},
{"logflush", &help_logflush, &logflush_parse},
{"querylid", &help_querylid, &querylid_parse},
@@ -1415,7 +1415,13 @@ void osm_state_mgr_process(IN osm_sm_t * sm, IN osm_signal_t signal)
switch (signal) {
case OSM_SIGNAL_SWEEP:
- do_sweep(sm);
+ if (!sm->p_subn->sweeping_enabled) {
+ OSM_LOG(sm->p_log, OSM_LOG_DEBUG, "sweeping disabled - "
+ "ignoring signal %s in state %s\n",
+ osm_get_sm_signal_str(signal),
+ osm_get_sm_mgr_state_str(sm->p_subn->sm_state));
+ } else
+ do_sweep(sm);
break;
case OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST:
do_process_mgrp_queue(sm);
@@ -531,6 +531,7 @@ ib_api_status_t osm_subn_init(IN osm_subn_t * p_subn, IN osm_opensm_t * p_osm,
/* we assume master by default - so we only need to set it true if STANDBY */
p_subn->coming_out_of_standby = FALSE;
+ p_subn->sweeping_enabled = TRUE;
return IB_SUCCESS;
}