diff options
author | Tim Chase <[email protected]> | 2015-03-20 14:03:26 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-03-20 13:53:31 -0700 |
commit | 79a0056e137c9cc540eb9ff7327c85ac8d094e6c (patch) | |
tree | 51cf77e8b1c04e9de0ae008d6527dd757a0838bb /include | |
parent | 6ab08667a44458f775da9f0ecceddbcea1275746 (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')
-rw-r--r-- | include/sys/mutex.h | 19 |
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: |