From f206c64ff6da47b5f9157c5072ac24d4842b08c1 Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Fri, 8 Jan 2021 12:11:54 +0100 Subject: [PATCH] Fine granularity lock in cache_mngt_core_deinit_attached_meta Signed-off-by: Adam Rutkowski Signed-off-by: Michal Mielewczyk --- src/mngt/ocf_mngt_common.c | 62 ++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/src/mngt/ocf_mngt_common.c b/src/mngt/ocf_mngt_common.c index 44e2c36..4c91309 100644 --- a/src/mngt/ocf_mngt_common.c +++ b/src/mngt/ocf_mngt_common.c @@ -54,41 +54,51 @@ void cache_mngt_core_remove_from_cleaning_pol(ocf_core_t core) /* Deinitialize core metadata in attached metadata */ void cache_mngt_core_deinit_attached_meta(ocf_core_t core) { - int retry = 1; - uint64_t core_size = 0; - ocf_cleaning_t clean_pol_type; ocf_cache_t cache = ocf_core_get_cache(core); ocf_core_id_t core_id = ocf_core_get_id(core); + ocf_core_id_t iter_core_id; + ocf_cache_line_t curr_cline, prev_cline; + uint32_t hash, num_hash = cache->device->hash_table_entries; - core_size = ocf_volume_get_length(&core->volume); - if (!core_size) - core_size = ~0ULL; + for (hash = 0; hash < num_hash;) { + prev_cline = cache->device->collision_table_entries; + ocf_metadata_lock_hash_wr(&cache->metadata.lock, hash); - ocf_metadata_start_exclusive_access(&cache->metadata.lock); + curr_cline = ocf_metadata_get_hash(cache, hash); + while (curr_cline != cache->device->collision_table_entries) { + ocf_metadata_get_core_info(cache, curr_cline, &iter_core_id, + NULL); - clean_pol_type = cache->conf_meta->cleaning_policy_type; - while (retry) { - retry = 0; - if (cleaning_policy_ops[clean_pol_type].purge_range) { - retry = cleaning_policy_ops[clean_pol_type].purge_range(cache, - core_id, 0, core_size); + if (iter_core_id != core_id) { + /* `prev_cline` is a pointer to last not sparsed cacheline in + * current hash */ + prev_cline = curr_cline; + curr_cline = ocf_metadata_get_collision_next(cache, curr_cline); + continue; + } + + if (!ocf_cache_line_try_lock_wr(cache, curr_cline)) + break; + + if (metadata_test_dirty(cache, curr_cline)) + ocf_purge_cleaning_policy(cache, curr_cline); + ocf_metadata_sparse_cache_line(cache, curr_cline); + + ocf_cache_line_unlock_wr(cache, curr_cline); + + if (prev_cline != cache->device->collision_table_entries) + curr_cline = ocf_metadata_get_collision_next(cache, prev_cline); + else + curr_cline = ocf_metadata_get_hash(cache, hash); } + ocf_metadata_unlock_hash_wr(&cache->metadata.lock, hash); - if (!retry) { - /* Remove from collision_table and Partition. Put in FREELIST */ - retry = ocf_metadata_sparse_range(cache, core_id, 0, - core_size); - } - - if (retry) { - ocf_metadata_end_exclusive_access(&cache->metadata.lock); + /* Check whether all the cachelines from the hash bucket were sparsed */ + if (curr_cline == cache->device->collision_table_entries) + hash++; + else env_msleep(100); - ocf_metadata_start_exclusive_access( - &cache->metadata.lock); - } } - - ocf_metadata_end_exclusive_access(&cache->metadata.lock); } /* Mark core as removed in metadata */