[Linux-ia64] Re: web page on O(1) scheduler

Mike Galbraith
2003-05-21T09:30:39Z

[-- Attachment #1: Type: text/plain, Size: 210 bytes --]

At 11:26 AM 5/21/2003 +0200, Mike Galbraith wrote:

>Try the attached overly simplistic (KISS:) diff, and watch your starvation
>issues be very noticably reduced.

Ahem ;-)

Now even attached.

-Mike

[-- Attachment #2: xx.diff --]
[-- Type: application/octet-stream, Size: 929 bytes --]

--- 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);