| From d816c531fa641629410e3b63270efd37f777ebe9 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 3 Jul 2009 08:44:44 -0500 |
| Subject: [PATCH] posix-timers: avoid wakeups when no timers are active |
| |
| commit 4aef9893f48ad8905a35b2fbe2cc78662c0fa441 in tip. |
| |
| Waking the thread even when no timers are scheduled is useless. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| |
| diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c |
| index c35bfa3..3dd9218 100644 |
| --- a/kernel/posix-cpu-timers.c |
| +++ b/kernel/posix-cpu-timers.c |
| @@ -1509,6 +1509,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(); |
| @@ -1521,7 +1536,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; |
| @@ -1533,9 +1548,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)); |
| } |
| |
| /* |
| -- |
| 1.7.1.1 |
| |