Patch from Ingo Molnar 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 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 2003-03-17 02:59:29.000000000 -0800 +++ 25-akpm/kernel/sched.c 2003-03-17 02:59:29.000000000 -0800 @@ -73,6 +73,7 @@ #define INTERACTIVE_DELTA 2 #define MAX_SLEEP_AVG (10*HZ) #define STARVATION_LIMIT (10*HZ) +#define TIMESLICE_GRANULARITY (HZ/20 ?: 1) #define NODE_THRESHOLD 125 /* @@ -1259,6 +1260,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); _