diff options
| author | oster <oster@NetBSD.org> | 2002-08-08 02:53:01 +0000 |
|---|---|---|
| committer | oster <oster@NetBSD.org> | 2002-08-08 02:53:01 +0000 |
| commit | 813fbd6152b5d5a3fba5f9629481b5fd557fef3a (patch) | |
| tree | 1f9cc6791e87d79f0706149ab5b20ae4edcf40ff /sys/dev/raidframe | |
| parent | 01bfb60de4cec4f9b0ee9055374b24853b995fe6 (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.h | 46 |
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); \ } /* |
