From a80eea454feae15a6aa14ce4bffbf62efdbf2203 Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Fri, 5 Mar 2021 11:20:46 +0100 Subject: [PATCH] Add function to determine hash collisions Signed-off-by: Adam Rutkowski --- src/concurrency/ocf_metadata_concurrency.c | 18 ++++++++++++++++++ src/concurrency/ocf_metadata_concurrency.h | 12 ++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/concurrency/ocf_metadata_concurrency.c b/src/concurrency/ocf_metadata_concurrency.c index 4a42806..de3551c 100644 --- a/src/concurrency/ocf_metadata_concurrency.c +++ b/src/concurrency/ocf_metadata_concurrency.c @@ -423,6 +423,24 @@ void ocf_hb_id_prot_unlock_wr(struct ocf_metadata_lock *metadata_lock, for (hash = _MIN_HASH(req); hash <= _MAX_HASH(req); \ hash = _HASH_NEXT(req, hash)) +/* returns true if given core hash collides with request LBA range */ +bool ocf_req_hash_in_range(struct ocf_request *req, + ocf_core_id_t core_id, uint64_t core_line) +{ + ocf_cache_line_t hash = ocf_metadata_hash_func( + req->cache, core_line, core_id); + + if (!_HAS_GAP(req)) { + return (hash >= _MIN_HASH(req) && + hash <= _MAX_HASH(req)); + } + + return (hash >= _MIN_HASH(req) && hash <= _GAP_START(req)) || + (hash > _GAP_START(req) + _GAP_VAL(req) && + hash <= _MAX_HASH(req)); + +} + void ocf_hb_req_prot_lock_rd(struct ocf_request *req) { ocf_cache_line_t hash; diff --git a/src/concurrency/ocf_metadata_concurrency.h b/src/concurrency/ocf_metadata_concurrency.h index d258b3e..266712e 100644 --- a/src/concurrency/ocf_metadata_concurrency.h +++ b/src/concurrency/ocf_metadata_concurrency.h @@ -142,16 +142,24 @@ void ocf_hb_id_prot_lock_wr(struct ocf_metadata_lock *metadata_lock, void ocf_hb_id_prot_unlock_wr(struct ocf_metadata_lock *metadata_lock, unsigned lock_idx, ocf_cache_line_t hash); -/* caller must hold global metadata read lock */ +/* Caller must hold global metadata read lock when acquiring naked hash bucket + * lock. + */ bool ocf_hb_cline_naked_trylock_rd(struct ocf_metadata_lock *metadata_lock, uint32_t core_id, uint64_t core_line); void ocf_hb_cline_naked_unlock_rd(struct ocf_metadata_lock *metadata_lock, uint32_t core_id, uint64_t core_line); - bool ocf_hb_cline_naked_trylock_wr(struct ocf_metadata_lock *metadata_lock, uint32_t core_id, uint64_t core_line); void ocf_hb_cline_naked_unlock_wr(struct ocf_metadata_lock *metadata_lock, uint32_t core_id, uint64_t core_line); +void ocf_hb_id_naked_lock_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); +void ocf_hb_id_naked_unlock_wr(struct ocf_metadata_lock *metadata_lock, + ocf_cache_line_t hash); + +bool ocf_req_hash_in_range(struct ocf_request *req, + ocf_core_id_t core_id, uint64_t core_line); /* lock entire request in deadlock-free manner */ void ocf_hb_req_prot_lock_rd(struct ocf_request *req);