[dpdk-dev] [PATCH 2/2] timer bug fix
Vadim Suraev
vadim.suraev at gmail.com
Fri May 23 21:43:04 CEST 2014
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 <vadim.suraev at gmail.com>
---
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 d07232b..f0f0c2f 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;
--
1.7.9.5
More information about the dev
mailing list