[ofa-general] Re: [PATCH v3] opensm: osm_state_mgr.c - purge idle queue if heavy sweep requested

Sasha Khapyorsky sashak at voltaire.com
Tue Dec 25 09:19:59 PST 2007


Hi Yevgeny,

On 11:30 Tue 25 Dec     , Yevgeny Kliteynik wrote:
> If a heavy sweep requested during idle queue processing, OSM continues
> to process it till the end and only then notices the heavy sweep request.
> In some cases this might leave a topology change unhandled for several
> minutes. Instead, OSM should purge the idle queue, which will cause it
> to start the heavy sweep immediately.
> When the heavy sweep will be completed, OSM will recalculate multicast
> routing.
> 
> Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
> ---
>  opensm/opensm/osm_state_mgr.c |   30 +++++++++++++++++++++++++++++-
>  1 files changed, 29 insertions(+), 1 deletions(-)
> 
> diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
> index 5c39f11..2172ea0 100644
> --- a/opensm/opensm/osm_state_mgr.c
> +++ b/opensm/opensm/osm_state_mgr.c
> @@ -1062,6 +1062,28 @@ static osm_signal_t __process_idle_time_queue_start(IN osm_state_mgr_t *
>  }
> 
>  /**********************************************************************
> + **********************************************************************/
> +static void __process_idle_time_queue_purge(IN osm_state_mgr_t * const p_mgr)
> +{
> +	cl_qlist_t *p_list = &p_mgr->idle_time_list;
> +	cl_list_item_t *p_list_item;
> +	osm_idle_item_t *p_process_item;
> +
> +	OSM_LOG_ENTER(p_mgr->p_log, __process_idle_time_queue_done);
> +
> +	cl_spinlock_acquire(&p_mgr->idle_lock);
> +	p_list_item = cl_qlist_remove_head(p_list);
> +	while (p_list_item != cl_qlist_end(p_list)) {
> +		p_process_item = (osm_idle_item_t *) p_list_item;
> +		free(p_process_item);
> +	}
> +	cl_spinlock_release(&p_mgr->idle_lock);
> +
> +	OSM_LOG_EXIT(p_mgr->p_log);
> +	return;
> +}
> +
> +/**********************************************************************
>   * Go over all the remote SMs (as updated in the sm_guid_tbl).
>   * Find if there is a remote sm that is a master SM.
>   * If there is a remote master SM - return a pointer to it,
> @@ -1607,11 +1629,17 @@ void osm_state_mgr_process(IN osm_state_mgr_t * const p_mgr,
>  				/* CALL the done function */
>  				__process_idle_time_queue_done(p_mgr);
> 
> +				if (p_mgr->p_subn->force_immediate_heavy_sweep)
> +					/*
> +					 * Immediate heavy sweep is requested, so it's
> +					 * more important than processing idle queue, and
> +					 * new heavy sweep makes rest of idle queue obsolete.
> +					 */
> +					__process_idle_time_queue_purge(p_mgr);

I think here

	signal = OSM_SIGNAL_NONE;
	p_mgr->state = OSM_SM_STATE_IDLE;

should be added in order to not spend one more idle queue cycle. Right?

Sasha

>  				/*
>  				 * Set the signal to OSM_SIGNAL_IDLE_TIME_PROCESS
>  				 * so that the next element in the queue gets processed
>  				 */
> -
>  				signal = OSM_SIGNAL_IDLE_TIME_PROCESS;
>  				p_mgr->state = OSM_SM_STATE_PROCESS_REQUEST;
>  				break;
> -- 
> 1.5.1.4
> 
> 



More information about the general mailing list