Index: linux-2.6.10-ck7/kernel/sched.c
===================================================================
--- linux-2.6.10-ck7.orig/kernel/sched.c	2005-03-01 21:38:48.000000000 +1100
+++ linux-2.6.10-ck7/kernel/sched.c	2005-03-01 21:38:48.000000000 +1100
@@ -655,12 +655,14 @@ static void continue_slice(task_t *p)
  * or have just forked a thread/process and make them continue their old
  * slice instead of starting a new one at high priority.
  */
-static void recalc_task_prio(task_t *p, unsigned long long now)
+static inline void recalc_task_prio(task_t *p, unsigned long long now,
+	unsigned long rq_load)
 {
-	unsigned long sleep_time = ns_diff(now, p->timestamp);
+	unsigned long sleep_time = ns_diff(now, p->timestamp) /
+		(rq_load + 1);
 
 	p->totalrun += p->runtime;
-	if (NS_TO_JIFFIES(p->totalrun) >= p->slice - 1 &&
+	if (NS_TO_JIFFIES(p->totalrun) >= p->slice &&
 		NS_TO_JIFFIES(sleep_time) < p->slice) {
 			p->flags &= ~PF_FORKED;
 			dec_burst(p);
@@ -712,7 +714,7 @@ static void activate_task(task_t *p, run
 #endif
 	p->slice = slice(p);
 	p->time_slice = rr_interval(p);
-	recalc_task_prio(p, now);
+	recalc_task_prio(p, now, rq->nr_running);
 	p->flags &= ~PF_UISLEEP;
 	p->prio = effective_prio(p);
 	p->timestamp = now;
