From 57f0ba5f8b8588dfa6ffcd001447ef6337afa6cd Mon Sep 17 00:00:00 2001 From: Vadim Suraev Date: Wed, 21 May 2014 23:35:55 +0300 Subject: [PATCH] timer: fix pending counter Bug: When a timer is running - if rte_timer_stop is called, the pending decrement is skipped (decremented only if the timer is pending) and due to the update flag the future processing is skipped so the timer is counted as pending while it is stopped. - the same applies when rte_timer_reset is called but then the pending statistics is additionally incremented so the timer is counted pending twice. Solution: decrement the pending statistics after returning from the callback. If rte_timer_stop was called, it skipped decrementing the pending statistics. If rte_time_reset was called, the pending statistics was incremented. If neither was called and the timer is periodic, the pending statistics is incremented when it is reloaded Signed-off-by: Vadim Suraev Acked-by: Olivier Matz --- lib/librte_timer/rte_timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c index d07232b8ef..f0f0c2fb5a 100755 --- a/lib/librte_timer/rte_timer.c +++ b/lib/librte_timer/rte_timer.c @@ -551,7 +551,7 @@ void rte_timer_manage(void) tim->f(tim, tim->arg); rte_spinlock_lock(&priv_timer[lcore_id].list_lock); - + __TIMER_STAT_ADD(pending, -1); /* the timer was stopped or reloaded by the callback * function, we have nothing to do here */ if (priv_timer[lcore_id].updated == 1) @@ -559,7 +559,6 @@ void rte_timer_manage(void) if (tim->period == 0) { /* remove from done list and mark timer as stopped */ - __TIMER_STAT_ADD(pending, -1); status.state = RTE_TIMER_STOP; status.owner = RTE_TIMER_NO_OWNER; rte_wmb(); @@ -568,6 +567,7 @@ void rte_timer_manage(void) else { /* keep it in list and mark timer as pending */ status.state = RTE_TIMER_PENDING; + __TIMER_STAT_ADD(pending, 1); status.owner = (int16_t)lcore_id; rte_wmb(); tim->status.u32 = status.u32; -- 2.20.1