summary refs log tree commit diff
path: root/kernel/async.c
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2009-01-08 12:35:11 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-08 12:58:09 -0800
commit33b04b9308959af7febc1c111c766fa3fd8b1934 (patch)
tree3438b08d90973cee03f8e37e41c93c774aad5c85 /kernel/async.c
parent85da1fb545e5fe51c35e0576f71780cc557f4277 (diff)
downloadlinux-33b04b9308959af7febc1c111c766fa3fd8b1934.tar.gz
async: make async_synchronize_full() more serializing
turns out that there are real problems with allowing async
tasks that are scheduled from async tasks to run after
the async_synchronize_full() returns.

This patch makes the _full more strict and a complete
synchronization. Later I might need to add back a lighter
form of synchronization for other uses.. but not right now.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/async.c')
-rw-r--r--kernel/async.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/async.c b/kernel/async.c
index 97373380c9e7..64cc916299a5 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -206,7 +206,9 @@ EXPORT_SYMBOL_GPL(async_schedule_special);
 
 void async_synchronize_full(void)
 {
-	async_synchronize_cookie(next_cookie);
+	do {
+		async_synchronize_cookie(next_cookie);
+	} while (!list_empty(&async_running) || !list_empty(&async_pending));
 }
 EXPORT_SYMBOL_GPL(async_synchronize_full);