Skip to content

Commit

Permalink
Split count_pages and update on metadata deinit
Browse files Browse the repository at this point in the history
This resets count_pages_variable on cache-detach, so during the following
cache-attach metadata size is calculated properly.

Signed-off-by: Daniel Madej <daniel.madej@huawei.com>
  • Loading branch information
Deixx committed Feb 4, 2025
1 parent e630b81 commit 26cfd37
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 13 deletions.
23 changes: 13 additions & 10 deletions src/metadata/metadata.c
Original file line number Diff line number Diff line change
@@ -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
*/

Expand Down Expand Up @@ -271,7 +271,7 @@ static int ocf_metadata_calculate_metadata_size(
lowest_diff = cache_lines;

do {
count_pages = ctrl->count_pages;
count_pages = ctrl->count_pages_variable;
for (i = metadata_segment_variable_size_start;
i < metadata_segment_max; i++) {
struct ocf_metadata_raw *raw = &ctrl->raw_desc[i];
Expand All @@ -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);

Expand Down Expand Up @@ -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 */
Expand All @@ -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);

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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];

Expand Down Expand Up @@ -787,7 +789,8 @@ int ocf_metadata_init_variable_size(struct ocf_cache *cache,
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;
Expand Down Expand Up @@ -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;
}

/*
Expand Down
4 changes: 3 additions & 1 deletion src/metadata/metadata_internal.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright(c) 2020-2021 Intel Corporation
* Copyright(c) 2025 Huawei Technologies
* SPDX-License-Identifier: BSD-3-Clause
*/

Expand All @@ -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];
Expand Down
4 changes: 2 additions & 2 deletions src/metadata/metadata_passive_update.c
Original file line number Diff line number Diff line change
@@ -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
*/

Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 26cfd37

Please sign in to comment.