mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
async: fix __lowest_in_progress()
At 37000 feet somewhere near Greenland I woke up from a half-sleep with the realisation that __lowest_in_progress() is buggy. After landing I checked and there were indeed 2 problems with it; this patch fixes both: * The order of the list checks was wrong * The locking was not correct. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d32ad102c6
commit
37a76bd4f1
1 changed files with 16 additions and 5 deletions
|
@ -90,12 +90,12 @@ extern int initcall_debug;
|
||||||
static async_cookie_t __lowest_in_progress(struct list_head *running)
|
static async_cookie_t __lowest_in_progress(struct list_head *running)
|
||||||
{
|
{
|
||||||
struct async_entry *entry;
|
struct async_entry *entry;
|
||||||
if (!list_empty(&async_pending)) {
|
if (!list_empty(running)) {
|
||||||
entry = list_first_entry(&async_pending,
|
entry = list_first_entry(running,
|
||||||
struct async_entry, list);
|
struct async_entry, list);
|
||||||
return entry->cookie;
|
return entry->cookie;
|
||||||
} else if (!list_empty(running)) {
|
} else if (!list_empty(&async_pending)) {
|
||||||
entry = list_first_entry(running,
|
entry = list_first_entry(&async_pending,
|
||||||
struct async_entry, list);
|
struct async_entry, list);
|
||||||
return entry->cookie;
|
return entry->cookie;
|
||||||
} else {
|
} 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
|
* 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();
|
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) {
|
if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
||||||
endtime = ktime_get();
|
endtime = ktime_get();
|
||||||
|
|
Loading…
Reference in a new issue