--- linux-2.6.4/kernel/sched.c 2004-03-30 19:20:15.176621112 +1000 +++ linux-2.6.4-ck2/kernel/sched.c 2004-03-30 19:14:19.000000000 +1000 @@ -293,6 +293,8 @@ static inline void activate_task(task_t unsigned long long now = sched_clock(); unsigned long run_time, sleep_time; unsigned int full_slice = slice(p); + + p->slice = full_slice; if (likely(!rt_task(p) && !batch_task(p))) { /* * This ensures that tasks running for less than one tick are @@ -306,21 +308,17 @@ static inline void activate_task(task_t run_time = NS_TO_JIFFIES(p->runtime); if (unlikely(run_time >= full_slice)) { - p->slice = full_slice; + if (p->deadline) + p->deadline--; p->runtime = 0; - } else if (run_time) { - p->slice = full_slice - run_time; - p->prio = apparent_prio(p); } else { - p->slice = full_slice; - if (p->deadline < deadline(p)) + if (run_time) + p->slice -= run_time; + else if (p->deadline < deadline(p)) p->deadline++; - p->prio = effective_prio(p); } - } else { - p->slice = full_slice; - p->prio = effective_prio(p); } + p->prio = effective_prio(p); p->time_slice = first_time_slice(p); p->timestamp = now; __activate_task(p, rq);