[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/3] xen: timers: don't miss a timer event because of stop_timer()
If stop_timer() is called between when a timer interrupt arrives (and TIMER_SOFTIRQ is raised) and when softirqs are checked and handled, the timer that has fire is (right in stop_timer()) deactivated, and the handler for that occurrence of the interrupt never executed. This happens, e.g. to timers stopped during the wakeup from idle (e.g., C-states, on x86) path. To fix that, don't deactivate a timer, while stopping it, if it has expired. On the contrary, when that happens, (re-)raise the timer softirq, to make sure the handler is invoked. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> --- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Julien Grall <julien.grall@xxxxxxx> Cc: Tim Deegan <tim@xxxxxxx> --- xen/common/timer.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/xen/common/timer.c b/xen/common/timer.c index d9ff669..b1d1511 100644 --- a/xen/common/timer.c +++ b/xen/common/timer.c @@ -217,7 +217,7 @@ static inline void activate_timer(struct timer *timer) timer->status = TIMER_STATUS_invalid; list_del(&timer->inactive); - if ( add_entry(timer) ) + if ( add_entry(timer) || timer->expires <= NOW() ) cpu_raise_softirq(timer->cpu, TIMER_SOFTIRQ); } @@ -326,7 +326,17 @@ void stop_timer(struct timer *timer) return; if ( active_timer(timer) ) - deactivate_timer(timer); + { + /* + * If the timer is expired already, 'call' the softirq handler to + * execute it (it will leave it inactive after that). If not, just + * deactivate it. + */ + if ( timer->expires <= NOW() ) + cpu_raise_softirq(timer->cpu, TIMER_SOFTIRQ); + else + deactivate_timer(timer); + } timer_unlock_irqrestore(timer, flags); } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |