From 79a0056e137c9cc540eb9ff7327c85ac8d094e6c Mon Sep 17 00:00:00 2001 From: Tim Chase Date: Fri, 20 Mar 2015 14:03:26 -0500 Subject: [PATCH] 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 Signed-off-by: Tim Chase Closes #439 --- include/sys/mutex.h | 19 +++++++++++++++++-- 1 file 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: