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;
|
metadata->iface_priv = ctrl;
|
||||||
|
|
||||||
for (i = 0; i < metadata_segment_fixed_size_max; i++) {
|
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)
|
if (result)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -880,6 +881,23 @@ exit:
|
|||||||
ocf_metadata_query_cores_end(context, err);
|
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
|
* 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_metadata_hash_ctrl *ctrl = NULL;
|
||||||
struct ocf_cache_line_settings *settings =
|
struct ocf_cache_line_settings *settings =
|
||||||
(struct ocf_cache_line_settings *)&cache->metadata.settings;
|
(struct ocf_cache_line_settings *)&cache->metadata.settings;
|
||||||
|
ocf_flush_page_synch_t lock_page, unlock_page;
|
||||||
|
|
||||||
OCF_DEBUG_TRACE(cache);
|
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;
|
for (i = metadata_segment_variable_size_start;
|
||||||
i < metadata_segment_max; i++) {
|
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)
|
if (result)
|
||||||
goto finalize;
|
goto finalize;
|
||||||
|
@ -90,6 +90,8 @@ static int _raw_ram_deinit(ocf_cache_t cache,
|
|||||||
* RAM Implementation - Initialize
|
* RAM Implementation - Initialize
|
||||||
*/
|
*/
|
||||||
static int _raw_ram_init(ocf_cache_t cache,
|
static int _raw_ram_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 ocf_metadata_raw *raw)
|
||||||
{
|
{
|
||||||
size_t mem_pool_size;
|
size_t mem_pool_size;
|
||||||
@ -105,6 +107,9 @@ static int _raw_ram_init(ocf_cache_t cache,
|
|||||||
return -OCF_ERR_NO_MEM;
|
return -OCF_ERR_NO_MEM;
|
||||||
ENV_BUG_ON(env_memset(raw->mem_pool, mem_pool_size, 0));
|
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;
|
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);
|
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);
|
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);
|
ctx_data_zero_check(cache->owner, data, PAGE_SIZE - size);
|
||||||
|
|
||||||
return 0;
|
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);
|
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);
|
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);
|
ctx_data_zero_check(cache->owner, data, PAGE_SIZE - size);
|
||||||
|
|
||||||
return 0;
|
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,
|
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)
|
struct ocf_metadata_raw *raw)
|
||||||
{
|
{
|
||||||
ENV_BUG_ON(raw->raw_type < metadata_raw_type_min);
|
ENV_BUG_ON(raw->raw_type < metadata_raw_type_min);
|
||||||
ENV_BUG_ON(raw->raw_type >= metadata_raw_type_max);
|
ENV_BUG_ON(raw->raw_type >= metadata_raw_type_max);
|
||||||
|
|
||||||
raw->iface = &(IRAW[raw->raw_type]);
|
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,
|
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 */
|
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
|
* @brief RAW instance descriptor
|
||||||
*/
|
*/
|
||||||
@ -75,6 +83,9 @@ struct ocf_metadata_raw {
|
|||||||
size_t mem_pool_limit; /*! Current memory pool size (limit) */
|
size_t mem_pool_limit; /*! Current memory pool size (limit) */
|
||||||
|
|
||||||
void *priv; /*!< Private data - context */
|
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 {
|
struct raw_iface {
|
||||||
int (*init)(ocf_cache_t cache,
|
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);
|
struct ocf_metadata_raw *raw);
|
||||||
|
|
||||||
int (*deinit)(ocf_cache_t cache,
|
int (*deinit)(ocf_cache_t cache,
|
||||||
@ -131,10 +144,14 @@ struct raw_iface {
|
|||||||
* @brief Initialize RAW instance
|
* @brief Initialize RAW instance
|
||||||
*
|
*
|
||||||
* @param cache - Cache 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
|
* @param raw - RAW descriptor
|
||||||
* @return 0 - Operation success, otherwise error
|
* @return 0 - Operation success, otherwise error
|
||||||
*/
|
*/
|
||||||
int ocf_metadata_raw_init(ocf_cache_t cache,
|
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);
|
struct ocf_metadata_raw *raw);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -141,6 +141,8 @@ int raw_dynamic_deinit(ocf_cache_t cache,
|
|||||||
* RAM DYNAMIC Implementation - Initialize
|
* RAM DYNAMIC Implementation - Initialize
|
||||||
*/
|
*/
|
||||||
int raw_dynamic_init(ocf_cache_t cache,
|
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 ocf_metadata_raw *raw)
|
||||||
{
|
{
|
||||||
struct _raw_ctrl *ctrl;
|
struct _raw_ctrl *ctrl;
|
||||||
@ -164,6 +166,9 @@ int raw_dynamic_init(ocf_cache_t cache,
|
|||||||
|
|
||||||
raw->priv = ctrl;
|
raw->priv = ctrl;
|
||||||
|
|
||||||
|
raw->lock_page = lock_page_pfn;
|
||||||
|
raw->unlock_page = unlock_page_pfn;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,8 +509,12 @@ static int raw_dynamic_flush_all_fill(ocf_cache_t cache,
|
|||||||
|
|
||||||
if (ctrl->pages[raw_page]) {
|
if (ctrl->pages[raw_page]) {
|
||||||
OCF_DEBUG_PARAM(cache, "Page = %u", 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],
|
ctx_data_wr_check(cache->owner, data, ctrl->pages[raw_page],
|
||||||
PAGE_SIZE);
|
PAGE_SIZE);
|
||||||
|
if (raw->unlock_page)
|
||||||
|
raw->unlock_page(cache, raw, raw_page);
|
||||||
} else {
|
} else {
|
||||||
OCF_DEBUG_PARAM(cache, "Zero fill, Page = %u", raw_page);
|
OCF_DEBUG_PARAM(cache, "Zero fill, Page = %u", raw_page);
|
||||||
/* Page was not allocated before set only zeros */
|
/* Page was not allocated before set only zeros */
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
* RAW DYNAMIC - Initialize
|
* RAW DYNAMIC - Initialize
|
||||||
*/
|
*/
|
||||||
int raw_dynamic_init(ocf_cache_t cache,
|
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 ocf_metadata_raw *raw);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user