summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe
diff options
context:
space:
mode:
authoroster <oster@NetBSD.org>2002-08-08 02:53:01 +0000
committeroster <oster@NetBSD.org>2002-08-08 02:53:01 +0000
commit813fbd6152b5d5a3fba5f9629481b5fd557fef3a (patch)
tree1f9cc6791e87d79f0706149ab5b20ae4edcf40ff /sys/dev/raidframe
parent01bfb60de4cec4f9b0ee9055374b24853b995fe6 (diff)
RF_LOCK_MUTEX()/RF_UNLOCK_MUTEX() often cover more code than they
needs to. In particular, they often surround calls to malloc(). Re-work the locking on most macros to avoid this problem. XXX: On MP systems, simultaneous calls to the GET macros when a freelist is empty may cause that freelist to grow more quickly than before. Given that the "increment" value of these lists are fairly small, this shouldn't be too much of an issue.
Diffstat (limited to 'sys/dev/raidframe')
-rw-r--r--sys/dev/raidframe/rf_freelist.h46
1 files changed, 40 insertions, 6 deletions
diff --git a/sys/dev/raidframe/rf_freelist.h b/sys/dev/raidframe/rf_freelist.h
index 95d7c91fc65..0a0637688fd 100644
--- a/sys/dev/raidframe/rf_freelist.h
+++ b/sys/dev/raidframe/rf_freelist.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_freelist.h,v 1.5 2001/10/04 15:58:53 oster Exp $ */
+/* $NetBSD: rf_freelist.h,v 1.6 2002/08/08 02:53:01 oster Exp $ */
/*
* rf_freelist.h
*/
@@ -152,18 +152,20 @@ struct RF_FreeList_s {
#define RF_FREELIST_PRIME(_fl_,_cnt_,_nextp_,_cast_) { \
void *_p; \
int _i; \
- RF_LOCK_MUTEX((_fl_)->lock); \
for(_i=0;_i<(_cnt_);_i++) { \
RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \
if (_p) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
(_fl_)->free_cnt++; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_FREE_UPDATE(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -188,7 +190,6 @@ struct RF_FreeList_s {
#define RF_FREELIST_PRIME_INIT(_fl_,_cnt_,_nextp_,_cast_,_init_) { \
void *_p; \
int _i; \
- RF_LOCK_MUTEX((_fl_)->lock); \
for(_i=0;_i<(_cnt_);_i++) { \
RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \
if (_init_ (_cast_ _p)) { \
@@ -196,14 +197,17 @@ struct RF_FreeList_s {
_p = NULL; \
} \
if (_p) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
(_fl_)->free_cnt++; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_FREE_UPDATE(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -219,7 +223,6 @@ struct RF_FreeList_s {
#define RF_FREELIST_PRIME_INIT_ARG(_fl_,_cnt_,_nextp_,_cast_,_init_,_arg_) { \
void *_p; \
int _i; \
- RF_LOCK_MUTEX((_fl_)->lock); \
for(_i=0;_i<(_cnt_);_i++) { \
RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \
if (_init_ (_cast_ _p,_arg_)) { \
@@ -227,14 +230,17 @@ struct RF_FreeList_s {
_p = NULL; \
} \
if (_p) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
(_fl_)->free_cnt++; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_FREE_UPDATE(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -255,8 +261,10 @@ struct RF_FreeList_s {
_obj_ = _cast_((_fl_)->objlist); \
(_fl_)->objlist = (void *)((_obj_)->_nextp_); \
(_fl_)->free_cnt--; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
/* \
* Allocate one at a time so we can free \
* one at a time without cleverness when arena \
@@ -277,8 +285,10 @@ struct RF_FreeList_s {
_p = NULL; \
break; \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
@@ -286,8 +296,11 @@ struct RF_FreeList_s {
} \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_GROW(_fl_); \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_ALLOC(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -309,8 +322,10 @@ struct RF_FreeList_s {
_obj_ = _cast_((_fl_)->objlist); \
(_fl_)->objlist = (void *)((_obj_)->_nextp_); \
(_fl_)->free_cnt--; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
/* \
* Allocate one at a time so we can free \
* one at a time without cleverness when arena \
@@ -331,8 +346,10 @@ struct RF_FreeList_s {
_p = NULL; \
break; \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
@@ -340,8 +357,11 @@ struct RF_FreeList_s {
} \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_GROW(_fl_); \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_ALLOC(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -413,8 +433,10 @@ struct RF_FreeList_s {
_obj_ = _cast_((_fl_)->objlist); \
(_fl_)->objlist = (void *)((_obj_)->_nextp_); \
(_fl_)->free_cnt--; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
/* \
* Allocate one at a time so we can free \
* one at a time without cleverness when arena \
@@ -425,16 +447,21 @@ struct RF_FreeList_s {
for(_i=1;_i<(_fl_)->obj_inc;_i++) { \
RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \
if (_p) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
} \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_GROW(_fl_); \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_ALLOC(_fl_); \
RF_UNLOCK_MUTEX((_fl_)->lock); \
}
@@ -451,15 +478,17 @@ struct RF_FreeList_s {
int _i, _n; \
_l = _f = NULL; \
_n = 0; \
- RF_LOCK_MUTEX((_fl_)->lock); \
RF_ASSERT(sizeof(*(_obj_))==((_fl_)->obj_size)); \
for(_n=0;_n<_num_;_n++) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
if (_fl_->objlist) { \
_obj_ = _cast_((_fl_)->objlist); \
(_fl_)->objlist = (void *)((_obj_)->_nextp_); \
(_fl_)->free_cnt--; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
/* \
* Allocate one at a time so we can free \
* one at a time without cleverness when arena \
@@ -470,16 +499,21 @@ struct RF_FreeList_s {
for(_i=1;_i<(_fl_)->obj_inc;_i++) { \
RF_Calloc(_p,1,(_fl_)->obj_size,(void *)); \
if (_p) { \
+ RF_LOCK_MUTEX((_fl_)->lock); \
(_cast_(_p))->_nextp_ = (_fl_)->objlist; \
(_fl_)->objlist = _p; \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
else { \
break; \
} \
} \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
RF_FREELIST_STAT_GROW(_fl_); \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
+ RF_LOCK_MUTEX((_fl_)->lock); \
if (_f == NULL) \
_f = _obj_; \
if (_obj_) { \
@@ -492,8 +526,8 @@ struct RF_FreeList_s {
(_fl_)->objlist = _l; \
_n = _num_; \
} \
+ RF_UNLOCK_MUTEX((_fl_)->lock); \
} \
- RF_UNLOCK_MUTEX((_fl_)->lock); \
}
/*