Extend allocator API

Create function for directly changing the size of rpool backing created
allocator.

Signed-off-by: Jan Musial <jan.musial@intel.com>
This commit is contained in:
Jan Musial 2021-02-25 09:41:35 +01:00
parent c2c1d9eb4c
commit bcc55f4f3c
2 changed files with 28 additions and 18 deletions

View File

@ -45,7 +45,9 @@ void *env_allocator_new(env_allocator *allocator)
struct _env_allocator_item *item = NULL; struct _env_allocator_item *item = NULL;
int cpu; int cpu;
item = cas_rpool_try_get(allocator->rpool, &cpu); if (allocator->rpool)
item = cas_rpool_try_get(allocator->rpool, &cpu);
if (item) { if (item) {
memset(item->data, 0, allocator->item_size - memset(item->data, 0, allocator->item_size -
sizeof(struct _env_allocator_item)); 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 #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; int error = -1;
bool retry = true; 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); 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); allocator->name = kstrdup(name, ENV_MEM_NORMAL);
if (!allocator->name) { if (!allocator->name) {
@ -156,13 +152,17 @@ RETRY:
#endif #endif
/* Initialize reserve pool handler per cpu */ /* 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, if (rpool_limit > 0) {
allocator->name, allocator->item_size, env_allocator_new_rpool, allocator->rpool = cas_rpool_create(rpool_limit,
env_allocator_del_rpool, allocator); allocator->name, allocator->item_size, env_allocator_new_rpool,
if (!allocator->rpool) { env_allocator_del_rpool, allocator);
error = __LINE__; if (!allocator->rpool) {
goto err; error = __LINE__;
goto err;
}
} }
return allocator; return allocator;
@ -174,6 +174,11 @@ err:
return NULL; 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) void env_allocator_del(env_allocator *allocator, void *obj)
{ {
struct _env_allocator_item *item = 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) void env_allocator_destroy(env_allocator *allocator)
{ {
if (allocator) { if (allocator) {
cas_rpool_destroy(allocator->rpool, env_allocator_del_rpool, if (allocator->rpool) {
allocator); cas_rpool_destroy(allocator->rpool, env_allocator_del_rpool,
allocator->rpool = NULL; allocator);
allocator->rpool = NULL;
}
if (atomic_read(&allocator->count)) { if (atomic_read(&allocator->count)) {
printk(KERN_CRIT "Not all object deallocated\n"); printk(KERN_CRIT "Not all object deallocated\n");

View File

@ -78,6 +78,9 @@ static inline void env_secure_free(const void *ptr, size_t size)
typedef struct _env_allocator env_allocator; 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); env_allocator *env_allocator_create(uint32_t size, const char *name);
void env_allocator_destroy(env_allocator *allocator); void env_allocator_destroy(env_allocator *allocator);