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 <[EMAIL PROTECTED]>
> ---
>  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
> 
> 
_______________________________________________
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

Reply via email to