From a15003d43ee29363d515519670e531298a94f342 Mon Sep 17 00:00:00 2001 From: Daniel Madej Date: Thu, 6 Feb 2025 11:54:53 +0100 Subject: [PATCH 1/2] Split count_pages and update on metadata deinit This resets count_pages_variable on cache-detach, so during the following cache-attach metadata size is calculated properly. Signed-off-by: Daniel Madej --- src/metadata/metadata.c | 23 +++++++++++++---------- src/metadata/metadata_internal.h | 4 +++- src/metadata/metadata_passive_update.c | 4 ++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/metadata/metadata.c b/src/metadata/metadata.c index 3257b95..5c54b89 100644 --- a/src/metadata/metadata.c +++ b/src/metadata/metadata.c @@ -1,6 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation - * Copyright(c) 2024 Huawei Technologies + * Copyright(c) 2024-2025 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -271,7 +271,7 @@ static int ocf_metadata_calculate_metadata_size( lowest_diff = cache_lines; do { - count_pages = ctrl->count_pages; + count_pages = 0; for (i = metadata_segment_variable_size_start; i < metadata_segment_max; i++) { struct ocf_metadata_raw *raw = &ctrl->raw_desc[i]; @@ -286,7 +286,7 @@ static int ocf_metadata_calculate_metadata_size( /* * Setup SSD location and size */ - raw->ssd_pages_offset = count_pages; + raw->ssd_pages_offset = ctrl->count_pages_fixed + count_pages; raw->ssd_pages = OCF_DIV_ROUND_UP(raw->entries, raw->entries_in_page); @@ -321,7 +321,7 @@ static int ocf_metadata_calculate_metadata_size( /* Cache size in bytes */ diff_lines = ctrl->device_lines * line_size; /* Sub metadata size which is in 4 kiB unit */ - diff_lines -= (int64_t)count_pages * PAGE_SIZE; + diff_lines -= (int64_t)(ctrl->count_pages_fixed + count_pages) * PAGE_SIZE; /* Convert back to cache lines */ diff_lines /= line_size; /* Calculate difference */ @@ -344,7 +344,7 @@ static int ocf_metadata_calculate_metadata_size( } while (diff_lines); - ctrl->count_pages = count_pages; + ctrl->count_pages_variable = count_pages; ctrl->cachelines = cache_lines; OCF_DEBUG_PARAM(cache, "Cache lines = %u", ctrl->cachelines); @@ -447,6 +447,7 @@ void ocf_metadata_deinit_variable_size(struct ocf_cache *cache) i < metadata_segment_max; i++) { ocf_metadata_segment_destroy(cache, ctrl->segment[i]); } + ctrl->count_pages_variable = 0; } static inline void ocf_metadata_config_init(ocf_cache_t cache, size_t size) @@ -530,7 +531,7 @@ static struct ocf_metadata_ctrl *ocf_metadata_ctrl_init( page += ocf_metadata_raw_size_on_ssd(raw); } - ctrl->count_pages = page; + ctrl->count_pages_fixed = page; return ctrl; } @@ -711,9 +712,10 @@ int ocf_metadata_init_variable_size(struct ocf_cache *cache, } OCF_DEBUG_PARAM(cache, "Metadata begin pages = %u", ctrl->start_page); - OCF_DEBUG_PARAM(cache, "Metadata count pages = %u", ctrl->count_pages); + OCF_DEBUG_PARAM(cache, "Metadata count pages fixed = %u", ctrl->count_pages_fixed); + OCF_DEBUG_PARAM(cache, "Metadata count pages variable = %u", ctrl->count_pages_variable); OCF_DEBUG_PARAM(cache, "Metadata end pages = %u", ctrl->start_page - + ctrl->count_pages); + + ctrl->count_pages_fixed + ctrl->count_pages_variable); superblock = ctrl->segment[metadata_segment_sb_config]; @@ -787,7 +789,8 @@ finalize: cache->device->hash_table_entries = ctrl->raw_desc[metadata_segment_hash].entries; - cache->device->metadata_offset = ctrl->count_pages * PAGE_SIZE; + cache->device->metadata_offset = + (ctrl->count_pages_fixed + ctrl->count_pages_variable) * PAGE_SIZE; cache->conf_meta->cachelines = ctrl->cachelines; cache->conf_meta->line_size = line_size; @@ -954,7 +957,7 @@ ocf_cache_line_t ocf_metadata_get_pages_count(struct ocf_cache *cache) ctrl = (struct ocf_metadata_ctrl *) cache->metadata.priv; - return ctrl->count_pages; + return ctrl->count_pages_fixed + ctrl->count_pages_variable; } /* diff --git a/src/metadata/metadata_internal.h b/src/metadata/metadata_internal.h index fa38117..c529554 100644 --- a/src/metadata/metadata_internal.h +++ b/src/metadata/metadata_internal.h @@ -1,5 +1,6 @@ /* * Copyright(c) 2020-2021 Intel Corporation + * Copyright(c) 2025 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -20,7 +21,8 @@ struct ocf_metadata_ctrl { ocf_cache_line_t cachelines; ocf_cache_line_t start_page; - ocf_cache_line_t count_pages; + ocf_cache_line_t count_pages_fixed; + ocf_cache_line_t count_pages_variable; uint32_t device_lines; size_t mapping_size; struct ocf_metadata_raw raw_desc[metadata_segment_max]; diff --git a/src/metadata/metadata_passive_update.c b/src/metadata/metadata_passive_update.c index ac31d6b..9ab2647 100644 --- a/src/metadata/metadata_passive_update.c +++ b/src/metadata/metadata_passive_update.c @@ -1,6 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation - * Copyright(c) 2024 Huawei Technologies + * Copyright(c) 2024-2025 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -87,7 +87,7 @@ int ocf_metadata_passive_update(struct ocf_request *master) return 0; } - if (io_start_page >= ctrl->count_pages) { + if (io_start_page >= ctrl->count_pages_fixed + ctrl->count_pages_variable) { master->complete(master, 0); return 0; } From d8feef301dd02c916b16a09d53bdef28f40449f5 Mon Sep 17 00:00:00 2001 From: Daniel Madej Date: Thu, 6 Feb 2025 11:54:53 +0100 Subject: [PATCH 2/2] Change type of pages count variables to uint32_t Signed-off-by: Daniel Madej --- src/metadata/metadata.c | 6 +++--- src/metadata/metadata.h | 3 ++- src/metadata/metadata_internal.h | 4 ++-- src/metadata/metadata_passive_update.c | 3 +-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/metadata/metadata.c b/src/metadata/metadata.c index 5c54b89..a406951 100644 --- a/src/metadata/metadata.c +++ b/src/metadata/metadata.c @@ -715,7 +715,7 @@ int ocf_metadata_init_variable_size(struct ocf_cache *cache, OCF_DEBUG_PARAM(cache, "Metadata count pages fixed = %u", ctrl->count_pages_fixed); OCF_DEBUG_PARAM(cache, "Metadata count pages variable = %u", ctrl->count_pages_variable); OCF_DEBUG_PARAM(cache, "Metadata end pages = %u", ctrl->start_page - + ctrl->count_pages_fixed + ctrl->count_pages_variable); + + ocf_metadata_get_pages_count(cache)); superblock = ctrl->segment[metadata_segment_sb_config]; @@ -790,7 +790,7 @@ finalize: ctrl->raw_desc[metadata_segment_hash].entries; cache->device->metadata_offset = - (ctrl->count_pages_fixed + ctrl->count_pages_variable) * PAGE_SIZE; + ocf_metadata_get_pages_count(cache) * PAGE_SIZE; cache->conf_meta->cachelines = ctrl->cachelines; cache->conf_meta->line_size = line_size; @@ -949,7 +949,7 @@ void ocf_metadata_init_hash_table(ocf_pipeline_t pipeline, void *priv, /* * Get count of pages that is dedicated for metadata */ -ocf_cache_line_t ocf_metadata_get_pages_count(struct ocf_cache *cache) +uint32_t ocf_metadata_get_pages_count(struct ocf_cache *cache) { struct ocf_metadata_ctrl *ctrl = NULL; diff --git a/src/metadata/metadata.h b/src/metadata/metadata.h index 6546702..c255685 100644 --- a/src/metadata/metadata.h +++ b/src/metadata/metadata.h @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation + * Copyright(c) 2025 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -125,7 +126,7 @@ ocf_metadata_get_cachelines_count(struct ocf_cache *cache); * @param cache - Cache instance * @return Pages required for store metadata on cache device */ -ocf_cache_line_t ocf_metadata_get_pages_count(struct ocf_cache *cache); +uint32_t ocf_metadata_get_pages_count(struct ocf_cache *cache); /** * @brief Flush metadata diff --git a/src/metadata/metadata_internal.h b/src/metadata/metadata_internal.h index c529554..5fbd6bc 100644 --- a/src/metadata/metadata_internal.h +++ b/src/metadata/metadata_internal.h @@ -21,8 +21,8 @@ struct ocf_metadata_ctrl { ocf_cache_line_t cachelines; ocf_cache_line_t start_page; - ocf_cache_line_t count_pages_fixed; - ocf_cache_line_t count_pages_variable; + uint32_t count_pages_fixed; + uint32_t count_pages_variable; uint32_t device_lines; size_t mapping_size; struct ocf_metadata_raw raw_desc[metadata_segment_max]; diff --git a/src/metadata/metadata_passive_update.c b/src/metadata/metadata_passive_update.c index 9ab2647..bfaeca6 100644 --- a/src/metadata/metadata_passive_update.c +++ b/src/metadata/metadata_passive_update.c @@ -76,7 +76,6 @@ static void passive_io_page_lock_acquired(struct ocf_request *req) int ocf_metadata_passive_update(struct ocf_request *master) { ocf_cache_t cache = master->cache; - struct ocf_metadata_ctrl *ctrl = cache->metadata.priv; uint64_t io_start_page = BYTES_TO_PAGES(master->addr); uint64_t io_end_page = io_start_page + BYTES_TO_PAGES(master->bytes); struct ocf_request *req; @@ -87,7 +86,7 @@ int ocf_metadata_passive_update(struct ocf_request *master) return 0; } - if (io_start_page >= ctrl->count_pages_fixed + ctrl->count_pages_variable) { + if (io_start_page >= ocf_metadata_get_pages_count(cache)) { master->complete(master, 0); return 0; }