Commit 4aef9893 authored by Thomas Gleixner's avatar Thomas Gleixner

posix-timers: avoid wakeups when no timers are active

Waking the thread even when no timers are scheduled is useless.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 80e71499
......@@ -1499,6 +1499,21 @@ wait_to_die:
return 0;
}
static inline int __fastpath_timer_check(struct task_struct *tsk)
{
/* tsk == current, ensure it is safe to use ->signal/sighand */
if (unlikely(tsk->exit_state))
return 0;
if (!task_cputime_zero(&tsk->cputime_expires))
return 1;
if (!task_cputime_zero(&tsk->signal->cputime_expires))
return 1;
return 0;
}
void run_posix_cpu_timers(struct task_struct *tsk)
{
unsigned long cpu = smp_processor_id();
......@@ -1511,7 +1526,7 @@ void run_posix_cpu_timers(struct task_struct *tsk)
tasklist = per_cpu(posix_timer_tasklist, cpu);
/* check to see if we're already queued */
if (!tsk->posix_timer_list) {
if (!tsk->posix_timer_list && __fastpath_timer_check(tsk)) {
get_task_struct(tsk);
if (tasklist) {
tsk->posix_timer_list = tasklist;
......@@ -1523,9 +1538,9 @@ void run_posix_cpu_timers(struct task_struct *tsk)
tsk->posix_timer_list = tsk;
}
per_cpu(posix_timer_tasklist, cpu) = tsk;
wake_up_process(per_cpu(posix_timer_task, cpu));
}
/* XXX signal the thread somehow */
wake_up_process(per_cpu(posix_timer_task, cpu));
}
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment