

Patch from Ingo Molnar <mingo@elte.hu>

the attached patch (against BK-curr) implements more finegrained timeslice
distribution, without changing the total balance of timeslices, by
recalculating the priority of CPU-bound tasks at a finer granularity, and by
roundrobining tasks.  Right now this new granularity is 50 msecs (the default
timeslice for default priority tasks is 100 msecs).

Could people, who can reproduce 'audio skips' kind of problems even with
BK-curr, give this patch a go?

	Ingo



 25-akpm/kernel/sched.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+)

diff -puN kernel/sched.c~sched-2.5.64-D3 kernel/sched.c
--- 25/kernel/sched.c~sched-2.5.64-D3	Mon Apr 21 17:26:52 2003
+++ 25-akpm/kernel/sched.c	Mon Apr 21 17:27:13 2003
@@ -74,6 +74,7 @@
 #define MAX_SLEEP_AVG		(10*HZ)
 #define STARVATION_LIMIT	(10*HZ)
 #define AGRESSIVE_IDLE_STEAL	1
+#define TIMESLICE_GRANULARITY (HZ/20 ?: 1)
 #define NODE_THRESHOLD		125
 
 /*
@@ -1481,6 +1482,27 @@ void scheduler_tick(int user_ticks, int 
 			enqueue_task(p, rq->expired);
 		} else
 			enqueue_task(p, rq->active);
+	} else {
+		/*
+		 * Prevent a too long timeslice allowing a task to monopolize
+		 * the CPU. We do this by splitting up the timeslice into
+		 * smaller pieces.
+		 *
+		 * Note: this does not mean the task's timeslices expire or
+		 * get lost in any way, they just might be preempted by
+		 * another task of equal priority. (one with higher
+		 * priority would have preempted this task already.) We
+		 * requeue this task to the end of the list on this priority
+		 * level, which is in essence a round-robin of tasks with
+		 * equal priority.
+		 */
+		if (!(p->time_slice % TIMESLICE_GRANULARITY) &&
+			       		(p->array == rq->active)) {
+			dequeue_task(p, rq->active);
+			set_tsk_need_resched(p);
+			p->prio = effective_prio(p);
+			enqueue_task(p, rq->active);
+		}
 	}
 out:
 	spin_unlock(&rq->lock);

_
