From bcc55f4f3c82e7636de27db6216575c64025cb6f Mon Sep 17 00:00:00 2001 From: Jan Musial Date: Thu, 25 Feb 2021 09:41:35 +0100 Subject: [PATCH] Extend allocator API Create function for directly changing the size of rpool backing created allocator. Signed-off-by: Jan Musial --- modules/cas_cache/ocf_env.c | 43 +++++++++++++++++++++---------------- modules/cas_cache/ocf_env.h | 3 +++ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/modules/cas_cache/ocf_env.c b/modules/cas_cache/ocf_env.c index 1206ed3..e4c55b1 100644 --- a/modules/cas_cache/ocf_env.c +++ b/modules/cas_cache/ocf_env.c @@ -45,7 +45,9 @@ void *env_allocator_new(env_allocator *allocator) struct _env_allocator_item *item = NULL; int cpu; - item = cas_rpool_try_get(allocator->rpool, &cpu); + if (allocator->rpool) + item = cas_rpool_try_get(allocator->rpool, &cpu); + if (item) { memset(item->data, 0, allocator->item_size - sizeof(struct _env_allocator_item)); @@ -91,7 +93,8 @@ static void env_allocator_del_rpool(void *allocator_ctx, void *_item) #define ENV_ALLOCATOR_NAME_MAX 128 -env_allocator *env_allocator_create(uint32_t size, const char *name) +env_allocator *env_allocator_create_extended(uint32_t size, const char *name, + int rpool_limit) { int error = -1; bool retry = true; @@ -112,13 +115,6 @@ env_allocator *env_allocator_create(uint32_t size, const char *name) } allocator->item_size = size + sizeof(struct _env_allocator_item); - if (allocator->item_size > PAGE_SIZE) { - printk(KERN_WARNING "Creating allocator with item size" - " greater than 4096B"); - ENV_WARN(true, OCF_PREFIX_SHORT" Creating allocator" - " with item size greater than 4096B\n"); - } - allocator->name = kstrdup(name, ENV_MEM_NORMAL); if (!allocator->name) { @@ -156,13 +152,17 @@ RETRY: #endif /* Initialize reserve pool handler per cpu */ + if (rpool_limit < 0) + rpool_limit = CAS_ALLOC_ALLOCATOR_LIMIT; - allocator->rpool = cas_rpool_create(CAS_ALLOC_ALLOCATOR_LIMIT, - allocator->name, allocator->item_size, env_allocator_new_rpool, - env_allocator_del_rpool, allocator); - if (!allocator->rpool) { - error = __LINE__; - goto err; + if (rpool_limit > 0) { + allocator->rpool = cas_rpool_create(rpool_limit, + allocator->name, allocator->item_size, env_allocator_new_rpool, + env_allocator_del_rpool, allocator); + if (!allocator->rpool) { + error = __LINE__; + goto err; + } } return allocator; @@ -174,6 +174,11 @@ err: return NULL; } +env_allocator *env_allocator_create(uint32_t size, const char *name) +{ + return env_allocator_create_extended(size, name, -1); +} + void env_allocator_del(env_allocator *allocator, void *obj) { struct _env_allocator_item *item = @@ -195,9 +200,11 @@ void env_allocator_del(env_allocator *allocator, void *obj) void env_allocator_destroy(env_allocator *allocator) { if (allocator) { - cas_rpool_destroy(allocator->rpool, env_allocator_del_rpool, - allocator); - allocator->rpool = NULL; + if (allocator->rpool) { + cas_rpool_destroy(allocator->rpool, env_allocator_del_rpool, + allocator); + allocator->rpool = NULL; + } if (atomic_read(&allocator->count)) { printk(KERN_CRIT "Not all object deallocated\n"); diff --git a/modules/cas_cache/ocf_env.h b/modules/cas_cache/ocf_env.h index e94ed97..04c8822 100644 --- a/modules/cas_cache/ocf_env.h +++ b/modules/cas_cache/ocf_env.h @@ -78,6 +78,9 @@ static inline void env_secure_free(const void *ptr, size_t size) typedef struct _env_allocator env_allocator; +env_allocator *env_allocator_create_extended(uint32_t size, const char *name, + int rpool_limit); + env_allocator *env_allocator_create(uint32_t size, const char *name); void env_allocator_destroy(env_allocator *allocator);