60 lines
1.7 KiB
Diff
60 lines
1.7 KiB
Diff
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Fri, 3 Jul 2009 08:44:44 -0500
|
|
Subject: posix-timers: Avoid wakeups when no timers are active
|
|
|
|
Waking the thread even when no timers are scheduled is useless.
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
|
|
---
|
|
kernel/posix-cpu-timers.c | 21 ++++++++++++++++++---
|
|
1 file changed, 18 insertions(+), 3 deletions(-)
|
|
|
|
Index: linux-3.2/kernel/posix-cpu-timers.c
|
|
===================================================================
|
|
--- linux-3.2.orig/kernel/posix-cpu-timers.c
|
|
+++ linux-3.2/kernel/posix-cpu-timers.c
|
|
@@ -1436,6 +1436,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();
|
|
@@ -1448,7 +1463,7 @@ void run_posix_cpu_timers(struct task_st
|
|
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;
|
|
@@ -1460,9 +1475,9 @@ void run_posix_cpu_timers(struct task_st
|
|
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));
|
|
}
|
|
|
|
/*
|