Do budzenia procesu p służy funkcja wake_up_process(struct task_struct *p). Oto kod tej funkcji wycięty z pliku kernel/sched.c. Kod ten został zmieniony tak, że nie obsługuje SMP.
inline int wake_up_process(struct task_struct * p)
{
unsigned long flags;
int success = 0;
spin_lock_irqsave(&runqueue_lock, flags);
p->state = TASK_RUNNING;
if (task_on_runqueue(p))
goto out;
add_to_runqueue(p);
reschedule_idle(p);
success = 1;
out:
spin_unlock_irqrestore(&runqueue_lock, flags);
return success;
}
Wywoływana funkcja reschedule_idle(p) zdefiniowana w pliku kernel/sched.c sprawdza, czy budzony proces ma wyższy proces niż aktualny proces. Jeżeli tak, wywołuje z opóźnieniem funkcję schedule(), która będzie mogła wywłaszczyć działający proces.
Oto uproszczony kod (z wyciętą obsługą SMP) funckji reschedule_idle():
static void reschedule_idle(struct task_struct * p)
{
int this_cpu = smp_processor_id();
struct task_struct *tsk;
tsk = cpu_curr(this_cpu);
if (preemption_goodness(tsk, p, this_cpu) > 1)
tsk->need_resched = 1;
}