From: Thomas Gleixner The rearming code in signal.c has to read the time and can not rely on the timer->base->softirq time anymore, as it is not longer running in softirq context. Ensure, that the it_real_incr variable in the shared signal struct is set to zero, when setitimer disables the itimer. Otherwise it could happen that an inactive itimer gets rearmed by a SIGALRM. Signed-off-by: Thomas Gleixner Cc: Ingo Molnar Signed-off-by: Andrew Morton --- kernel/itimer.c | 9 ++++++--- kernel/signal.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff -puN kernel/itimer.c~high-res-timers-core-do-itimer-rearming-in-process-context-fix2 kernel/itimer.c --- a/kernel/itimer.c~high-res-timers-core-do-itimer-rearming-in-process-context-fix2 +++ a/kernel/itimer.c @@ -226,11 +226,14 @@ again: spin_unlock_irq(&tsk->sighand->siglock); goto again; } - tsk->signal->it_real_incr = - timeval_to_ktime(value->it_interval); expires = timeval_to_ktime(value->it_value); - if (expires.tv64 != 0) + if (expires.tv64 != 0) { + tsk->signal->it_real_incr = + timeval_to_ktime(value->it_interval); hrtimer_start(timer, expires, HRTIMER_MODE_REL); + } else + tsk->signal->it_real_incr.tv64 = 0; + spin_unlock_irq(&tsk->sighand->siglock); break; case ITIMER_VIRTUAL: diff -puN kernel/signal.c~high-res-timers-core-do-itimer-rearming-in-process-context-fix2 kernel/signal.c --- a/kernel/signal.c~high-res-timers-core-do-itimer-rearming-in-process-context-fix2 +++ a/kernel/signal.c @@ -477,7 +477,7 @@ int dequeue_signal(struct task_struct *t if (!hrtimer_active(tmr) && tsk->signal->it_real_incr.tv64 != 0) { - hrtimer_forward(tmr, hrtimer_cb_get_time(tmr), + hrtimer_forward(tmr, tmr->base->get_time(), tsk->signal->it_real_incr); hrtimer_restart(tmr); } _