X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=kernel%2Fitimer.c;h=a72cb0e5aa4b5d6f94764e128e4f376f0dc6591e;hb=e9dd2561793c05d70c9df1bc16a2dde6f23388df;hp=1dc988e0d2c77e962063c776b7b035800f51b9be;hpb=b7e4e85337060354f8b860cc38066725559313a4;p=linux-2.6 diff --git a/kernel/itimer.c b/kernel/itimer.c index 1dc988e0d2..a72cb0e5aa 100644 --- a/kernel/itimer.c +++ b/kernel/itimer.c @@ -153,11 +153,15 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) switch (which) { case ITIMER_REAL: +again: spin_lock_irq(&tsk->sighand->siglock); interval = tsk->signal->it_real_incr; val = it_real_value(tsk->signal); - if (val) - del_timer_sync(&tsk->signal->real_timer); + /* We are sharing ->siglock with it_real_fn() */ + if (try_to_del_timer_sync(&tsk->signal->real_timer) < 0) { + spin_unlock_irq(&tsk->sighand->siglock); + goto again; + } tsk->signal->it_real_incr = timeval_to_jiffies(&value->it_interval); it_real_arm(tsk, timeval_to_jiffies(&value->it_value));