diff options
author | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-05-06 23:19:27 +0000 |
---|---|---|
committer | behlendo <behlendo@7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c> | 2008-05-06 23:19:27 +0000 |
commit | 4f86a887d88ef2d28fb14a020f91e0cd8757ed21 (patch) | |
tree | a365bd6f0742c9ac819ae6f12baf76dfa4db37d7 | |
parent | e8b31e84825d14d98930f165707687fad961b88a (diff) |
Remaining issues fixed after reenabled mutex debugging.
- Ensure the mutex_stats_sem and mutex_stats_list are initialized
- Only spin if you have to in mutex_init
git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@97 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
-rw-r--r-- | include/sys/mutex.h | 5 | ||||
-rw-r--r-- | modules/spl/spl-mutex.c | 13 |
2 files changed, 13 insertions, 5 deletions
diff --git a/include/sys/mutex.h b/include/sys/mutex.h index dc78edbbc..23c23409b 100644 --- a/include/sys/mutex.h +++ b/include/sys/mutex.h @@ -10,8 +10,7 @@ extern "C" { #include <sys/types.h> #include <sys/kmem.h> -//#define DEBUG_MUTEX -#undef DEBUG_MUTEX +#define DEBUG_MUTEX #define MUTEX_DEFAULT 0 #define MUTEX_SPIN 1 @@ -45,7 +44,7 @@ extern int mutex_spin_max; #ifdef DEBUG_MUTEX extern int mutex_stats[MUTEX_STATS_SIZE]; -extern struct mutex mutex_stats_lock; +extern struct rw_semaphore mutex_stats_sem; extern struct list_head mutex_stats_list; #define MUTEX_STAT_INC(stats, stat) ((stats)[stat]++) #else diff --git a/modules/spl/spl-mutex.c b/modules/spl/spl-mutex.c index 5949283e6..c6d83eb21 100644 --- a/modules/spl/spl-mutex.c +++ b/modules/spl/spl-mutex.c @@ -30,7 +30,7 @@ int mutex_spin_max = 100; #ifdef DEBUG_MUTEX int mutex_stats[MUTEX_STATS_SIZE] = { 0 }; struct rw_semaphore mutex_stats_sem; -LIST_HEAD(mutex_stats_list); +struct list_head mutex_stats_list; #endif void @@ -91,8 +91,13 @@ __spl_mutex_init(kmutex_t *mp, char *name, int type, void *ibc) /* We may be called when there is a non-zero preempt_count or * interrupts are disabled is which case we must not sleep. */ - while (!down_write_trylock(&mutex_stats_sem)); + if (flags == KM_SLEEP) + down_write(&mutex_stats_sem); + else + while (!down_write_trylock(&mutex_stats_sem)); + list_add_tail(&mp->km_list, &mutex_stats_list); + up_write(&mutex_stats_sem); #endif } @@ -255,6 +260,10 @@ int spl_mutex_init(void) { ENTRY; +#ifdef DEBUG_MUTEX + init_rwsem(&mutex_stats_sem); + INIT_LIST_HEAD(&mutex_stats_list); +#endif RETURN(0); } |