summaryrefslogtreecommitdiffstats
path: root/include/linux/lockdep.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2007-10-18 23:39:55 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-19 11:53:38 -0700
commit4e6045f134784f4b158b3c0f7a282b04bd816887 (patch)
tree3304628f666c8524accd10f40da48cfba8b08608 /include/linux/lockdep.h
parentcf7b708c8d1d7a27736771bcf4c457b332b0f818 (diff)
downloadlinux-4e6045f134784f4b158b3c0f7a282b04bd816887.tar.gz
linux-4e6045f134784f4b158b3c0f7a282b04bd816887.tar.bz2
linux-4e6045f134784f4b158b3c0f7a282b04bd816887.zip
workqueue: debug flushing deadlocks with lockdep
In the following scenario: code path 1: my_function() -> lock(L1); ...; flush_workqueue(); ... code path 2: run_workqueue() -> my_work() -> ...; lock(L1); ... you can get a deadlock when my_work() is queued or running but my_function() has acquired L1 already. This patch adds a pseudo-lock to each workqueue to make lockdep warn about this scenario. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Acked-by: Oleg Nesterov <oleg@tv-sign.ru> Acked-by: Ingo Molnar <mingo@elte.hu> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/lockdep.h')
-rw-r--r--include/linux/lockdep.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index f6279f68a827..4c4d236ded18 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -276,6 +276,14 @@ extern void lockdep_init_map(struct lockdep_map *lock, const char *name,
(lock)->dep_map.key, sub)
/*
+ * To initialize a lockdep_map statically use this macro.
+ * Note that _name must not be NULL.
+ */
+#define STATIC_LOCKDEP_MAP_INIT(_name, _key) \
+ { .name = (_name), .key = (void *)(_key), }
+
+
+/*
* Acquire a lock.
*
* Values for "read":