Lock collision page in metadata flush

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2019-09-25 00:01:57 -04:00
parent be3b402162
commit 41d3542952
5 changed files with 78 additions and 4 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);
/**

View File

@ -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 */

View File

@ -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);
/*