X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=kernel%2Fitimer.c;h=307c6a632ef6baa7ff0cec46273293d4cc84afc6;hb=e1251d01452d2f8e91c898b3828444b279cef047;hp=680e6b70c8726f00d6a5d4dc3888fa5218b498fe;hpb=ace48471736a4b00753c74633f430c4a3a7d89cb;p=powerpc.git diff --git a/kernel/itimer.c b/kernel/itimer.c index 680e6b70c8..307c6a632e 100644 --- a/kernel/itimer.c +++ b/kernel/itimer.c @@ -128,18 +128,13 @@ asmlinkage long sys_getitimer(int which, struct itimerval __user *value) /* * The timer is automagically restarted, when interval != 0 */ -int it_real_fn(void *data) +enum hrtimer_restart it_real_fn(struct hrtimer *timer) { - struct task_struct *tsk = (struct task_struct *) data; + struct signal_struct *sig = + container_of(timer, struct signal_struct, real_timer); - send_group_sig_info(SIGALRM, SEND_SIG_PRIV, tsk); + send_group_sig_info(SIGALRM, SEND_SIG_PRIV, sig->tsk); - if (tsk->signal->it_real_incr.tv64 != 0) { - hrtimer_forward(&tsk->signal->real_timer, - tsk->signal->it_real_incr); - - return HRTIMER_RESTART; - } return HRTIMER_NORESTART; } @@ -231,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) - hrtimer_start(timer, expires, HRTIMER_REL); + 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: