sched: fix buddie group latency
[safe/jmp/linux-2.6] / kernel / async.c
index f286e9f..608b32b 100644 (file)
@@ -90,12 +90,12 @@ extern int initcall_debug;
 static async_cookie_t  __lowest_in_progress(struct list_head *running)
 {
        struct async_entry *entry;
-       if (!list_empty(&async_pending)) {
-               entry = list_first_entry(&async_pending,
+       if (!list_empty(running)) {
+               entry = list_first_entry(running,
                        struct async_entry, list);
                return entry->cookie;
-       } else if (!list_empty(running)) {
-               entry = list_first_entry(running,
+       } else if (!list_empty(&async_pending)) {
+               entry = list_first_entry(&async_pending,
                        struct async_entry, list);
                return entry->cookie;
        } else {
@@ -104,6 +104,17 @@ static async_cookie_t  __lowest_in_progress(struct list_head *running)
        }
 
 }
+
+static async_cookie_t  lowest_in_progress(struct list_head *running)
+{
+       unsigned long flags;
+       async_cookie_t ret;
+
+       spin_lock_irqsave(&async_lock, flags);
+       ret = __lowest_in_progress(running);
+       spin_unlock_irqrestore(&async_lock, flags);
+       return ret;
+}
 /*
  * pick the first pending entry and run it
  */
@@ -229,7 +240,7 @@ void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *r
                starttime = ktime_get();
        }
 
-       wait_event(async_done, __lowest_in_progress(running) >= cookie);
+       wait_event(async_done, lowest_in_progress(running) >= cookie);
 
        if (initcall_debug && system_state == SYSTEM_BOOTING) {
                endtime = ktime_get();