X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=kernel%2Fitimer.c;h=307c6a632ef6baa7ff0cec46273293d4cc84afc6;hb=703071b5b93d88d5acb0edd5b9dd86c69ad970f2;hp=680e6b70c8726f00d6a5d4dc3888fa5218b498fe;hpb=d71eecf3b8e893757cc3dec560c96a32ac090890;p=karo-tx-linux.git diff --git a/kernel/itimer.c b/kernel/itimer.c index 680e6b70c872..307c6a632ef6 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: