--- linux-2.6.4-ck2pre/kernel/sched.c 2004-03-27 01:56:56.000000000 +1100 +++ linux-2.6.4-ck2/kernel/sched.c 2004-03-29 20:57:27.537907732 +1000 @@ -209,7 +209,14 @@ static inline void dequeue_task(struct t static inline void enqueue_task(struct task_struct *p, runqueue_t *rq) { prio_array_t* array = &rq->array; - list_add_tail(&p->run_list, array->queue + p->prio); + if (p->time_slice < RR_INTERVAL) { + // has been preempted, put at head of list. + list_add(&p->run_list, array->queue + p->prio); + if (p->time_slice < 2) + // make sure we run at least one tick if requeued. + p->time_slice = 2; + } else + list_add_tail(&p->run_list, array->queue + p->prio); __set_bit(p->prio, array->bitmap); array->nr_active++; p->array = array;