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/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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue