Index: linux-2.6.9-rc4/kernel/sched.c
===================================================================
--- linux-2.6.9-rc4.orig/kernel/sched.c	2004-10-14 09:12:56.484834800 +1000
+++ linux-2.6.9-rc4/kernel/sched.c	2004-10-14 09:42:12.243918848 +1000
@@ -698,6 +698,16 @@ static unsigned int slice(task_t *p)
  */
 int sched_interactive = 1;
 
+static unsigned int rr_interval(task_t * p)
+{
+	unsigned int rr_interval = RR_INTERVAL();
+	int nice = TASK_NICE(p);
+
+	if (nice < 0 && !rt_task(p))
+		rr_interval += -(nice);
+	return rr_interval;
+}
+
 /*
  * effective_prio - dynamic priority dependent on burst.
  * The priority normally decreases by one each RR_INTERVAL.
@@ -708,23 +718,24 @@ static int effective_prio(task_t *p)
 {
 	int prio;
 	unsigned int full_slice, used_slice, first_slice;
-	unsigned int best_burst;
+	unsigned int best_burst, rr;
 	if (rt_task(p))
 		return p->prio;
 
 	best_burst = burst(p);
 	full_slice = slice(p);
+	rr = rr_interval(p);
 	used_slice = full_slice - p->slice;
 	if (p->burst > best_burst)
 		p->burst = best_burst;
-	first_slice = RR_INTERVAL();
+	first_slice = rr;
 	if (sched_interactive && !sched_compute && p->mm)
 		first_slice *= (p->burst + 1);
 	prio = MAX_PRIO - 1 - best_burst;
 
 	if (used_slice < first_slice)
 		return prio;
-	prio += 1 + (used_slice - first_slice) / RR_INTERVAL();
+	prio += 1 + (used_slice - first_slice) / rr;
 	if (prio > MAX_PRIO - 1)
 		prio = MAX_PRIO - 1;
 	return prio;
@@ -738,7 +749,7 @@ static int effective_prio(task_t *p)
 static void recalc_task_prio(task_t *p, unsigned long long now)
 {
 	unsigned long sleep_time = ns_diff(now, p->timestamp);
-	unsigned int rr = RR_INTERVAL();
+	unsigned int rr = rr_interval(p);
 	unsigned int best_burst = burst(p);
 	unsigned int minrun = rr * (p->burst + 1) / (best_burst + 1) ? : 1;
 	if (p->flags & PF_FORKED ||
@@ -793,7 +804,7 @@ static void activate_task(task_t *p, run
 	}
 #endif
 	p->slice = slice(p);
-	p->time_slice = RR_INTERVAL();
+	p->time_slice = rr_interval(p);
 	recalc_task_prio(p, now);
 	p->flags &= ~PF_UISLEEP;
 	p->prio = effective_prio(p);
@@ -2176,7 +2187,7 @@ static void time_slice_expired(task_t *p
 	set_tsk_need_resched(p);
 	dequeue_task(p, rq);
 	p->prio = effective_prio(p);
-	p->time_slice = RR_INTERVAL();
+	p->time_slice = rr_interval(p);
 	enqueue_task(p, rq);
 }
 
@@ -3238,7 +3249,7 @@ asmlinkage long sys_sched_yield(void)
 	schedstat_inc(rq, yld_cnt);
 	dequeue_task(current, rq);
 	current->slice = slice(current);
-	current->time_slice = RR_INTERVAL();
+	current->time_slice = rr_interval(current);
 	if (likely(!rt_task(current))) {
 		current->flags |= PF_YIELDED;
 		current->prio = MAX_PRIO - 1;
Index: linux-2.6.9-rc4/kernel/workqueue.c
===================================================================
--- linux-2.6.9-rc4.orig/kernel/workqueue.c	2004-10-11 16:16:01.000000000 +1000
+++ linux-2.6.9-rc4/kernel/workqueue.c	2004-10-14 09:25:20.278760936 +1000
@@ -188,7 +188,7 @@ static int worker_thread(void *__cwq)
 
 	current->flags |= PF_NOFREEZE;
 
-	set_user_nice(current, -10);
+	set_user_nice(current, -5);
 
 	/* Block and flush all signals */
 	sigfillset(&blocked);
