switch the UVMHIST counters from mutexes to atomic ops

to avoid a bad interaction with DIAGNOSTIC.
This commit is contained in:
chs 2010-07-07 01:08:51 +00:00
parent 3bb7b36948
commit 4c14d1923f

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_stat.h,v 1.46 2010/02/06 12:10:59 uebayasi Exp $ */ /* $NetBSD: uvm_stat.h,v 1.47 2010/07/07 01:08:51 chs Exp $ */
/* /*
* *
@ -70,11 +70,9 @@ struct uvm_history {
const char *name; /* name of this history */ const char *name; /* name of this history */
size_t namelen; /* length of name, not including null */ size_t namelen; /* length of name, not including null */
LIST_ENTRY(uvm_history) list; /* link on list of all histories */ LIST_ENTRY(uvm_history) list; /* link on list of all histories */
int n; /* number of entries */ unsigned int n; /* number of entries */
int f; /* next free one */ unsigned int f; /* next free one */
int unused; /* old location of lock */
struct uvm_history_ent *e; /* the malloc'd entries */ struct uvm_history_ent *e; /* the malloc'd entries */
kmutex_t l; /* lock on this history */
}; };
LIST_HEAD(uvm_history_head, uvm_history); LIST_HEAD(uvm_history_head, uvm_history);
@ -110,6 +108,7 @@ LIST_HEAD(uvm_history_head, uvm_history);
#define uvmhist_dump(NAME) #define uvmhist_dump(NAME)
#else #else
#include <sys/kernel.h> /* for "cold" variable */ #include <sys/kernel.h> /* for "cold" variable */
#include <sys/atomic.h>
extern struct uvm_history_head uvm_histories; extern struct uvm_history_head uvm_histories;
@ -121,7 +120,6 @@ do { \
(NAME).namelen = strlen(__STRING(NAME)); \ (NAME).namelen = strlen(__STRING(NAME)); \
(NAME).n = (N); \ (NAME).n = (N); \
(NAME).f = 0; \ (NAME).f = 0; \
mutex_init(&(NAME).l, MUTEX_SPIN, IPL_HIGH); \
(NAME).e = (struct uvm_history_ent *) \ (NAME).e = (struct uvm_history_ent *) \
malloc(sizeof(struct uvm_history_ent) * (N), M_TEMP, \ malloc(sizeof(struct uvm_history_ent) * (N), M_TEMP, \
M_WAITOK); \ M_WAITOK); \
@ -135,7 +133,6 @@ do { \
(NAME).namelen = strlen(__STRING(NAME)); \ (NAME).namelen = strlen(__STRING(NAME)); \
(NAME).n = sizeof(BUF) / sizeof(struct uvm_history_ent); \ (NAME).n = sizeof(BUF) / sizeof(struct uvm_history_ent); \
(NAME).f = 0; \ (NAME).f = 0; \
mutex_init(&(NAME).l, MUTEX_SPIN, IPL_HIGH); \
(NAME).e = (struct uvm_history_ent *) (BUF); \ (NAME).e = (struct uvm_history_ent *) (BUF); \
memset((NAME).e, 0, sizeof(struct uvm_history_ent) * (NAME).n); \ memset((NAME).e, 0, sizeof(struct uvm_history_ent) * (NAME).n); \
LIST_INSERT_HEAD(&uvm_histories, &(NAME), list); \ LIST_INSERT_HEAD(&uvm_histories, &(NAME), list); \
@ -156,11 +153,11 @@ do { \
#define UVMHIST_LOG(NAME,FMT,A,B,C,D) \ #define UVMHIST_LOG(NAME,FMT,A,B,C,D) \
do { \ do { \
int _i_; \ unsigned int _i_, _j_; \
mutex_enter(&(NAME).l); \ do { \
_i_ = (NAME).f; \ _i_ = (NAME).f; \
(NAME).f = (_i_ + 1 < (NAME).n) ? _i_ + 1 : 0; \ _j_ = (_i_ + 1 < (NAME).n) ? _i_ + 1 : 0; \
mutex_exit(&(NAME).l); \ } while (atomic_cas_uint(&(NAME).f, _i_, _j_) != _i_); \
if (!cold) \ if (!cold) \
microtime(&(NAME).e[_i_].tv); \ microtime(&(NAME).e[_i_].tv); \
(NAME).e[_i_].cpunum = cpu_number(); \ (NAME).e[_i_].cpunum = cpu_number(); \
@ -178,16 +175,12 @@ do { \
#define UVMHIST_CALLED(NAME) \ #define UVMHIST_CALLED(NAME) \
do { \ do { \
{ \ _uvmhist_call = atomic_inc_uint_nv(&_uvmhist_cnt); \
mutex_enter(&(NAME).l); \
_uvmhist_call = _uvmhist_cnt++; \
mutex_exit(&(NAME).l); \
} \
UVMHIST_LOG(NAME,"called!", 0, 0, 0, 0); \ UVMHIST_LOG(NAME,"called!", 0, 0, 0, 0); \
} while (/*CONSTCOND*/ 0) } while (/*CONSTCOND*/ 0)
#define UVMHIST_FUNC(FNAME) \ #define UVMHIST_FUNC(FNAME) \
static int _uvmhist_cnt = 0; \ static unsigned int _uvmhist_cnt = 0; \
static const char *const _uvmhist_name = FNAME; \ static const char *const _uvmhist_name = FNAME; \
int _uvmhist_call; int _uvmhist_call;