X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=smalloc.c;h=42008ebfdb6e44732c469b596b7be65786031231;hp=1e72068541bac82449eb9f13dc3b2cd790247768;hb=8489dae4360f2b00d89a6e9603c6167314b1974d;hpb=b8a6582e89999f88c574b905b89743762d8080df diff --git a/smalloc.c b/smalloc.c index 1e720685..42008ebf 100644 --- a/smalloc.c +++ b/smalloc.c @@ -10,24 +10,26 @@ #include #include #include +#include #include "mutex.h" #include "arch/arch.h" +#include "os/os.h" -#define MP_SAFE /* define to make thread safe */ #define SMALLOC_REDZONE /* define to detect memory corruption */ #define SMALLOC_BPB 32 /* block size, bytes-per-bit in bitmap */ #define SMALLOC_BPI (sizeof(unsigned int) * 8) #define SMALLOC_BPL (SMALLOC_BPB * SMALLOC_BPI) -#define INITIAL_SIZE 1024*1024 /* new pool size */ +#define INITIAL_SIZE 8192*1024 /* new pool size */ #define MAX_POOLS 128 /* maximum number of pools to setup */ #define SMALLOC_PRE_RED 0xdeadbeefU #define SMALLOC_POST_RED 0x5aa55aa5U unsigned int smalloc_pool_size = INITIAL_SIZE; +const int int_mask = sizeof(int) - 1; struct pool { struct fio_mutex *lock; /* protects this pool */ @@ -54,38 +56,32 @@ static struct fio_mutex *lock; static inline void pool_lock(struct pool *pool) { - if (pool->lock) - fio_mutex_down(pool->lock); + fio_mutex_down(pool->lock); } static inline void pool_unlock(struct pool *pool) { - if (pool->lock) - fio_mutex_up(pool->lock); + fio_mutex_up(pool->lock); } static inline void global_read_lock(void) { - if (lock) - fio_mutex_down_read(lock); + fio_mutex_down_read(lock); } static inline void global_read_unlock(void) { - if (lock) - fio_mutex_up_read(lock); + fio_mutex_up_read(lock); } static inline void global_write_lock(void) { - if (lock) - fio_mutex_down_write(lock); + fio_mutex_down_write(lock); } static inline void global_write_unlock(void) { - if (lock) - fio_mutex_up_write(lock); + fio_mutex_up_write(lock); } static inline int ptr_valid(struct pool *pool, void *ptr) @@ -202,10 +198,22 @@ static int add_pool(struct pool *pool, unsigned int alloc_size) bitmap_blocks = alloc_size / SMALLOC_BPL; alloc_size += bitmap_blocks * sizeof(unsigned int); pool->mmap_size = alloc_size; - + pool->nr_blocks = bitmap_blocks; pool->free_blocks = bitmap_blocks * SMALLOC_BPB; +#ifdef FIO_HAVE_FALLOCATE + { + int ret; + + ret = posix_fallocate(fd, 0, alloc_size); + if (ret > 0) { + fprintf(stderr, "posix_fallocate pool file failed: %s\n", strerror(ret)); + goto out_unlink; + } + } +#endif + if (ftruncate(fd, alloc_size) < 0) goto out_unlink; @@ -217,11 +225,9 @@ static int add_pool(struct pool *pool, unsigned int alloc_size) pool->map = ptr; pool->bitmap = (void *) ptr + (pool->nr_blocks * SMALLOC_BPL); -#ifdef MP_SAFE pool->lock = fio_mutex_init(1); if (!pool->lock) goto out_unlink; -#endif /* * Unlink pool file now. It wont get deleted until the fd is closed, @@ -247,9 +253,7 @@ void sinit(void) { int ret; -#ifdef MP_SAFE lock = fio_mutex_rw_init(); -#endif ret = add_pool(&mp[0], INITIAL_SIZE); assert(!ret); } @@ -279,9 +283,19 @@ void scleanup(void) } #ifdef SMALLOC_REDZONE +static void *postred_ptr(struct block_hdr *hdr) +{ + unsigned long ptr; + + ptr = (unsigned long) hdr + hdr->size - sizeof(unsigned int); + ptr = (ptr + int_mask) & ~int_mask; + + return (void *) ptr; +} + static void fill_redzone(struct block_hdr *hdr) { - unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int); + unsigned int *postred = postred_ptr(hdr); hdr->prered = SMALLOC_PRE_RED; *postred = SMALLOC_POST_RED; @@ -289,7 +303,7 @@ static void fill_redzone(struct block_hdr *hdr) static void sfree_check_redzone(struct block_hdr *hdr) { - unsigned int *postred = (void *) hdr + hdr->size - sizeof(unsigned int); + unsigned int *postred = postred_ptr(hdr); if (hdr->prered != SMALLOC_PRE_RED) { fprintf(stderr, "smalloc pre redzone destroyed!\n"); @@ -425,8 +439,13 @@ static void *smalloc_pool(struct pool *pool, unsigned int size) unsigned int alloc_size = size + sizeof(struct block_hdr); void *ptr; + /* + * Round to int alignment, so that the postred pointer will + * be naturally aligned as well. + */ #ifdef SMALLOC_REDZONE alloc_size += sizeof(unsigned int); + alloc_size = (alloc_size + int_mask) & ~int_mask; #endif ptr = __smalloc_pool(pool, alloc_size);