diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2010-02-12 03:39:21 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-04-30 02:57:25 -0400 |
commit | eef6a7d5c2f38adadab8240fabf43730fe796482 (patch) | |
tree | 4ee96327e3f7880bea51bd4e05b37193915c00ae /kernel | |
parent | 47dd5be2d6a82b8153e059a1d09eb3879d485bfd (diff) |
workqueue: warn about flush_scheduled_work()
This patch (as1319) adds kerneldoc and a pointed warning to
flush_scheduled_work().
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/workqueue.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 5bfb213984b2..0225fea89340 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -845,6 +845,30 @@ int schedule_on_each_cpu(work_func_t func) | |||
845 | return 0; | 845 | return 0; |
846 | } | 846 | } |
847 | 847 | ||
848 | /** | ||
849 | * flush_scheduled_work - ensure that any scheduled work has run to completion. | ||
850 | * | ||
851 | * Forces execution of the kernel-global workqueue and blocks until its | ||
852 | * completion. | ||
853 | * | ||
854 | * Think twice before calling this function! It's very easy to get into | ||
855 | * trouble if you don't take great care. Either of the following situations | ||
856 | * will lead to deadlock: | ||
857 | * | ||
858 | * One of the work items currently on the workqueue needs to acquire | ||
859 | * a lock held by your code or its caller. | ||
860 | * | ||
861 | * Your code is running in the context of a work routine. | ||
862 | * | ||
863 | * They will be detected by lockdep when they occur, but the first might not | ||
864 | * occur very often. It depends on what work items are on the workqueue and | ||
865 | * what locks they need, which you have no control over. | ||
866 | * | ||
867 | * In most situations flushing the entire workqueue is overkill; you merely | ||
868 | * need to know that a particular work item isn't queued and isn't running. | ||
869 | * In such cases you should use cancel_delayed_work_sync() or | ||
870 | * cancel_work_sync() instead. | ||
871 | */ | ||
848 | void flush_scheduled_work(void) | 872 | void flush_scheduled_work(void) |
849 | { | 873 | { |
850 | flush_workqueue(keventd_wq); | 874 | flush_workqueue(keventd_wq); |