From: Thomas Gleixner This resolves bugzilla bug#5617. The oldvalue of the timer was read after the timer was cancelled, so the remaining time was always zero. Signed-off-by: Thomas Gleixner Signed-off-by: Andrew Morton --- kernel/itimer.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff -puN kernel/itimer.c~hrtimers-fix-oldvalue-return-in-setitimer kernel/itimer.c --- devel/kernel/itimer.c~hrtimers-fix-oldvalue-return-in-setitimer 2006-01-19 20:11:22.000000000 -0800 +++ devel-akpm/kernel/itimer.c 2006-01-19 20:11:22.000000000 -0800 @@ -155,16 +155,16 @@ int do_setitimer(int which, struct itime again: spin_lock_irq(&tsk->sighand->siglock); timer = &tsk->signal->real_timer; - /* We are sharing ->siglock with it_real_fn() */ - if (hrtimer_try_to_cancel(timer) < 0) { - spin_unlock_irq(&tsk->sighand->siglock); - goto again; - } if (ovalue) { ovalue->it_value = itimer_get_remtime(timer); ovalue->it_interval = ktime_to_timeval(tsk->signal->it_real_incr); } + /* We are sharing ->siglock with it_real_fn() */ + if (hrtimer_try_to_cancel(timer) < 0) { + 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); _