X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=smalloc.c;h=409998aa8ad5a66ebbc8ac7d2fb620553ac75880;hb=efcc4586d3c8974118fd66d53a09ffd739d77d11;hp=e82ef1da0b59faab23a706db1257808c3fb10bbb;hpb=2e3e31e36b3565dcc5e36ba3842e7b207799601f;p=fio.git diff --git a/smalloc.c b/smalloc.c index e82ef1da..409998aa 100644 --- a/smalloc.c +++ b/smalloc.c @@ -20,13 +20,14 @@ #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 */ @@ -195,7 +196,7 @@ 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; @@ -268,9 +269,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; @@ -278,7 +289,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"); @@ -414,8 +425,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);