--- linux-2.5.69/kernel/sched.c.org Wed May 21 07:45:00 2003 +++ linux-2.5.69/kernel/sched.c Wed May 21 08:27:09 2003 @@ -1264,7 +1264,7 @@ task_t *prev, *next; runqueue_t *rq; prio_array_t *array; - struct list_head *queue; + struct list_head *head, *curr; int idx; /* @@ -1331,8 +1331,22 @@ } idx = sched_find_first_bit(array->bitmap); - queue = array->queue + idx; - next = list_entry(queue->next, task_t, run_list); +next_queue: + head = array->queue + idx; + curr = head->next; + next = list_entry(curr, task_t, run_list); + curr = curr->next; + /* + * If we are about to wrap back to the head of the queue, + * give a lower priority queue a chance to sneak one in. + */ + if (idx == prev->prio && curr == head && array->nr_active > 1) { + int tmp = find_next_bit(array->bitmap, MAX_PRIO, ++idx); + if (tmp < MAX_PRIO) { + idx = tmp; + goto next_queue; + } + } switch_tasks: prefetch(next);