Hi Hiroyuki, I am reviewing your 3 timer patches. Can you please explain in more detail your use-case that results in a problem?
For example, is it when timer A's callback tries to reset (rte_timer_reset) timer B? If yes, is timer B in PENDING state and likely to expire soon? -- Thanks, Robert On 7/17/16 2:08 PM, "Hiroyuki Mikita" <h.mikita89 at gmail.com> wrote: >When timer_cb resets another running timer on the same lcore, >the list of expired timers is chained to the pending-list. >This commit prevents a running timer from being reset >by not its own timer_cb. > >Signed-off-by: Hiroyuki Mikita <h.mikita89 at gmail.com> >--- > lib/librte_timer/rte_timer.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > >diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c >index 3dcdab5..00e80c9 100644 >--- a/lib/librte_timer/rte_timer.c >+++ b/lib/librte_timer/rte_timer.c >@@ -69,6 +69,9 @@ struct priv_timer { > > unsigned prev_lcore; /**< used for lcore round robin */ > >+ /** running timer on this lcore now */ >+ struct rte_timer *running_tim; >+ > #ifdef RTE_LIBRTE_TIMER_DEBUG > /** per-lcore statistics */ > struct rte_timer_debug_stats stats; >@@ -135,9 +138,12 @@ timer_set_config_state(struct rte_timer *tim, > while (success == 0) { > prev_status.u32 = tim->status.u32; > >- /* timer is running on another core, exit */ >+ /* timer is running on another core >+ * or ready to run on local core, exit >+ */ > if (prev_status.state == RTE_TIMER_RUNNING && >- prev_status.owner != (uint16_t)lcore_id) >+ (prev_status.owner != (uint16_t)lcore_id || >+ tim != priv_timer[lcore_id].running_tim)) > return -1; > > /* timer is being configured on another core */ >@@ -580,6 +586,7 @@ void rte_timer_manage(void) > for (tim = run_first_tim; tim != NULL; tim = next_tim) { > next_tim = tim->sl_next[0]; > priv_timer[lcore_id].updated = 0; >+ priv_timer[lcore_id].running_tim = tim; > > /* execute callback function with list unlocked */ > tim->f(tim, tim->arg); >@@ -610,6 +617,7 @@ void rte_timer_manage(void) > rte_spinlock_unlock(&priv_timer[lcore_id].list_lock); > } > } >+ priv_timer[lcore_id].running_tim = NULL; > } > > /* dump statistics about timers */ >-- >2.7.4 >