Parallelize initializing collision section
Signed-off-by: Michal Mielewczyk <michal.mielewczyk@intel.com>
This commit is contained in:
parent
b50bd1b506
commit
4dbf740f5b
@ -18,6 +18,7 @@
|
|||||||
#include "../utils/utils_cache_line.h"
|
#include "../utils/utils_cache_line.h"
|
||||||
#include "../utils/utils_io.h"
|
#include "../utils/utils_io.h"
|
||||||
#include "../utils/utils_pipeline.h"
|
#include "../utils/utils_pipeline.h"
|
||||||
|
#include "../utils/utils_parallelize.h"
|
||||||
|
|
||||||
|
|
||||||
#define OCF_METADATA_DEBUG 0
|
#define OCF_METADATA_DEBUG 0
|
||||||
@ -831,23 +832,66 @@ static inline void _ocf_init_collision_entry(struct ocf_cache *cache,
|
|||||||
/*
|
/*
|
||||||
* Initialize collision table
|
* Initialize collision table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int ocf_metadata_init_collision_handle(ocf_parallelize_t parallelize,
|
||||||
|
void *priv, unsigned shard_id, unsigned shards_cnt)
|
||||||
|
{
|
||||||
|
struct ocf_init_metadata_context *context = priv;
|
||||||
|
ocf_cache_t cache = context->cache;
|
||||||
|
ocf_cache_line_t collision_table_entries = cache->device->collision_table_entries;
|
||||||
|
uint32_t entry, portion, begin, end, step=0;
|
||||||
|
|
||||||
|
portion = OCF_DIV_ROUND_UP((uint64_t)collision_table_entries, shards_cnt);
|
||||||
|
begin = portion*shard_id;
|
||||||
|
end = OCF_MIN(portion*(shard_id + 1), collision_table_entries);
|
||||||
|
|
||||||
|
for (entry = begin; entry < end; entry++) {
|
||||||
|
OCF_COND_RESCHED_DEFAULT(step);
|
||||||
|
|
||||||
|
if (entry >= collision_table_entries)
|
||||||
|
break;
|
||||||
|
|
||||||
|
_ocf_init_collision_entry(cache, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ocf_metadata_init_finish(ocf_parallelize_t parallelize,
|
||||||
|
void *priv, int error)
|
||||||
|
{
|
||||||
|
struct ocf_init_metadata_context *context = priv;
|
||||||
|
|
||||||
|
ocf_pipeline_next(context->pipeline);
|
||||||
|
|
||||||
|
ocf_parallelize_destroy(parallelize);
|
||||||
|
}
|
||||||
|
|
||||||
void ocf_metadata_init_collision(ocf_pipeline_t pipeline, void *priv,
|
void ocf_metadata_init_collision(ocf_pipeline_t pipeline, void *priv,
|
||||||
ocf_pipeline_arg_t arg)
|
ocf_pipeline_arg_t arg)
|
||||||
{
|
{
|
||||||
struct ocf_init_metadata_context *context = priv;
|
struct ocf_init_metadata_context *context = priv;
|
||||||
|
struct ocf_init_metadata_context *parallel_context;
|
||||||
ocf_cache_t cache = context->cache;
|
ocf_cache_t cache = context->cache;
|
||||||
unsigned int i;
|
ocf_parallelize_t parallelize;
|
||||||
unsigned int step = 0;
|
int result;
|
||||||
|
|
||||||
if (context->skip_collision)
|
if (context->skip_collision)
|
||||||
OCF_PL_NEXT_RET(pipeline);
|
OCF_PL_NEXT_RET(pipeline);
|
||||||
|
|
||||||
for (i = 0; i < cache->device->collision_table_entries; i++) {
|
result = ocf_parallelize_create(¶llelize, cache,
|
||||||
_ocf_init_collision_entry(cache, i);
|
ocf_cache_get_queue_count(cache), sizeof(*context),
|
||||||
OCF_COND_RESCHED_DEFAULT(step);
|
ocf_metadata_init_collision_handle,
|
||||||
}
|
ocf_metadata_init_finish);
|
||||||
|
if (result)
|
||||||
|
OCF_PL_FINISH_RET(pipeline, result);
|
||||||
|
|
||||||
ocf_pipeline_next(context->pipeline);
|
parallel_context = ocf_parallelize_get_priv(parallelize);
|
||||||
|
|
||||||
|
parallel_context->pipeline = pipeline;
|
||||||
|
parallel_context->cache = cache;
|
||||||
|
|
||||||
|
ocf_parallelize_run(parallelize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user