smalloc: when adding a new pool, make it big enough to hold the failing alloc
authorJens Axboe <jens.axboe@oracle.com>
Wed, 16 Apr 2008 17:43:17 +0000 (19:43 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 16 Apr 2008 17:43:17 +0000 (19:43 +0200)
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
smalloc.c

index 5baf5a43b711d1a8850a67dd0a39f69e0ee333be..28f82633b23661c9e49f80612ac2c6d550c4fa8e 100644 (file)
--- a/smalloc.c
+++ b/smalloc.c
@@ -220,7 +220,7 @@ fail:
 #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;
@@ -231,7 +231,11 @@ static int add_pool(struct pool *pool)
        if (fd < 0)
                goto out_close;
 
-       pool->size = smalloc_pool_size;
+       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;
 
@@ -275,7 +279,7 @@ void sinit(void)
 #ifdef MP_SAFE
        lock = fio_mutex_rw_init();
 #endif
-       ret = add_pool(&mp[0]);
+       ret = add_pool(&mp[0], INITIAL_SIZE);
        assert(!ret);
 }
 
@@ -458,7 +462,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();
                }