aboutsummaryrefslogtreecommitdiffstats
path: root/include/sys/mutex.h
diff options
context:
space:
mode:
authorTim Chase <[email protected]>2015-03-20 14:03:26 -0500
committerBrian Behlendorf <[email protected]>2015-03-20 13:53:31 -0700
commit79a0056e137c9cc540eb9ff7327c85ac8d094e6c (patch)
tree51cf77e8b1c04e9de0ae008d6527dd757a0838bb /include/sys/mutex.h
parent6ab08667a44458f775da9f0ecceddbcea1275746 (diff)
Add mutex_enter_nested() which maps to mutex_lock_nested()
Also add support for the "name" parameter in mutex_init(). The name allows for better diagnostics, namely in /proc/lock_stats when lock debugging is enabled. Nested mutexes are necessary to support CONFIG_PROVE_LOCKING. ZoL can use mutex_enter_nested()'s "class" argument to to convey the locking hierarchy. Signed-off-by: Brian Behlendorf <[email protected]> Signed-off-by: Tim Chase <[email protected]> Closes #439
Diffstat (limited to 'include/sys/mutex.h')
-rw-r--r--include/sys/mutex.h19
1 files changed, 17 insertions, 2 deletions
diff --git a/include/sys/mutex.h b/include/sys/mutex.h
index 5e2b2508a..6355782c0 100644
--- a/include/sys/mutex.h
+++ b/include/sys/mutex.h
@@ -67,7 +67,7 @@ typedef struct {
(type == MUTEX_ADAPTIVE) || \
(type == MUTEX_FSTRANS)); \
\
- __mutex_init(MUTEX(mp), #mp, &__key); \
+ __mutex_init(MUTEX(mp), (name) ? (#name) : (#mp), &__key); \
spin_lock_init(&(mp)->m_lock); \
(mp)->m_type = type; \
(mp)->m_owner = NULL; \
@@ -95,7 +95,19 @@ typedef struct {
_rc_; \
})
-#define mutex_enter(mp) \
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+#define mutex_enter_nested(mp, subclass) \
+{ \
+ ASSERT3P(mutex_owner(mp), !=, current); \
+ mutex_lock_nested(MUTEX(mp), (subclass)); \
+ (mp)->m_owner = current; \
+ if ((mp)->m_type == MUTEX_FSTRANS) { \
+ (mp)->m_saved_flags = current->flags; \
+ current->flags |= PF_FSTRANS; \
+ } \
+}
+#else /* CONFIG_DEBUG_LOCK_ALLOC */
+#define mutex_enter_nested(mp, subclass) \
{ \
ASSERT3P(mutex_owner(mp), !=, current); \
mutex_lock(MUTEX(mp)); \
@@ -105,6 +117,9 @@ typedef struct {
current->flags |= PF_FSTRANS; \
} \
}
+#endif /* CONFIG_DEBUG_LOCK_ALLOC */
+
+#define mutex_enter(mp) mutex_enter_nested((mp), 0)
/*
* The reason for the spinlock: