Merge pull request #456 from arutk/aalru
Relax LRU list ordering to minimize list updates
This commit is contained in:
@@ -14,11 +14,8 @@ int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock)
|
||||
unsigned part_iter;
|
||||
unsigned global_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);
|
||||
|
||||
@@ -47,9 +44,8 @@ global_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;
|
||||
}
|
||||
@@ -62,7 +58,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]);
|
||||
|
||||
for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++)
|
||||
env_rwsem_destroy(&metadata_lock->global[i].sem);
|
||||
|
@@ -28,49 +28,69 @@ 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_rd_lock(
|
||||
struct ocf_metadata_lock *metadata_lock, unsigned ev_list)
|
||||
{
|
||||
env_rwlock_read_lock(&metadata_lock->eviction[ev_list]);
|
||||
}
|
||||
|
||||
static inline void ocf_metadata_eviction_rd_unlock(
|
||||
struct ocf_metadata_lock *metadata_lock, unsigned ev_list)
|
||||
{
|
||||
env_rwlock_read_unlock(&metadata_lock->eviction[ev_list]);
|
||||
}
|
||||
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_RD_LOCK(cline) \
|
||||
ocf_metadata_eviction_rd_lock(&cache->metadata.lock, \
|
||||
cline % OCF_NUM_EVICTION_LISTS)
|
||||
|
||||
#define OCF_METADATA_EVICTION_UNLOCK_ALL() \
|
||||
ocf_metadata_eviction_unlock_all(&cache->metadata.lock)
|
||||
#define OCF_METADATA_EVICTION_RD_UNLOCK(cline) \
|
||||
ocf_metadata_eviction_rd_unlock(&cache->metadata.lock, \
|
||||
cline % OCF_NUM_EVICTION_LISTS)
|
||||
|
||||
|
||||
#define OCF_METADATA_EVICTION_WR_LOCK_ALL() \
|
||||
ocf_metadata_eviction_wr_lock_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,
|
||||
|
Reference in New Issue
Block a user