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,