Periodic SM sweep (as specified by sweep_interval) is driven by cl_timer
now.

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_sm.h |    1 +
 opensm/opensm/osm_sm.c         |   31 ++++++++++++++++++++++---------
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/opensm/include/opensm/osm_sm.h b/opensm/include/opensm/osm_sm.h
index 341ec5a..4c6ce27 100644
--- a/opensm/include/opensm/osm_sm.h
+++ b/opensm/include/opensm/osm_sm.h
@@ -129,6 +129,7 @@ typedef struct osm_sm {
        cl_spinlock_t signal_lock;
        cl_event_t signal_event;
        cl_event_t subnet_up_event;
+       cl_timer_t sweep_timer;
        cl_thread_t sweeper;
        osm_subn_t *p_subn;
        osm_db_t *p_db;
diff --git a/opensm/opensm/osm_sm.c b/opensm/opensm/osm_sm.c
index c698492..154ac8e 100644
--- a/opensm/opensm/osm_sm.c
+++ b/opensm/opensm/osm_sm.c
@@ -83,9 +83,7 @@ static void __osm_sm_sweeper(IN void *p_ptr)
                 * signaling the event.
                 */
                status = cl_event_wait_on(&p_sm->signal_event,
-                                         p_sm->p_subn->opt.sweep_interval ?
-                                         p_sm->p_subn->opt.sweep_interval *
-                                         1000000 : EVENT_NO_TIMEOUT, TRUE);
+                                         EVENT_NO_TIMEOUT, TRUE);
 
                if (status == CL_SUCCESS)
                        osm_log(p_sm->p_log, OSM_LOG_DEBUG,
@@ -104,12 +102,6 @@ static void __osm_sm_sweeper(IN void *p_ptr)
                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))
-                       signals |= 1 << OSM_SIGNAL_SWEEP;
-
                for (i = 0 ; signals ; signals >>= 1 , i++)
                        if (signals&1)
                                osm_state_mgr_process(&p_sm->state_mgr, i);
@@ -118,6 +110,17 @@ static void __osm_sm_sweeper(IN void *p_ptr)
        OSM_LOG_EXIT(p_sm->p_log);
 }
 
+static void sm_sweep(void *arg)
+{
+       osm_sm_t *sm = arg;
+
+       /*  do the sweep only if we are in MASTER state */
+       if (sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER ||
+           sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING)
+               osm_sm_signal(sm, OSM_SIGNAL_SWEEP);
+       cl_timer_start(&sm->sweep_timer, sm->p_subn->opt.sweep_interval*1000);
+}
+
 /**********************************************************************
  **********************************************************************/
 void osm_sm_construct(IN osm_sm_t * const p_sm)
@@ -176,6 +179,7 @@ void osm_sm_shutdown(IN osm_sm_t * const p_sm)
        if (signal_event)
                cl_event_signal(&p_sm->signal_event);
 
+       cl_timer_stop(&p_sm->sweep_timer);
        cl_thread_destroy(&p_sm->sweeper);
 
        /*
@@ -225,6 +229,7 @@ void osm_sm_destroy(IN osm_sm_t * const p_sm)
        osm_state_mgr_destroy(&p_sm->state_mgr);
        osm_sm_state_mgr_destroy(&p_sm->sm_state_mgr);
        osm_mcast_mgr_destroy(&p_sm->mcast_mgr);
+       cl_timer_destroy(&p_sm->sweep_timer);
        cl_event_destroy(&p_sm->signal_event);
        cl_event_destroy(&p_sm->subnet_up_event);
        cl_spinlock_destroy(&p_sm->signal_lock);
@@ -271,6 +276,10 @@ osm_sm_init(IN osm_sm_t * const p_sm,
        if (status != CL_SUCCESS)
                goto Exit;
 
+       status = cl_timer_init(&p_sm->sweep_timer, sm_sweep, p_sm);
+       if (status != CL_SUCCESS)
+               goto Exit;
+
        status = osm_sm_mad_ctrl_init(&p_sm->mad_ctrl,
                                      p_sm->p_subn,
                                      p_sm->p_mad_pool,
@@ -481,6 +490,10 @@ osm_sm_init(IN osm_sm_t * const p_sm,
        if (status != IB_SUCCESS)
                goto Exit;
 
+       if (p_sm->p_subn->opt.sweep_interval)
+               cl_timer_start(&p_sm->sweep_timer,
+                              p_sm->p_subn->opt.sweep_interval*1000);
+
       Exit:
        OSM_LOG_EXIT(p_log);
        return (status);
-- 
1.5.3.rc2.38.g11308

_______________________________________________
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