Change eviction spin lock to RW lock
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
parent
1908707a3d
commit
9690f13bef
@ -12,11 +12,8 @@ int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock)
|
|||||||
unsigned evp_iter;
|
unsigned evp_iter;
|
||||||
unsigned part_iter;
|
unsigned part_iter;
|
||||||
|
|
||||||
for (evp_iter = 0; evp_iter < OCF_NUM_EVICTION_LISTS; evp_iter++) {
|
for (evp_iter = 0; evp_iter < OCF_NUM_EVICTION_LISTS; evp_iter++)
|
||||||
err = env_spinlock_init(&metadata_lock->eviction[evp_iter]);
|
env_rwlock_init(&metadata_lock->eviction[evp_iter]);
|
||||||
if (err)
|
|
||||||
goto eviction_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
env_rwlock_init(&metadata_lock->status);
|
env_rwlock_init(&metadata_lock->status);
|
||||||
|
|
||||||
@ -38,9 +35,8 @@ spinlocks_err:
|
|||||||
rwsem_err:
|
rwsem_err:
|
||||||
env_rwlock_destroy(&metadata_lock->status);
|
env_rwlock_destroy(&metadata_lock->status);
|
||||||
|
|
||||||
eviction_err:
|
|
||||||
while (evp_iter--)
|
while (evp_iter--)
|
||||||
env_spinlock_destroy(&metadata_lock->eviction[evp_iter]);
|
env_rwlock_destroy(&metadata_lock->eviction[evp_iter]);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -53,7 +49,7 @@ void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock)
|
|||||||
env_spinlock_destroy(&metadata_lock->partition[i]);
|
env_spinlock_destroy(&metadata_lock->partition[i]);
|
||||||
|
|
||||||
for (i = 0; i < OCF_NUM_EVICTION_LISTS; 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_rwlock_destroy(&metadata_lock->status);
|
||||||
env_rwsem_destroy(&metadata_lock->global);
|
env_rwsem_destroy(&metadata_lock->global);
|
||||||
|
@ -22,49 +22,49 @@ int ocf_metadata_concurrency_attached_init(
|
|||||||
void ocf_metadata_concurrency_attached_deinit(
|
void ocf_metadata_concurrency_attached_deinit(
|
||||||
struct ocf_metadata_lock *metadata_lock);
|
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)
|
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)
|
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)
|
struct ocf_metadata_lock *metadata_lock)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < OCF_NUM_EVICTION_LISTS; 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)
|
struct ocf_metadata_lock *metadata_lock)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < OCF_NUM_EVICTION_LISTS; 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) \
|
#define OCF_METADATA_EVICTION_WR_LOCK(cline) \
|
||||||
ocf_metadata_eviction_lock(&cache->metadata.lock, \
|
ocf_metadata_eviction_wr_lock(&cache->metadata.lock, \
|
||||||
cline % OCF_NUM_EVICTION_LISTS)
|
cline % OCF_NUM_EVICTION_LISTS)
|
||||||
|
|
||||||
#define OCF_METADATA_EVICTION_UNLOCK(cline) \
|
#define OCF_METADATA_EVICTION_WR_UNLOCK(cline) \
|
||||||
ocf_metadata_eviction_unlock(&cache->metadata.lock, \
|
ocf_metadata_eviction_wr_unlock(&cache->metadata.lock, \
|
||||||
cline % OCF_NUM_EVICTION_LISTS)
|
cline % OCF_NUM_EVICTION_LISTS)
|
||||||
|
|
||||||
#define OCF_METADATA_EVICTION_LOCK_ALL() \
|
#define OCF_METADATA_EVICTION_WR_LOCK_ALL() \
|
||||||
ocf_metadata_eviction_lock_all(&cache->metadata.lock)
|
ocf_metadata_eviction_wr_lock_all(&cache->metadata.lock)
|
||||||
|
|
||||||
#define OCF_METADATA_EVICTION_UNLOCK_ALL() \
|
#define OCF_METADATA_EVICTION_WR_UNLOCK_ALL() \
|
||||||
ocf_metadata_eviction_unlock_all(&cache->metadata.lock)
|
ocf_metadata_eviction_wr_unlock_all(&cache->metadata.lock)
|
||||||
|
|
||||||
static inline void ocf_metadata_partition_lock(
|
static inline void ocf_metadata_partition_lock(
|
||||||
struct ocf_metadata_lock *metadata_lock,
|
struct ocf_metadata_lock *metadata_lock,
|
||||||
|
@ -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);
|
clean_list = evp_lru_get_list(part, ev_list, true);
|
||||||
dirty_list = evp_lru_get_list(part, ev_list, false);
|
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);
|
remove_lru_list(cache, dirty_list, cline);
|
||||||
balance_lru_list(cache, dirty_list);
|
balance_lru_list(cache, dirty_list);
|
||||||
add_lru_head(cache, clean_list, cline);
|
add_lru_head(cache, clean_list, cline);
|
||||||
balance_lru_list(cache, clean_list);
|
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,
|
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);
|
clean_list = evp_lru_get_list(part, ev_list, true);
|
||||||
dirty_list = evp_lru_get_list(part, ev_list, false);
|
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);
|
remove_lru_list(cache, clean_list, cline);
|
||||||
balance_lru_list(cache, clean_list);
|
balance_lru_list(cache, clean_list);
|
||||||
add_lru_head(cache, dirty_list, cline);
|
add_lru_head(cache, dirty_list, cline);
|
||||||
balance_lru_list(cache, dirty_list);
|
balance_lru_list(cache, dirty_list);
|
||||||
OCF_METADATA_EVICTION_UNLOCK(cline);
|
OCF_METADATA_EVICTION_WR_UNLOCK(cline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,9 +36,9 @@ static inline void ocf_eviction_purge_cache_line(
|
|||||||
ENV_BUG_ON(type >= ocf_eviction_max);
|
ENV_BUG_ON(type >= ocf_eviction_max);
|
||||||
|
|
||||||
if (likely(evict_policy_ops[type].rm_cline)) {
|
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);
|
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);
|
ENV_BUG_ON(type >= ocf_eviction_max);
|
||||||
|
|
||||||
if (likely(evict_policy_ops[type].hot_cline)) {
|
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);
|
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);
|
ENV_BUG_ON(type >= ocf_eviction_max);
|
||||||
|
|
||||||
if (likely(evict_policy_ops[type].init_evp)) {
|
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);
|
evict_policy_ops[type].init_evp(cache, part);
|
||||||
OCF_METADATA_EVICTION_UNLOCK_ALL();
|
OCF_METADATA_EVICTION_WR_UNLOCK_ALL();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ struct ocf_metadata_lock
|
|||||||
{
|
{
|
||||||
env_rwsem global; /*!< global metadata lock (GML) */
|
env_rwsem global; /*!< global metadata lock (GML) */
|
||||||
env_rwlock status; /*!< Fast lock for status bits */
|
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 *hash; /*!< Hash bucket locks */
|
||||||
env_rwsem *collision_pages; /*!< Collision table page locks */
|
env_rwsem *collision_pages; /*!< Collision table page locks */
|
||||||
env_spinlock partition[OCF_IO_CLASS_MAX]; /* partition lock */
|
env_spinlock partition[OCF_IO_CLASS_MAX]; /* partition lock */
|
||||||
|
Loading…
Reference in New Issue
Block a user