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
This commit is contained in:
behlendo 2008-05-06 23:19:27 +00:00
parent e8b31e8482
commit 4f86a887d8
2 changed files with 13 additions and 5 deletions

View File

@ -10,8 +10,7 @@ extern "C" {
#include <sys/types.h> #include <sys/types.h>
#include <sys/kmem.h> #include <sys/kmem.h>
//#define DEBUG_MUTEX #define DEBUG_MUTEX
#undef DEBUG_MUTEX
#define MUTEX_DEFAULT 0 #define MUTEX_DEFAULT 0
#define MUTEX_SPIN 1 #define MUTEX_SPIN 1
@ -45,7 +44,7 @@ extern int mutex_spin_max;
#ifdef DEBUG_MUTEX #ifdef DEBUG_MUTEX
extern int mutex_stats[MUTEX_STATS_SIZE]; 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; extern struct list_head mutex_stats_list;
#define MUTEX_STAT_INC(stats, stat) ((stats)[stat]++) #define MUTEX_STAT_INC(stats, stat) ((stats)[stat]++)
#else #else

View File

@ -30,7 +30,7 @@ int mutex_spin_max = 100;
#ifdef DEBUG_MUTEX #ifdef DEBUG_MUTEX
int mutex_stats[MUTEX_STATS_SIZE] = { 0 }; int mutex_stats[MUTEX_STATS_SIZE] = { 0 };
struct rw_semaphore mutex_stats_sem; struct rw_semaphore mutex_stats_sem;
LIST_HEAD(mutex_stats_list); struct list_head mutex_stats_list;
#endif #endif
void 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 /* We may be called when there is a non-zero preempt_count or
* interrupts are disabled is which case we must not sleep. * interrupts are disabled is which case we must not sleep.
*/ */
if (flags == KM_SLEEP)
down_write(&mutex_stats_sem);
else
while (!down_write_trylock(&mutex_stats_sem)); while (!down_write_trylock(&mutex_stats_sem));
list_add_tail(&mp->km_list, &mutex_stats_list); list_add_tail(&mp->km_list, &mutex_stats_list);
up_write(&mutex_stats_sem); up_write(&mutex_stats_sem);
#endif #endif
} }
@ -255,6 +260,10 @@ int
spl_mutex_init(void) spl_mutex_init(void)
{ {
ENTRY; ENTRY;
#ifdef DEBUG_MUTEX
init_rwsem(&mutex_stats_sem);
INIT_LIST_HEAD(&mutex_stats_list);
#endif
RETURN(0); RETURN(0);
} }