summaryrefslogtreecommitdiff
path: root/smalloc.c
diff options
context:
space:
mode:
authorJens Axboe <jaxboe@fusionio.com>2011-06-29 09:50:08 +0200
committerJens Axboe <jaxboe@fusionio.com>2011-06-29 09:50:08 +0200
commit8d5844e9df308cc06d86a83d6bf28a29db46b6a9 (patch)
treebb8733c8496024d1792d7d43f5b9eb84d0441ee5 /smalloc.c
parent5982a925647f5d376bd7c2aca27e49b4cfe4a2c1 (diff)
downloadfio-8d5844e9df308cc06d86a83d6bf28a29db46b6a9.tar.gz
Make smalloc use anonymous memory mmaps
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'smalloc.c')
-rw-r--r--smalloc.c36
1 files changed, 6 insertions, 30 deletions
diff --git a/smalloc.c b/smalloc.c
index fdf7d22e..a925a653 100644
--- a/smalloc.c
+++ b/smalloc.c
@@ -38,7 +38,6 @@ struct pool {
unsigned int free_blocks; /* free blocks */
unsigned int nr_blocks; /* total blocks */
unsigned int next_non_full;
- int fd; /* memory backing fd */
unsigned int mmap_size;
};
@@ -178,14 +177,9 @@ static int find_next_zero(int word, int start)
static int add_pool(struct pool *pool, unsigned int alloc_size)
{
- int fd, bitmap_blocks;
- char file[] = "/tmp/.fio_smalloc.XXXXXX";
+ int bitmap_blocks;
void *ptr;
- fd = mkstemp(file);
- if (fd < 0)
- goto out_close;
-
#ifdef SMALLOC_REDZONE
alloc_size += sizeof(unsigned int);
#endif
@@ -202,16 +196,10 @@ static int add_pool(struct pool *pool, unsigned int alloc_size)
pool->nr_blocks = bitmap_blocks;
pool->free_blocks = bitmap_blocks * SMALLOC_BPB;
-#ifdef FIO_HAVE_FALLOCATE
- posix_fallocate(fd, 0, alloc_size);
-#endif
-
- if (ftruncate(fd, alloc_size) < 0)
- goto out_unlink;
-
- ptr = mmap(NULL, alloc_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+ ptr = mmap(NULL, alloc_size, PROT_READ|PROT_WRITE,
+ MAP_SHARED | OS_MAP_ANON, -1, 0);
if (ptr == MAP_FAILED)
- goto out_unlink;
+ goto out_fail;
memset(ptr, 0, alloc_size);
pool->map = ptr;
@@ -219,25 +207,14 @@ static int add_pool(struct pool *pool, unsigned int alloc_size)
pool->lock = fio_mutex_init(1);
if (!pool->lock)
- goto out_unlink;
-
- /*
- * Unlink pool file now. It wont get deleted until the fd is closed,
- * which happens both for cleanup or unexpected quit. This way we
- * don't leave temp files around in case of a crash.
- */
- unlink(file);
- pool->fd = fd;
+ goto out_fail;
nr_pools++;
return 0;
-out_unlink:
+out_fail:
fprintf(stderr, "smalloc: failed adding pool\n");
if (pool->map)
munmap(pool->map, pool->mmap_size);
- unlink(file);
-out_close:
- close(fd);
return 1;
}
@@ -256,7 +233,6 @@ static void cleanup_pool(struct pool *pool)
* This will also remove the temporary file we used as a backing
* store, it was already unlinked
*/
- close(pool->fd);
munmap(pool->map, pool->mmap_size);
if (pool->lock)