From 41d3542952aa6e8c01f99c72155852a6355ed6f2 Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Wed, 25 Sep 2019 00:01:57 -0400 Subject: [PATCH] Lock collision page in metadata flush Signed-off-by: Adam Rutkowski --- src/metadata/metadata_hash.c | 33 +++++++++++++++++++++++++++-- src/metadata/metadata_raw.c | 21 ++++++++++++++++-- src/metadata/metadata_raw.h | 17 +++++++++++++++ src/metadata/metadata_raw_dynamic.c | 9 ++++++++ src/metadata/metadata_raw_dynamic.h | 2 ++ 5 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/metadata/metadata_hash.c b/src/metadata/metadata_hash.c index a33e944..ae483c6 100644 --- a/src/metadata/metadata_hash.c +++ b/src/metadata/metadata_hash.c @@ -542,7 +542,8 @@ int ocf_metadata_hash_init(struct ocf_cache *cache, metadata->iface_priv = ctrl; for (i = 0; i < metadata_segment_fixed_size_max; i++) { - result |= ocf_metadata_raw_init(cache, &(ctrl->raw_desc[i])); + result |= ocf_metadata_raw_init(cache, NULL, NULL, + &(ctrl->raw_desc[i])); if (result) break; } @@ -880,6 +881,23 @@ exit: ocf_metadata_query_cores_end(context, err); } +static void ocf_metadata_hash_flush_lock_collision_page(struct ocf_cache *cache, + struct ocf_metadata_raw *raw, uint32_t page) + +{ + ocf_collision_start_exclusive_access(&cache->metadata.lock, + page); +} + +static void ocf_metadata_hash_flush_unlock_collision_page( + struct ocf_cache *cache, struct ocf_metadata_raw *raw, + uint32_t page) + +{ + ocf_collision_end_exclusive_access(&cache->metadata.lock, + page); +} + /* * Initialize hash metadata interface */ @@ -893,6 +911,7 @@ static int ocf_metadata_hash_init_variable_size(struct ocf_cache *cache, struct ocf_metadata_hash_ctrl *ctrl = NULL; struct ocf_cache_line_settings *settings = (struct ocf_cache_line_settings *)&cache->metadata.settings; + ocf_flush_page_synch_t lock_page, unlock_page; OCF_DEBUG_TRACE(cache); @@ -949,7 +968,17 @@ static int ocf_metadata_hash_init_variable_size(struct ocf_cache *cache, */ for (i = metadata_segment_variable_size_start; i < metadata_segment_max; i++) { - result |= ocf_metadata_raw_init(cache, &(ctrl->raw_desc[i])); + if (i == metadata_segment_collision) { + lock_page = + ocf_metadata_hash_flush_lock_collision_page; + unlock_page = + ocf_metadata_hash_flush_unlock_collision_page; + } else { + lock_page = unlock_page = NULL; + } + + result |= ocf_metadata_raw_init(cache, lock_page, unlock_page, + &(ctrl->raw_desc[i])); if (result) goto finalize; diff --git a/src/metadata/metadata_raw.c b/src/metadata/metadata_raw.c index 633e64b..5a57b27 100644 --- a/src/metadata/metadata_raw.c +++ b/src/metadata/metadata_raw.c @@ -90,7 +90,9 @@ static int _raw_ram_deinit(ocf_cache_t cache, * RAM Implementation - Initialize */ static int _raw_ram_init(ocf_cache_t cache, - struct ocf_metadata_raw *raw) + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, + struct ocf_metadata_raw *raw) { size_t mem_pool_size; @@ -105,6 +107,9 @@ static int _raw_ram_init(ocf_cache_t cache, return -OCF_ERR_NO_MEM; ENV_BUG_ON(env_memset(raw->mem_pool, mem_pool_size, 0)); + raw->lock_page = lock_page_pfn; + raw->unlock_page = unlock_page_pfn; + return 0; } @@ -286,7 +291,12 @@ static int _raw_ram_flush_all_fill(ocf_cache_t cache, OCF_DEBUG_PARAM(cache, "Line = %u, Page = %u", line, raw_page); + if (raw->lock_page) + raw->lock_page(cache, raw, raw_page); ctx_data_wr_check(cache->owner, data, _RAW_RAM_ADDR(raw, line), size); + if (raw->unlock_page) + raw->unlock_page(cache, raw, raw_page); + ctx_data_zero_check(cache->owner, data, PAGE_SIZE - size); return 0; @@ -398,7 +408,12 @@ static int _raw_ram_flush_do_asynch_fill(ocf_cache_t cache, OCF_DEBUG_PARAM(cache, "Line = %u, Page = %u", line, raw_page); + if (raw->lock_page) + raw->lock_page(cache, raw, raw_page); ctx_data_wr_check(cache->owner, data, _RAW_RAM_ADDR(raw, line), size); + if (raw->unlock_page) + raw->unlock_page(cache, raw, raw_page); + ctx_data_zero_check(cache->owner, data, PAGE_SIZE - size); return 0; @@ -612,13 +627,15 @@ static const struct raw_iface IRAW[metadata_raw_type_max] = { ******************************************************************************/ int ocf_metadata_raw_init(ocf_cache_t cache, + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, struct ocf_metadata_raw *raw) { ENV_BUG_ON(raw->raw_type < metadata_raw_type_min); ENV_BUG_ON(raw->raw_type >= metadata_raw_type_max); raw->iface = &(IRAW[raw->raw_type]); - return raw->iface->init(cache, raw); + return raw->iface->init(cache, lock_page_pfn, unlock_page_pfn, raw); } int ocf_metadata_raw_deinit(ocf_cache_t cache, diff --git a/src/metadata/metadata_raw.h b/src/metadata/metadata_raw.h index 66b10ad..c9d46fb 100644 --- a/src/metadata/metadata_raw.h +++ b/src/metadata/metadata_raw.h @@ -42,6 +42,14 @@ enum ocf_metadata_raw_type { metadata_raw_type_min = metadata_raw_type_ram /*!< MAX */ }; +struct ocf_metadata_raw; + +/** + * @brief Container page lock/unlock callback + */ +typedef void (*ocf_flush_page_synch_t)(ocf_cache_t cache, + struct ocf_metadata_raw *raw, uint32_t page); + /** * @brief RAW instance descriptor */ @@ -75,6 +83,9 @@ struct ocf_metadata_raw { size_t mem_pool_limit; /*! Current memory pool size (limit) */ void *priv; /*!< Private data - context */ + + ocf_flush_page_synch_t lock_page; /*!< Page lock callback */ + ocf_flush_page_synch_t unlock_page; /*!< Page unlock callback */ }; /** @@ -82,6 +93,8 @@ struct ocf_metadata_raw { */ struct raw_iface { int (*init)(ocf_cache_t cache, + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, struct ocf_metadata_raw *raw); int (*deinit)(ocf_cache_t cache, @@ -131,10 +144,14 @@ struct raw_iface { * @brief Initialize RAW instance * * @param cache - Cache instance + * @param lock_page_pfn - Optional page lock callback + * @param lock_page_pfn - Optional page unlock callback * @param raw - RAW descriptor * @return 0 - Operation success, otherwise error */ int ocf_metadata_raw_init(ocf_cache_t cache, + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, struct ocf_metadata_raw *raw); /** diff --git a/src/metadata/metadata_raw_dynamic.c b/src/metadata/metadata_raw_dynamic.c index 9ef666b..d558b6c 100644 --- a/src/metadata/metadata_raw_dynamic.c +++ b/src/metadata/metadata_raw_dynamic.c @@ -141,6 +141,8 @@ int raw_dynamic_deinit(ocf_cache_t cache, * RAM DYNAMIC Implementation - Initialize */ int raw_dynamic_init(ocf_cache_t cache, + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, struct ocf_metadata_raw *raw) { struct _raw_ctrl *ctrl; @@ -164,6 +166,9 @@ int raw_dynamic_init(ocf_cache_t cache, raw->priv = ctrl; + raw->lock_page = lock_page_pfn; + raw->unlock_page = unlock_page_pfn; + return 0; } @@ -504,8 +509,12 @@ static int raw_dynamic_flush_all_fill(ocf_cache_t cache, if (ctrl->pages[raw_page]) { OCF_DEBUG_PARAM(cache, "Page = %u", raw_page); + if (raw->lock_page) + raw->lock_page(cache, raw, raw_page); ctx_data_wr_check(cache->owner, data, ctrl->pages[raw_page], PAGE_SIZE); + if (raw->unlock_page) + raw->unlock_page(cache, raw, raw_page); } else { OCF_DEBUG_PARAM(cache, "Zero fill, Page = %u", raw_page); /* Page was not allocated before set only zeros */ diff --git a/src/metadata/metadata_raw_dynamic.h b/src/metadata/metadata_raw_dynamic.h index b8f541b..facddf9 100644 --- a/src/metadata/metadata_raw_dynamic.h +++ b/src/metadata/metadata_raw_dynamic.h @@ -15,6 +15,8 @@ * RAW DYNAMIC - Initialize */ int raw_dynamic_init(ocf_cache_t cache, + ocf_flush_page_synch_t lock_page_pfn, + ocf_flush_page_synch_t unlock_page_pfn, struct ocf_metadata_raw *raw); /*