Multiple LRU lists

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski
2020-05-21 12:36:16 +02:00
parent ac83c4ecd6
commit 41a767de97
9 changed files with 276 additions and 111 deletions

View File

@@ -9,19 +9,23 @@
int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock)
{
int err = 0;
unsigned i;
unsigned evp_iter;
unsigned part_iter;
err = env_spinlock_init(&metadata_lock->eviction);
if (err)
return err;
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;
}
env_rwlock_init(&metadata_lock->status);
err = env_rwsem_init(&metadata_lock->global);
if (err)
goto rwsem_err;
for (i = 0; i < OCF_IO_CLASS_MAX; i++) {
err = env_spinlock_init(&metadata_lock->partition[i]);
for (part_iter = 0; part_iter < OCF_IO_CLASS_MAX; part_iter++) {
err = env_spinlock_init(&metadata_lock->partition[part_iter]);
if (err)
goto spinlocks_err;
}
@@ -29,11 +33,15 @@ int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock)
return err;
spinlocks_err:
while (i--)
env_spinlock_destroy(&metadata_lock->partition[i]);
while (part_iter--)
env_spinlock_destroy(&metadata_lock->partition[part_iter]);
rwsem_err:
env_rwlock_destroy(&metadata_lock->status);
env_spinlock_destroy(&metadata_lock->eviction);
eviction_err:
while (evp_iter--)
env_spinlock_destroy(&metadata_lock->eviction[evp_iter]);
return err;
}
@@ -41,11 +49,12 @@ void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock)
{
unsigned i;
for (i = 0; i < OCF_IO_CLASS_MAX; i++) {
for (i = 0; i < OCF_IO_CLASS_MAX; i++)
env_spinlock_destroy(&metadata_lock->partition[i]);
}
env_spinlock_destroy(&metadata_lock->eviction);
for (i = 0; i < OCF_NUM_EVICTION_LISTS; i++)
env_spinlock_destroy(&metadata_lock->eviction[i]);
env_rwlock_destroy(&metadata_lock->status);
env_rwsem_destroy(&metadata_lock->global);
}

View File

@@ -3,6 +3,7 @@
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#include "../ocf_cache_priv.h"
#include "../eviction/eviction.h"
#ifndef __OCF_METADATA_CONCURRENCY_H__
#define __OCF_METADATA_CONCURRENCY_H__
@@ -22,17 +23,49 @@ void ocf_metadata_concurrency_attached_deinit(
struct ocf_metadata_lock *metadata_lock);
static inline void ocf_metadata_eviction_lock(
struct ocf_metadata_lock *metadata_lock)
struct ocf_metadata_lock *metadata_lock, unsigned ev_list)
{
env_spinlock_lock(&metadata_lock->eviction);
env_spinlock_lock(&metadata_lock->eviction[ev_list]);
}
static inline void ocf_metadata_eviction_unlock(
struct ocf_metadata_lock *metadata_lock, unsigned ev_list)
{
env_spinlock_unlock(&metadata_lock->eviction[ev_list]);
}
static inline void ocf_metadata_eviction_lock_all(
struct ocf_metadata_lock *metadata_lock)
{
env_spinlock_unlock(&metadata_lock->eviction);
uint32_t i;
for (i = 0; i < OCF_NUM_EVICTION_LISTS; i++)
ocf_metadata_eviction_lock(metadata_lock, i);
}
static inline void ocf_metadata_eviction_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);
}
#define OCF_METADATA_EVICTION_LOCK(cline) \
ocf_metadata_eviction_lock(&cache->metadata.lock, \
cline % OCF_NUM_EVICTION_LISTS)
#define OCF_METADATA_EVICTION_UNLOCK(cline) \
ocf_metadata_eviction_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_UNLOCK_ALL() \
ocf_metadata_eviction_unlock_all(&cache->metadata.lock)
static inline void ocf_metadata_partition_lock(
struct ocf_metadata_lock *metadata_lock,
ocf_part_id_t part_id)
@@ -47,12 +80,6 @@ static inline void ocf_metadata_partition_unlock(
env_spinlock_unlock(&metadata_lock->partition[part_id]);
}
#define OCF_METADATA_EVICTION_LOCK() \
ocf_metadata_eviction_lock(&cache->metadata.lock)
#define OCF_METADATA_EVICTION_UNLOCK() \
ocf_metadata_eviction_unlock(&cache->metadata.lock)
void ocf_metadata_start_exclusive_access(
struct ocf_metadata_lock *metadata_lock);