Index: linux-2.6.8-rc3-mm1/kernel/sched.c =================================================================== --- linux-2.6.8-rc3-mm1.orig/kernel/sched.c 2004-08-08 00:08:12.000000000 +1000 +++ linux-2.6.8-rc3-mm1/kernel/sched.c 2004-08-08 19:21:08.000000000 +1000 @@ -732,20 +732,23 @@ static void recalc_task_prio(task_t *p, unsigned long long now) { unsigned long sleep_time = now - p->timestamp; - unsigned long ns_totalrun = p->totalrun + p->runtime; - unsigned long total_run = NS_TO_JIFFIES(ns_totalrun); + unsigned int rr = rr_interval(p); if (p->flags & PF_FORKED || - (NS_TO_JIFFIES(p->runtime + sleep_time) < - rr_interval(p) / 2 || ((!sched_interactive || - sched_compute) && NS_TO_JIFFIES(p->runtime + sleep_time) < - rr_interval(p)))) { + (NS_TO_JIFFIES(p->runtime + sleep_time) < rr / 2 || + ((!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); p->flags &= ~PF_FORKED; if (p->slice - total_run < 1) { p->totalrun = 0; dec_burst(p); } else { + unsigned int intervals = total_run / rr; p->totalrun = ns_totalrun; - p->slice -= total_run; + p->slice -= intervals * rr; + if (p->slice <= rr) + p->totalrun = 0; } } else { if (!(p->flags & PF_UISLEEP))