Messages in this thread Patch in this message | | | Date | Tue, 19 Dec 2006 22:16:29 +0100 | From | Ingo Molnar <> | Subject | [patch] high-res timers: core, do itimer rearming in process context, fix |
| |
Subject: [patch] high-res timers: core, do itimer rearming in process context, fix From: Ingo Molnar <mingo@elte.hu>
restart itimers when they are not queued. (a non-queued hrtimer might be callback-pending - but in that case we already missed the rearming so the SIGALRM branch has to rearm.)
this fixes a threaded itimers stress-test hang.
Signed-off-by: Ingo Molnar <mingo@elte.hu> --- include/linux/hrtimer.h | 9 +++++++++ kernel/hrtimer.c | 9 --------- kernel/signal.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-)
Index: linux/include/linux/hrtimer.h =================================================================== --- linux.orig/include/linux/hrtimer.h +++ linux/include/linux/hrtimer.h @@ -309,6 +309,15 @@ static inline int hrtimer_active(const s return timer->state != HRTIMER_STATE_INACTIVE; } +/* + * Helper function to check, whether the timer is on one of the queues + */ +static inline int hrtimer_is_queued(struct hrtimer *timer) +{ + return timer->state & + (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING); +} + /* Forward a hrtimer so it expires after now: */ extern unsigned long hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval); Index: linux/kernel/hrtimer.c =================================================================== --- linux.orig/kernel/hrtimer.c +++ linux/kernel/hrtimer.c @@ -152,15 +152,6 @@ static void hrtimer_get_softirq_time(str } /* - * Helper function to check, whether the timer is on one of the queues - */ -static inline int hrtimer_is_queued(struct hrtimer *timer) -{ - return timer->state & - (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING); -} - -/* * Helper function to check, whether the timer is running the callback * function */ Index: linux/kernel/signal.c =================================================================== --- linux.orig/kernel/signal.c +++ linux/kernel/signal.c @@ -475,7 +475,7 @@ int dequeue_signal(struct task_struct *t if (unlikely(signr == SIGALRM)) { struct hrtimer *tmr = &tsk->signal->real_timer; - if (!hrtimer_active(tmr) && + if (!hrtimer_is_queued(tmr) && tsk->signal->it_real_incr.tv64 != 0) { hrtimer_forward(tmr, hrtimer_cb_get_time(tmr), tsk->signal->it_real_incr); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |