Index: linux-2.6.8.1-ck6/kernel/sched.c =================================================================== --- linux-2.6.8.1-ck6.orig/kernel/sched.c 2004-09-04 01:14:39.000000000 +1000 +++ linux-2.6.8.1-ck6/kernel/sched.c 2004-09-06 23:08:45.233198229 +1000 @@ -352,7 +352,8 @@ static void recalc_task_prio(task_t *p, { unsigned long sleep_time = now - p->timestamp; unsigned int rr = rr_interval(p); - unsigned int minrun = rr * (p->burst + 1) / (burst(p) + 1) ? : 1; + unsigned int best_burst = burst(p); + unsigned int minrun = rr * (p->burst + 1) / (best_burst + 1) ? : 1; if (p->flags & PF_FORKED || (NS_TO_JIFFIES(p->runtime + sleep_time) < minrun || ((!sched_interactive || sched_compute) && @@ -365,15 +366,22 @@ static void recalc_task_prio(task_t *p, dec_burst(p); } else { unsigned int intervals = total_run / rr; + unsigned int remainder; p->totalrun = ns_totalrun; p->slice -= intervals * rr; if (p->slice <= rr) { p->totalrun = 0; dec_burst(p); + } else { + remainder = p->slice % rr; + if (remainder) + p->time_slice = remainder; } } } else { - if (!(p->flags & PF_UISLEEP)) + if (NS_TO_JIFFIES(p->totalrun) > (best_burst - p->burst) * rr) + dec_burst(p); + else if (!(p->flags & PF_UISLEEP)) inc_burst(p); p->runtime = 0; p->totalrun = 0; @@ -395,10 +403,10 @@ static void activate_task(task_t *p, run } #endif p->slice = slice(p); + p->time_slice = rr_interval(p); recalc_task_prio(p, now); p->prio = effective_prio(p); p->flags &= ~PF_UISLEEP; - p->time_slice = rr_interval(p); if (batch_task(p)) p->time_slice = p->slice; p->timestamp = now;