All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] workqueue: Catch more locking problems with flush_work()
@ 2012-04-19  3:25 Stephen Boyd
  2012-04-19  3:25 ` [PATCH 2/2] ks8851: Fix mutex deadlock in ks8851_net_stop() Stephen Boyd
                   ` (2 more replies)
  0 siblings, 3 replies; 19+ messages in thread
From: Stephen Boyd @ 2012-04-19  3:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: Tejun Heo, netdev, Ben Dooks

If a workqueue is flushed but the work item is not scheduled to
run, lockdep checking will be circumvented. For example:

 static DEFINE_MUTEX(mutex);

 static void my_work(struct work_struct *w)
 {
         mutex_lock(&mutex);
         mutex_unlock(&mutex);
 }

 static DECLARE_WORK(work, my_work);

 static int __init start_test_module(void)
 {
         schedule_work(&work);
         return 0;
 }
 module_init(start_test_module);

 static void __exit stop_test_module(void)
 {
         mutex_lock(&mutex);
         flush_work(&work);
         mutex_unlock(&mutex);
 }
 module_exit(stop_test_module);

would only print a warning if the work item was actively running
when flush_work() was called. Otherwise flush_work() returns
early. In this trivial example nothing could go wrong, but if the
work item is schedule via an interrupt we could potentially have a
scenario where the work item is running just at the time flush_work()
is called. This could become a classic AB-BA locking problem.

Add a lockdep hint in flush_work() in the "work not running" case
so that we always catch this potential deadlock scenario.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 kernel/workqueue.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 66ec08d..eb800df 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2513,8 +2513,11 @@ bool flush_work(struct work_struct *work)
 		wait_for_completion(&barr.done);
 		destroy_work_on_stack(&barr.work);
 		return true;
-	} else
+	} else {
+		lock_map_acquire(&work->lockdep_map);
+		lock_map_release(&work->lockdep_map);
 		return false;
+	}
 }
 EXPORT_SYMBOL_GPL(flush_work);
 
-- 
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.


^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-04-23 18:08 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-19  3:25 [PATCH 1/2] workqueue: Catch more locking problems with flush_work() Stephen Boyd
2012-04-19  3:25 ` [PATCH 2/2] ks8851: Fix mutex deadlock in ks8851_net_stop() Stephen Boyd
2012-04-21 19:34   ` David Miller
2012-04-19  8:10 ` [PATCH 1/2] workqueue: Catch more locking problems with flush_work() Yong Zhang
2012-04-19 18:36   ` Stephen Boyd
2012-04-20  5:26     ` Yong Zhang
2012-04-20  6:01       ` Yong Zhang
2012-04-20  6:26         ` Stephen Boyd
2012-04-20  7:18           ` Yong Zhang
2012-04-20  8:18             ` Stephen Boyd
2012-04-20  8:32               ` Yong Zhang
2012-04-21  0:32                 ` Yong Zhang
2012-04-19 15:28 ` Tejun Heo
2012-04-19 18:10   ` Stephen Boyd
2012-04-20 17:35     ` Tejun Heo
2012-04-20 23:15       ` Stephen Boyd
2012-04-21  0:28       ` [PATCHv2] " Stephen Boyd
2012-04-21  0:34         ` Yong Zhang
2012-04-23 18:07         ` Tejun Heo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.