Messages in this thread Patch in this message | | | Date | Sun, 06 Jan 2008 17:11:33 +0100 | From | Peter Zijlstra <> | Subject | [PATCH 05/11] hrtimer: unlock hrtimer_wakeup |
| |
hrtimer_wakeup creates a
base->lock rq->lock
lock dependancy. Avoid this by switching to HRTIMER_CB_IRQSAFE_NO_SOFTIRQ which doesn't hold base->lock.
This fully untangles hrtimer locks from the scheduler locks, and allows hrtimer usage in the scheduler proper.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> --- kernel/hrtimer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
Index: linux-2.6/kernel/hrtimer.c =================================================================== --- linux-2.6.orig/kernel/hrtimer.c +++ linux-2.6/kernel/hrtimer.c @@ -1296,7 +1296,7 @@ void hrtimer_init_sleeper(struct hrtimer sl->timer.function = hrtimer_wakeup; sl->task = task; #ifdef CONFIG_HIGH_RES_TIMERS - sl->timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_RESTART; + sl->timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; #endif } @@ -1307,6 +1307,8 @@ static int __sched do_nanosleep(struct h do { set_current_state(TASK_INTERRUPTIBLE); hrtimer_start(&t->timer, t->timer.expires, mode); + if (!hrtimer_active(&t->timer)) + t->task = NULL; if (likely(t->task)) schedule(); --
| |