From patchwork Tue May 25 16:53:30 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Kepner X-Patchwork-Id: 102240 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4PGraU0007248 for ; Tue, 25 May 2010 16:53:36 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758878Ab0EYQxc (ORCPT ); Tue, 25 May 2010 12:53:32 -0400 Received: from relay3.sgi.com ([192.48.152.1]:49585 "EHLO relay.sgi.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758849Ab0EYQxc (ORCPT ); Tue, 25 May 2010 12:53:32 -0400 Received: from localhost (sshcf.sgi.com [198.149.20.12]) by relay3.corp.sgi.com (Postfix) with ESMTP id 653D2AC009; Tue, 25 May 2010 09:53:31 -0700 (PDT) Date: Tue, 25 May 2010 09:53:30 -0700 From: Arthur Kepner To: linux-rdma@vger.kernel.org Cc: sashak@voltaire.com, Dale.R.Talcott@nasa.gov Subject: [PATCH/RFC] opensm: toggle sweeping V3 Message-ID: <20100525165330.GO2678@sgi.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Tue, 25 May 2010 16:53:36 +0000 (UTC) diff --git a/opensm/include/opensm/osm_subnet.h b/opensm/include/opensm/osm_subnet.h index d79ed8f..2a1db99 100644 --- a/opensm/include/opensm/osm_subnet.h +++ b/opensm/include/opensm/osm_subnet.h @@ -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) diff --git a/opensm/opensm/osm_console.c b/opensm/opensm/osm_console.c index 968486e..bc7bea3 100644 --- a/opensm/opensm/osm_console.c +++ b/opensm/opensm/osm_console.c @@ -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}, diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c index e43463f..81c8f54 100644 --- a/opensm/opensm/osm_state_mgr.c +++ b/opensm/opensm/osm_state_mgr.c @@ -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); diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c index ac8cb37..ba2c812 100644 --- a/opensm/opensm/osm_subnet.c +++ b/opensm/opensm/osm_subnet.c @@ -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; }