On 14:34 Tue 28 Aug     , Sasha Khapyorsky wrote:
> 

[snip...]

> diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
> index 6fc9496..c052456 100644
> --- a/opensm/opensm/osm_sm.c
> +++ b/opensm/opensm/osm_sm.c
> @@ -69,50 +69,51 @@
>  
>  /**********************************************************************
>   **********************************************************************/
> -void __osm_sm_sweeper(IN void *p_ptr)
> +static void __osm_sm_sweeper(IN void *p_ptr)
>  {
>       ib_api_status_t status;
>       osm_sm_t *const p_sm = (osm_sm_t *) p_ptr;
> +     unsigned signals, i;
>  
>       OSM_LOG_ENTER(p_sm->p_log, __osm_sm_sweeper);
>  
> -     if (p_sm->thread_state == OSM_THREAD_STATE_INIT) {
> -             p_sm->thread_state = OSM_THREAD_STATE_RUN;
> -     }
> -
> -     /* If the sweep interval was updated before - then run only if
> -      * it is not zero. */
> -     while (p_sm->thread_state == OSM_THREAD_STATE_RUN &&
> -            p_sm->p_subn->opt.sweep_interval != 0) {
> -             /*  do the sweep only if we are in MASTER state */
> -             if (p_sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER ||
> -                 p_sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING)
> -                     osm_state_mgr_process(&p_sm->state_mgr,
> -                                           OSM_SIGNAL_SWEEP);
> -
> +     while (p_sm->thread_state == OSM_THREAD_STATE_RUN) {
>               /*
>                * Wait on the event with a timeout.
>                * Sweeps may be initiated "off schedule" by simply
>                * signaling the event.
>                */
> -             status = cl_event_wait_on(&p_sm->signal,
> +             status = cl_event_wait_on(&p_sm->signal_event,
> +                                       p_sm->p_subn->opt.sweep_interval ?
>                                         p_sm->p_subn->opt.sweep_interval *
> -                                       1000000, TRUE);
> -
> -             if (status == CL_SUCCESS) {
> -                     if (osm_log_is_active(p_sm->p_log, OSM_LOG_DEBUG)) {
> -                             osm_log(p_sm->p_log, OSM_LOG_DEBUG,
> -                                     "__osm_sm_sweeper: "
> -                                     "Off schedule sweep signalled\n");
> -                     }
> -             } else {
> -                     if (status != CL_TIMEOUT) {
> -                             osm_log(p_sm->p_log, OSM_LOG_ERROR,
> -                                     "__osm_sm_sweeper: ERR 2E01: "
> -                                     "Event wait failed (%s)\n",
> -                                     CL_STATUS_MSG(status));
> -                     }
> +                                       1000000 : EVENT_NO_TIMEOUT, TRUE);
> +
> +             if (status == CL_SUCCESS)
> +                     osm_log(p_sm->p_log, OSM_LOG_DEBUG,
> +                             "__osm_sm_sweeper: "
> +                             "Off schedule sweep signalled\n");
> +             else if (status != CL_TIMEOUT) {
> +                     osm_log(p_sm->p_log, OSM_LOG_ERROR,
> +                             "__osm_sm_sweeper: ERR 2E01: "
> +                             "Event wait failed (%s)\n",
> +                             CL_STATUS_MSG(status));
> +                     continue;
>               }
> +
> +             cl_spinlock_acquire(&p_sm->signal_lock);
> +             signals = p_sm->signal_mask;
> +             p_sm->signal_mask = 0;
> +             cl_spinlock_release(&p_sm->signal_lock);
> +
> +             /*  do the sweep only if we are in MASTER state */
> +             if (status == CL_TIMEOUT &&
> +                 (p_sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER ||
> +                  p_sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING))
> +                     p_sm->signal_mask |= 1 << OSM_SIGNAL_SWEEP;

Actually here should be just:

                        signals != 1 << OSM_SIGNAL_SWEEP;

> +
> +             for (i = 0 ; signals ; signals >>= 1 , i++)
> +                     if (signals&1)
> +                             osm_state_mgr_process(&p_sm->state_mgr, i);
>       }
>  
>       OSM_LOG_EXIT(p_sm->p_log);
_______________________________________________
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