diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-20 09:23:28 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-20 09:23:28 +0100 |
commit | 0ce1c383681370964e7f77dd44506aeb3a6ba657 (patch) | |
tree | 75aa590c636feed7d110c03eddb56cc518fc034c /kernel/async.c | |
parent | 0a2a18b721abc960fbcada406746877d22340a60 (diff) | |
parent | 1de9e8e70f5acc441550ca75433563d91b269bbe (diff) |
Merge commit 'v2.6.29-rc2' into x86/mm
Diffstat (limited to 'kernel/async.c')
-rw-r--r-- | kernel/async.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/kernel/async.c b/kernel/async.c index f286e9f2b73..608b32b4281 100644 --- a/kernel/async.c +++ b/kernel/async.c @@ -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(); |