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 <behlendorf1@llnl.gov>
Signed-off-by: Tim Chase <tim@chase2k.com>
Closes #439
This commit is contained in:
Tim Chase 2015-03-20 14:03:26 -05:00 committed by Brian Behlendorf
parent 6ab08667a4
commit 79a0056e13

View File

@ -67,7 +67,7 @@ typedef struct {
(type == MUTEX_ADAPTIVE) || \ (type == MUTEX_ADAPTIVE) || \
(type == MUTEX_FSTRANS)); \ (type == MUTEX_FSTRANS)); \
\ \
__mutex_init(MUTEX(mp), #mp, &__key); \ __mutex_init(MUTEX(mp), (name) ? (#name) : (#mp), &__key); \
spin_lock_init(&(mp)->m_lock); \ spin_lock_init(&(mp)->m_lock); \
(mp)->m_type = type; \ (mp)->m_type = type; \
(mp)->m_owner = NULL; \ (mp)->m_owner = NULL; \
@ -95,7 +95,19 @@ typedef struct {
_rc_; \ _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); \ ASSERT3P(mutex_owner(mp), !=, current); \
mutex_lock(MUTEX(mp)); \ mutex_lock(MUTEX(mp)); \
@ -105,6 +117,9 @@ typedef struct {
current->flags |= PF_FSTRANS; \ current->flags |= PF_FSTRANS; \
} \ } \
} }
#endif /* CONFIG_DEBUG_LOCK_ALLOC */
#define mutex_enter(mp) mutex_enter_nested((mp), 0)
/* /*
* The reason for the spinlock: * The reason for the spinlock: