Index: linux-2.6.8.1-ck4/kernel/sched.c =================================================================== --- linux-2.6.8.1-ck4.orig/kernel/sched.c 2004-08-24 11:58:43.000000000 +1000 +++ linux-2.6.8.1-ck4/kernel/sched.c 2004-08-24 12:32:24.000000000 +1000 @@ -352,9 +352,10 @@ 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; if (p->flags & PF_FORKED || - (NS_TO_JIFFIES(p->runtime + sleep_time) < rr / 2 || - ((!sched_interactive || sched_compute || rr < 3 ) && + (NS_TO_JIFFIES(p->runtime + sleep_time) < minrun || + ((!sched_interactive || sched_compute) && NS_TO_JIFFIES(p->runtime + sleep_time) < rr))) { unsigned long ns_totalrun = p->totalrun + p->runtime; unsigned long total_run = NS_TO_JIFFIES(ns_totalrun); @@ -366,8 +367,10 @@ static void recalc_task_prio(task_t *p, unsigned int intervals = total_run / rr; p->totalrun = ns_totalrun; p->slice -= intervals * rr; - if (p->slice <= rr) + if (p->slice <= rr) { p->totalrun = 0; + dec_burst(p); + } } } else { if (!(p->flags & PF_UISLEEP))