Lock collision page in metadata flush
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
parent
be3b402162
commit
41d3542952
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user