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:
parent
e8b31e8482
commit
4f86a887d8
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue