diff --git a/src/concurrency/ocf_metadata_concurrency.c b/src/concurrency/ocf_metadata_concurrency.c index ef0a737..f2d7b90 100644 --- a/src/concurrency/ocf_metadata_concurrency.c +++ b/src/concurrency/ocf_metadata_concurrency.c @@ -12,11 +12,8 @@ int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock) unsigned evp_iter; unsigned part_iter; - for (evp_iter = 0; evp_iter < OCF_NUM_EVICTION_LISTS; evp_iter++) { - err = env_spinlock_init(&metadata_lock->eviction[evp_iter]); - if (err) - goto eviction_err; - } + for (evp_iter = 0; evp_iter < OCF_NUM_EVICTION_LISTS; evp_iter++) + env_rwlock_init(&metadata_lock->eviction[evp_iter]); env_rwlock_init(&metadata_lock->status); @@ -38,9 +35,8 @@ spinlocks_err: rwsem_err: env_rwlock_destroy(&metadata_lock->status); -eviction_err: while (evp_iter--) - env_spinlock_destroy(&metadata_lock->eviction[evp_iter]); + env_rwlock_destroy(&metadata_lock->eviction[evp_iter]); return err; } @@ -53,7 +49,7 @@ void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock) env_spinlock_destroy(&metadata_lock->partition[i]); for (i = 0; i < OCF_NUM_EVICTION_LISTS; i++) - env_spinlock_destroy(&metadata_lock->eviction[i]); + env_rwlock_destroy(&metadata_lock->eviction[i]); env_rwlock_destroy(&metadata_lock->status); env_rwsem_destroy(&metadata_lock->global); diff --git a/src/concurrency/ocf_metadata_concurrency.h b/src/concurrency/ocf_metadata_concurrency.h index b981bca..172e591 100644 --- a/src/concurrency/ocf_metadata_concurrency.h +++ b/src/concurrency/ocf_metadata_concurrency.h @@ -22,49 +22,49 @@ int ocf_metadata_concurrency_attached_init( void ocf_metadata_concurrency_attached_deinit( struct ocf_metadata_lock *metadata_lock); -static inline void ocf_metadata_eviction_lock( +static inline void ocf_metadata_eviction_wr_lock( struct ocf_metadata_lock *metadata_lock, unsigned ev_list) { - env_spinlock_lock(&metadata_lock->eviction[ev_list]); + env_rwlock_write_lock(&metadata_lock->eviction[ev_list]); } -static inline void ocf_metadata_eviction_unlock( +static inline void ocf_metadata_eviction_wr_unlock( struct ocf_metadata_lock *metadata_lock, unsigned ev_list) { - env_spinlock_unlock(&metadata_lock->eviction[ev_list]); + env_rwlock_write_unlock(&metadata_lock->eviction[ev_list]); } -static inline void ocf_metadata_eviction_lock_all( +static inline void ocf_metadata_eviction_wr_lock_all( struct ocf_metadata_lock *metadata_lock) { uint32_t i; for (i = 0; i < OCF_NUM_EVICTION_LISTS; i++) - ocf_metadata_eviction_lock(metadata_lock, i); + ocf_metadata_eviction_wr_lock(metadata_lock, i); } -static inline void ocf_metadata_eviction_unlock_all( +static inline void ocf_metadata_eviction_wr_unlock_all( struct ocf_metadata_lock *metadata_lock) { uint32_t i; for (i = 0; i < OCF_NUM_EVICTION_LISTS; i++) - ocf_metadata_eviction_unlock(metadata_lock, i); + ocf_metadata_eviction_wr_unlock(metadata_lock, i); } -#define OCF_METADATA_EVICTION_LOCK(cline) \ - ocf_metadata_eviction_lock(&cache->metadata.lock, \ +#define OCF_METADATA_EVICTION_WR_LOCK(cline) \ + ocf_metadata_eviction_wr_lock(&cache->metadata.lock, \ cline % OCF_NUM_EVICTION_LISTS) -#define OCF_METADATA_EVICTION_UNLOCK(cline) \ - ocf_metadata_eviction_unlock(&cache->metadata.lock, \ +#define OCF_METADATA_EVICTION_WR_UNLOCK(cline) \ + ocf_metadata_eviction_wr_unlock(&cache->metadata.lock, \ cline % OCF_NUM_EVICTION_LISTS) -#define OCF_METADATA_EVICTION_LOCK_ALL() \ - ocf_metadata_eviction_lock_all(&cache->metadata.lock) +#define OCF_METADATA_EVICTION_WR_LOCK_ALL() \ + ocf_metadata_eviction_wr_lock_all(&cache->metadata.lock) -#define OCF_METADATA_EVICTION_UNLOCK_ALL() \ - ocf_metadata_eviction_unlock_all(&cache->metadata.lock) +#define OCF_METADATA_EVICTION_WR_UNLOCK_ALL() \ + ocf_metadata_eviction_wr_unlock_all(&cache->metadata.lock) static inline void ocf_metadata_partition_lock( struct ocf_metadata_lock *metadata_lock, diff --git a/src/eviction/lru.c b/src/eviction/lru.c index fa6cbba..a8f938b 100644 --- a/src/eviction/lru.c +++ b/src/eviction/lru.c @@ -578,12 +578,12 @@ void evp_lru_clean_cline(ocf_cache_t cache, struct ocf_user_part *part, clean_list = evp_lru_get_list(part, ev_list, true); dirty_list = evp_lru_get_list(part, ev_list, false); - OCF_METADATA_EVICTION_LOCK(cline); + OCF_METADATA_EVICTION_WR_LOCK(cline); remove_lru_list(cache, dirty_list, cline); balance_lru_list(cache, dirty_list); add_lru_head(cache, clean_list, cline); balance_lru_list(cache, clean_list); - OCF_METADATA_EVICTION_UNLOCK(cline); + OCF_METADATA_EVICTION_WR_UNLOCK(cline); } void evp_lru_dirty_cline(ocf_cache_t cache, struct ocf_user_part *part, @@ -596,11 +596,11 @@ void evp_lru_dirty_cline(ocf_cache_t cache, struct ocf_user_part *part, clean_list = evp_lru_get_list(part, ev_list, true); dirty_list = evp_lru_get_list(part, ev_list, false); - OCF_METADATA_EVICTION_LOCK(cline); + OCF_METADATA_EVICTION_WR_LOCK(cline); remove_lru_list(cache, clean_list, cline); balance_lru_list(cache, clean_list); add_lru_head(cache, dirty_list, cline); balance_lru_list(cache, dirty_list); - OCF_METADATA_EVICTION_UNLOCK(cline); + OCF_METADATA_EVICTION_WR_UNLOCK(cline); } diff --git a/src/eviction/ops.h b/src/eviction/ops.h index 2952171..56475b1 100644 --- a/src/eviction/ops.h +++ b/src/eviction/ops.h @@ -36,9 +36,9 @@ static inline void ocf_eviction_purge_cache_line( ENV_BUG_ON(type >= ocf_eviction_max); if (likely(evict_policy_ops[type].rm_cline)) { - OCF_METADATA_EVICTION_LOCK(line); + OCF_METADATA_EVICTION_WR_LOCK(line); evict_policy_ops[type].rm_cline(cache, line); - OCF_METADATA_EVICTION_UNLOCK(line); + OCF_METADATA_EVICTION_WR_UNLOCK(line); } } @@ -83,9 +83,9 @@ static inline void ocf_eviction_set_hot_cache_line( ENV_BUG_ON(type >= ocf_eviction_max); if (likely(evict_policy_ops[type].hot_cline)) { - OCF_METADATA_EVICTION_LOCK(line); + OCF_METADATA_EVICTION_WR_LOCK(line); evict_policy_ops[type].hot_cline(cache, line); - OCF_METADATA_EVICTION_UNLOCK(line); + OCF_METADATA_EVICTION_WR_UNLOCK(line); } } @@ -97,9 +97,9 @@ static inline void ocf_eviction_initialize(struct ocf_cache *cache, ENV_BUG_ON(type >= ocf_eviction_max); if (likely(evict_policy_ops[type].init_evp)) { - OCF_METADATA_EVICTION_LOCK_ALL(); + OCF_METADATA_EVICTION_WR_LOCK_ALL(); evict_policy_ops[type].init_evp(cache, part); - OCF_METADATA_EVICTION_UNLOCK_ALL(); + OCF_METADATA_EVICTION_WR_UNLOCK_ALL(); } } diff --git a/src/metadata/metadata_structs.h b/src/metadata/metadata_structs.h index 2efdc92..c6c5577 100644 --- a/src/metadata/metadata_structs.h +++ b/src/metadata/metadata_structs.h @@ -47,7 +47,7 @@ struct ocf_metadata_lock { env_rwsem global; /*!< global metadata lock (GML) */ env_rwlock status; /*!< Fast lock for status bits */ - env_spinlock eviction[OCF_NUM_EVICTION_LISTS]; /*!< Fast lock for eviction policy */ + env_rwlock eviction[OCF_NUM_EVICTION_LISTS]; /*!< Fast lock for eviction policy */ env_rwsem *hash; /*!< Hash bucket locks */ env_rwsem *collision_pages; /*!< Collision table page locks */ env_spinlock partition[OCF_IO_CLASS_MAX]; /* partition lock */