X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=smalloc.c;h=b21a03d96f168af2c42c57d7fcae1c37c99fbd0d;hp=9a7c25bf058899449109a5f1f15792db08738fbf;hb=136f6b79180f6bd3f3e9ec8a97b9636a1bb71e15;hpb=9c5b52907227f8f50dc472d11601869f75b8d663;ds=sidebyside diff --git a/smalloc.c b/smalloc.c index 9a7c25bf..b21a03d9 100644 --- a/smalloc.c +++ b/smalloc.c @@ -13,16 +13,12 @@ #include "mutex.h" -#undef ENABLE_RESIZE /* define to enable pool resizing */ #define MP_SAFE /* define to made allocator thread safe */ -#define INITIAL_SIZE 65536 /* new pool size */ +#define INITIAL_SIZE 1048576 /* new pool size */ #define MAX_POOLS 32 /* maximum number of pools to setup */ -#ifdef ENABLE_RESIZE -#define MAX_SIZE 8 * INITIAL_SIZE -static unsigned int resize_error; -#endif +unsigned int smalloc_pool_size = INITIAL_SIZE; struct pool { struct fio_mutex *lock; /* protects this pool */ @@ -173,52 +169,7 @@ static int compact_pool(struct pool *pool) return !!compacted; } -static int resize_pool(struct pool *pool) -{ -#ifdef ENABLE_RESIZE - unsigned int new_size = pool->size << 1; - struct mem_hdr *hdr, *last_hdr; - void *ptr; - - if (new_size >= MAX_SIZE || resize_error) - return 1; - - if (ftruncate(pool->fd, new_size) < 0) - goto fail; - - ptr = mremap(pool->map, pool->size, new_size, 0); - if (ptr == MAP_FAILED) - goto fail; - - pool->map = ptr; - hdr = pool; - do { - last_hdr = hdr; - } while ((hdr = hdr_nxt(hdr)) != NULL); - - if (hdr_free(last_hdr)) { - last_hdr->size = hdr_size(last_hdr) + new_size - pool_size; - hdr_mark_free(last_hdr); - } else { - struct mem_hdr *nxt; - - nxt = (void *) last_hdr + hdr_size(last_hdr) + sizeof(*hdr); - nxt->size = new_size - pool_size - sizeof(*hdr); - hdr_mark_free(nxt); - } - - pool_room += new_size - pool_size; - pool_size = new_size; - return 0; -fail: - perror("resize"); - resize_error = 1; -#else - return 1; -#endif -} - -static int add_pool(struct pool *pool) +static int add_pool(struct pool *pool, unsigned int alloc_size) { struct mem_hdr *hdr; void *ptr; @@ -229,7 +180,12 @@ static int add_pool(struct pool *pool) if (fd < 0) goto out_close; - pool->size = INITIAL_SIZE; + alloc_size += sizeof(*hdr); + if (alloc_size > smalloc_pool_size) + pool->size = alloc_size; + else + pool->size = smalloc_pool_size; + if (ftruncate(fd, pool->size) < 0) goto out_unlink; @@ -268,11 +224,12 @@ out_close: void sinit(void) { - int ret = add_pool(&mp[0]); + int ret; #ifdef MP_SAFE lock = fio_mutex_rw_init(); #endif + ret = add_pool(&mp[0], INITIAL_SIZE); assert(!ret); } @@ -328,6 +285,9 @@ void sfree(void *ptr) struct pool *pool = NULL; unsigned int i; + if (!ptr) + return; + global_read_lock(); for (i = 0; i < nr_pools; i++) { @@ -349,21 +309,21 @@ static void *smalloc_pool(struct pool *pool, unsigned int size) int did_restart = 0; void *ret; - /* - * slight chance of race with sfree() here, but acceptable - */ - if (!size || size > pool->room + sizeof(*hdr) || - ((size > pool->largest_block) && pool->largest_block)) + if (!size) return NULL; pool_lock(pool); + if (size > pool->room + sizeof(*hdr)) + goto fail; + if ((size > pool->largest_block) && pool->largest_block) + goto fail; restart: hdr = pool->last; prv = NULL; do { if (combine(pool, prv, hdr)) hdr = prv; - + if (hdr_free(hdr) && hdr_size(hdr) >= size) break; @@ -410,20 +370,12 @@ fail: * if we fail to allocate, first compact the entries that we missed. * if that also fails, increase the size of the pool */ - ++did_restart; - if (did_restart <= 1) { + if (++did_restart <= 1) { if (!compact_pool(pool)) { pool->last = pool->map; goto restart; } } - ++did_restart; - if (did_restart <= 2) { - if (!resize_pool(pool)) { - pool->last = pool->map; - goto restart; - } - } pool_unlock(pool); return NULL; } @@ -455,7 +407,7 @@ void *smalloc(unsigned int size) else { i = nr_pools; global_read_unlock(); - if (add_pool(&mp[nr_pools])) + if (add_pool(&mp[nr_pools], size)) goto out; global_read_lock(); }