From 40f974e09aedca8b77eb29bb9aef9ac0fdd09729 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Tue, 28 Jun 2005 20:44:47 -0700 Subject: [PATCH] --- yaml --- r: 3879 b: refs/heads/master c: f01b1b0baa454825ed95c28d2a6a71bbf4510836 h: refs/heads/master i: 3877: 49739a05b16002890645db91bc00ec21cb184219 3875: 44b4a4b2a7726d3c991103194077761ce23bb819 3871: 8fb640659cfdd4c23f252918c6a02b46c6614f5a v: v3 --- [refs] | 2 +- trunk/kernel/itimer.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 722e837c7bda..277cb77d44b8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b36bbb6c3d5244eaf52241ec69f79494137f2db0 +refs/heads/master: f01b1b0baa454825ed95c28d2a6a71bbf4510836 diff --git a/trunk/kernel/itimer.c b/trunk/kernel/itimer.c index 1dc988e0d2c7..a72cb0e5aa4b 100644 --- a/trunk/kernel/itimer.c +++ b/trunk/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));