X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=smalloc.c;h=447d5c55fe3336986c490c068a5f919a100b55cf;hp=67cb7cc11d475b81aef3d53a7eb896eee31504bb;hb=7d1bb70f3d85d041b4b7dd926e98054fea980bdc;hpb=23bd40f944b7b5adb776d92cf614107be2a56445 diff --git a/smalloc.c b/smalloc.c index 67cb7cc1..447d5c55 100644 --- a/smalloc.c +++ b/smalloc.c @@ -26,7 +26,7 @@ #define SMALLOC_BPL (SMALLOC_BPB * SMALLOC_BPI) #define INITIAL_SIZE 16*1024*1024 /* new pool size */ -#define MAX_POOLS 1 /* maximum number of pools to setup */ +#define MAX_POOLS 8 /* maximum number of pools to setup */ #define SMALLOC_PRE_RED 0xdeadbeefU #define SMALLOC_POST_RED 0x5aa55aa5U @@ -230,11 +230,21 @@ out_fail: void sinit(void) { - int ret; + int i, ret; lock = fio_rwlock_init(); - ret = add_pool(&mp[0], INITIAL_SIZE); - assert(!ret); + + for (i = 0; i < MAX_POOLS; i++) { + ret = add_pool(&mp[i], INITIAL_SIZE); + if (ret) + break; + } + + /* + * If we added at least one pool, we should be OK for most + * cases. + */ + assert(i); } static void cleanup_pool(struct pool *pool) @@ -353,8 +363,12 @@ void sfree(void *ptr) global_read_unlock(); - assert(pool); - sfree_pool(pool, ptr); + if (pool) { + sfree_pool(pool, ptr); + return; + } + + log_err("smalloc: ptr %p not from smalloc pool\n", ptr); } static void *__smalloc_pool(struct pool *pool, size_t size) @@ -442,16 +456,17 @@ static void *smalloc_pool(struct pool *pool, size_t size) void *smalloc(size_t size) { - unsigned int i; + unsigned int i, end_pool; if (size != (unsigned int) size) return NULL; global_write_lock(); i = last_pool; + end_pool = nr_pools; do { - for (; i < nr_pools; i++) { + for (; i < end_pool; i++) { void *ptr = smalloc_pool(&mp[i], size); if (ptr) { @@ -461,20 +476,14 @@ void *smalloc(size_t size) } } if (last_pool) { - last_pool = 0; + end_pool = last_pool; + last_pool = i = 0; continue; } - if (nr_pools + 1 > MAX_POOLS) - break; - else { - i = nr_pools; - if (add_pool(&mp[nr_pools], size)) - goto out; - } + break; } while (1); -out: global_write_unlock(); return NULL; } @@ -492,9 +501,10 @@ void *scalloc(size_t nmemb, size_t size) char *smalloc_strdup(const char *str) { - char *ptr; + char *ptr = NULL; ptr = smalloc(strlen(str) + 1); - strcpy(ptr, str); + if (ptr) + strcpy(ptr, str); return ptr; }