From 4f86a887d88ef2d28fb14a020f91e0cd8757ed21 Mon Sep 17 00:00:00 2001 From: behlendo Date: Tue, 6 May 2008 23:19:27 +0000 Subject: [PATCH] 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 --- include/sys/mutex.h | 5 ++--- 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 #include -//#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); }