--- linux-2.6.4-s5/kernel/sched.c 2004-03-30 19:41:45.862173660 +1000 +++ linux-2.6.4-stair5.2/kernel/sched.c 2004-03-30 19:41:23.321737821 +1000 @@ -289,6 +289,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))) { /* * This ensures that tasks running for less than one tick are @@ -302,19 +304,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->time_slice = first_time_slice(p); p->timestamp = now; __activate_task(p, rq);