summaryrefslogtreecommitdiffstats
path: root/kernel/async.c
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2009-01-08 21:35:11 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-08 21:58:09 +0100
commit33b04b9308959af7febc1c111c766fa3fd8b1934 (patch)
tree3438b08d90973cee03f8e37e41c93c774aad5c85 /kernel/async.c
parentMerge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/pow... (diff)
downloadlinux-33b04b9308959af7febc1c111c766fa3fd8b1934.tar.xz
linux-33b04b9308959af7febc1c111c766fa3fd8b1934.zip
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);