From 93bda499c746db5fa62ecc58d4b14041c03f63b6 Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Fri, 8 Jan 2021 12:10:28 +0100 Subject: [PATCH] Add functions to lock specific hash bucket Signed-off-by: Adam Rutkowski --- src/concurrency/ocf_metadata_concurrency.c | 28 ++++++++++++++++++++++ src/concurrency/ocf_metadata_concurrency.h | 11 +++++++++ 2 files changed, 39 insertions(+) diff --git a/src/concurrency/ocf_metadata_concurrency.c b/src/concurrency/ocf_metadata_concurrency.c index a36d3b8..ef0a737 100644 --- a/src/concurrency/ocf_metadata_concurrency.c +++ b/src/concurrency/ocf_metadata_concurrency.c @@ -221,6 +221,34 @@ int ocf_metadata_hash_try_lock(struct ocf_metadata_lock *metadata_lock, return 0; } +void ocf_metadata_lock_hash_rd(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash) +{ + ocf_metadata_start_shared_access(metadata_lock); + ocf_metadata_hash_lock(metadata_lock, hash, OCF_METADATA_RD); +} + +void ocf_metadata_unlock_hash_rd(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash) +{ + ocf_metadata_hash_unlock(metadata_lock, hash, OCF_METADATA_RD); + ocf_metadata_end_shared_access(metadata_lock); +} + +void ocf_metadata_lock_hash_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash) +{ + ocf_metadata_start_shared_access(metadata_lock); + ocf_metadata_hash_lock(metadata_lock, hash, OCF_METADATA_WR); +} + +void ocf_metadata_unlock_hash_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash) +{ + ocf_metadata_hash_unlock(metadata_lock, hash, OCF_METADATA_WR); + ocf_metadata_end_shared_access(metadata_lock); +} + /* NOTE: attempt to acquire hash lock for multiple core lines may end up * in deadlock. In order to hash lock multiple core lines safely, use * ocf_req_hash_lock_* functions */ diff --git a/src/concurrency/ocf_metadata_concurrency.h b/src/concurrency/ocf_metadata_concurrency.h index 2ae5721..b981bca 100644 --- a/src/concurrency/ocf_metadata_concurrency.h +++ b/src/concurrency/ocf_metadata_concurrency.h @@ -136,6 +136,17 @@ static inline void ocf_metadata_status_bits_unlock( ocf_metadata_status_bits_unlock(&cache->metadata.lock, \ OCF_METADATA_WR) +/* lock/unlock single hash */ +void ocf_metadata_lock_hash_rd(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); +void ocf_metadata_unlock_hash_rd(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); +void ocf_metadata_lock_hash_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); +void ocf_metadata_unlock_hash_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); + +/* lock/unlock single hash provided core id and core line */ void ocf_metadata_hash_lock_rd(struct ocf_metadata_lock *metadata_lock, uint32_t core_id, uint64_t core_line); void ocf_metadata_hash_unlock_rd(struct ocf_metadata_lock *metadata_lock,