Align each global metadata lock to 64B

.. in order to move primitives intended to be accessed
concurrently in separate CPU cache line.

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2021-02-12 18:52:20 -06:00
parent 05780c98ed
commit 0748f33a9d
2 changed files with 16 additions and 11 deletions

View File

@ -24,7 +24,7 @@ int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock)
for (global_iter = 0; global_iter < OCF_NUM_GLOBAL_META_LOCKS; for (global_iter = 0; global_iter < OCF_NUM_GLOBAL_META_LOCKS;
global_iter++) { global_iter++) {
err = env_rwsem_init(&metadata_lock->global[global_iter]); err = env_rwsem_init(&metadata_lock->global[global_iter].sem);
if (err) if (err)
goto global_err; goto global_err;
} }
@ -43,7 +43,7 @@ partition_err:
global_err: global_err:
while (global_iter--) while (global_iter--)
env_rwsem_destroy(&metadata_lock->global[global_iter]); env_rwsem_destroy(&metadata_lock->global[global_iter].sem);
env_rwlock_destroy(&metadata_lock->status); env_rwlock_destroy(&metadata_lock->status);
@ -65,7 +65,7 @@ void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock)
env_spinlock_destroy(&metadata_lock->eviction[i]); env_spinlock_destroy(&metadata_lock->eviction[i]);
for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++) for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++)
env_rwsem_destroy(&metadata_lock->global[i]); env_rwsem_destroy(&metadata_lock->global[i].sem);
env_rwlock_destroy(&metadata_lock->status); env_rwlock_destroy(&metadata_lock->status);
} }
@ -154,7 +154,7 @@ void ocf_metadata_start_exclusive_access(
unsigned i; unsigned i;
for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++) { for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++) {
env_rwsem_down_write(&metadata_lock->global[i]); env_rwsem_down_write(&metadata_lock->global[i].sem);
} }
} }
@ -165,14 +165,14 @@ int ocf_metadata_try_start_exclusive_access(
int error; int error;
for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++) { for (i = 0; i < OCF_NUM_GLOBAL_META_LOCKS; i++) {
error = env_rwsem_down_write_trylock(&metadata_lock->global[i]); error = env_rwsem_down_write_trylock(&metadata_lock->global[i].sem);
if (error) if (error)
break; break;
} }
if (error) { if (error) {
while (i--) { while (i--) {
env_rwsem_up_write(&metadata_lock->global[i]); env_rwsem_up_write(&metadata_lock->global[i].sem);
} }
} }
@ -185,7 +185,7 @@ void ocf_metadata_end_exclusive_access(
unsigned i; unsigned i;
for (i = OCF_NUM_GLOBAL_META_LOCKS; i > 0; i--) for (i = OCF_NUM_GLOBAL_META_LOCKS; i > 0; i--)
env_rwsem_up_write(&metadata_lock->global[i - 1]); env_rwsem_up_write(&metadata_lock->global[i - 1].sem);
} }
/* lock_idx determines which of underlying R/W locks is acquired for read. The goal /* lock_idx determines which of underlying R/W locks is acquired for read. The goal
@ -199,20 +199,20 @@ void ocf_metadata_start_shared_access(
struct ocf_metadata_lock *metadata_lock, struct ocf_metadata_lock *metadata_lock,
unsigned lock_idx) unsigned lock_idx)
{ {
env_rwsem_down_read(&metadata_lock->global[lock_idx]); env_rwsem_down_read(&metadata_lock->global[lock_idx].sem);
} }
int ocf_metadata_try_start_shared_access( int ocf_metadata_try_start_shared_access(
struct ocf_metadata_lock *metadata_lock, struct ocf_metadata_lock *metadata_lock,
unsigned lock_idx) unsigned lock_idx)
{ {
return env_rwsem_down_read_trylock(&metadata_lock->global[lock_idx]); return env_rwsem_down_read_trylock(&metadata_lock->global[lock_idx].sem);
} }
void ocf_metadata_end_shared_access(struct ocf_metadata_lock *metadata_lock, void ocf_metadata_end_shared_access(struct ocf_metadata_lock *metadata_lock,
unsigned lock_idx) unsigned lock_idx)
{ {
env_rwsem_up_read(&metadata_lock->global[lock_idx]); env_rwsem_up_read(&metadata_lock->global[lock_idx].sem);
} }
/* NOTE: Calling 'naked' lock/unlock requires caller to hold global metadata /* NOTE: Calling 'naked' lock/unlock requires caller to hold global metadata

View File

@ -47,9 +47,14 @@ struct ocf_cache_line_settings {
#define OCF_METADATA_GLOBAL_LOCK_IDX_BITS 2 #define OCF_METADATA_GLOBAL_LOCK_IDX_BITS 2
#define OCF_NUM_GLOBAL_META_LOCKS (1 << (OCF_METADATA_GLOBAL_LOCK_IDX_BITS)) #define OCF_NUM_GLOBAL_META_LOCKS (1 << (OCF_METADATA_GLOBAL_LOCK_IDX_BITS))
struct ocf_metadata_global_lock {
env_rwsem sem;
} __attribute__((aligned(64)));
struct ocf_metadata_lock struct ocf_metadata_lock
{ {
env_rwsem global[OCF_NUM_GLOBAL_META_LOCKS]; /*!< global metadata lock (GML) */ struct ocf_metadata_global_lock global[OCF_NUM_GLOBAL_META_LOCKS];
/*!< 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_spinlock eviction[OCF_NUM_EVICTION_LISTS]; /*!< Fast lock for eviction policy */
env_rwsem *hash; /*!< Hash bucket locks */ env_rwsem *hash; /*!< Hash bucket locks */