diff options
author | Tejun Heo <tj@kernel.org> | 2011-11-21 15:32:23 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2011-11-21 15:32:23 -0500 |
commit | 8a32c441c1609f80e55df75422324a1151208f40 (patch) | |
tree | 73884b06cc2db3ea155af9a88815bb5105a4473e /fs/fs-writeback.c | |
parent | a0acae0e886d44bd5ce6d2f173c1ace0fcf0d9f6 (diff) |
freezer: implement and use kthread_freezable_should_stop()
Writeback and thinkpad_acpi have been using thaw_process() to prevent
deadlock between the freezer and kthread_stop(); unfortunately, this
is inherently racy - nothing prevents freezing from happening between
thaw_process() and kthread_stop().
This patch implements kthread_freezable_should_stop() which enters
refrigerator if necessary but is guaranteed to return if
kthread_stop() is invoked. Both thaw_process() users are converted to
use the new function.
Note that this deadlock condition exists for many of freezable
kthreads. They need to be converted to use the new should_stop or
freezable workqueue.
Tested with synthetic test case.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 73c3992b2bb4..271fde50f0ee 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -947,7 +947,7 @@ int bdi_writeback_thread(void *data) | |||
947 | 947 | ||
948 | trace_writeback_thread_start(bdi); | 948 | trace_writeback_thread_start(bdi); |
949 | 949 | ||
950 | while (!kthread_should_stop()) { | 950 | while (!kthread_freezable_should_stop(NULL)) { |
951 | /* | 951 | /* |
952 | * Remove own delayed wake-up timer, since we are already awake | 952 | * Remove own delayed wake-up timer, since we are already awake |
953 | * and we'll take care of the preriodic write-back. | 953 | * and we'll take care of the preriodic write-back. |
@@ -977,8 +977,6 @@ int bdi_writeback_thread(void *data) | |||
977 | */ | 977 | */ |
978 | schedule(); | 978 | schedule(); |
979 | } | 979 | } |
980 | |||
981 | try_to_freeze(); | ||
982 | } | 980 | } |
983 | 981 | ||
984 | /* Flush any work that raced with us exiting */ | 982 | /* Flush any work that raced with us exiting */ |