From 44c3c034122cd698fd6dc4288327e406cd4b3e1c Mon Sep 17 00:00:00 2001 From: Yongcong Du Date: Sun, 13 May 2012 21:43:08 +0800 Subject: [PATCH] scheduler: Don't setup the quantumTimer for idle thread Let's say the timer is waken up when its hook is called. This patch reduces ~41% wakeups during idle Signed-off-by: Fredrik Holmqvist --- src/system/kernel/scheduler/scheduler_affine.cpp | 5 +++-- src/system/kernel/scheduler/scheduler_simple.cpp | 5 +++-- src/system/kernel/scheduler/scheduler_simple_smp.cpp | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler_affine.cpp b/src/system/kernel/scheduler/scheduler_affine.cpp index 721b9af0dc..b50480390f 100644 --- a/src/system/kernel/scheduler/scheduler_affine.cpp +++ b/src/system/kernel/scheduler/scheduler_affine.cpp @@ -500,8 +500,9 @@ affine_reschedule(void) && nextThread->priority < B_NORMAL_PRIORITY) quantum = kMaxThreadQuantum; - add_timer(quantumTimer, &reschedule_event, quantum, - B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); + if (!thread_is_idle_thread(nextThread)) + add_timer(quantumTimer, &reschedule_event, quantum, + B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) scheduler_switch_thread(oldThread, nextThread); diff --git a/src/system/kernel/scheduler/scheduler_simple.cpp b/src/system/kernel/scheduler/scheduler_simple.cpp index 2b1acc99c3..42e69199a1 100644 --- a/src/system/kernel/scheduler/scheduler_simple.cpp +++ b/src/system/kernel/scheduler/scheduler_simple.cpp @@ -324,8 +324,9 @@ simple_reschedule(void) cancel_timer(quantumTimer); oldThread->cpu->preempted = 0; - add_timer(quantumTimer, &reschedule_event, quantum, - B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); + if (!thread_is_idle_thread(nextThread)) + add_timer(quantumTimer, &reschedule_event, quantum, + B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) scheduler_switch_thread(oldThread, nextThread); diff --git a/src/system/kernel/scheduler/scheduler_simple_smp.cpp b/src/system/kernel/scheduler/scheduler_simple_smp.cpp index 721860afac..ff3e3d2ac1 100644 --- a/src/system/kernel/scheduler/scheduler_simple_smp.cpp +++ b/src/system/kernel/scheduler/scheduler_simple_smp.cpp @@ -423,8 +423,9 @@ reschedule(void) cancel_timer(quantumTimer); oldThread->cpu->preempted = 0; - add_timer(quantumTimer, &reschedule_event, quantum, - B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); + if (!thread_is_idle_thread(nextThread)) + add_timer(quantumTimer, &reschedule_event, quantum, + B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) scheduler_switch_thread(oldThread, nextThread);