X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=smalloc.c;h=b0173739b49c18254e5a425d58d09e9369a0792e;hp=a925a653e5d5571e9fff8686b7378efe3a343704;hb=9c6f63166eaecc13e4b2ca1d80cc1b5e6185fd43;hpb=8d5844e9df308cc06d86a83d6bf28a29db46b6a9 diff --git a/smalloc.c b/smalloc.c index a925a653..b0173739 100644 --- a/smalloc.c +++ b/smalloc.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -35,14 +36,14 @@ struct pool { struct fio_mutex *lock; /* protects this pool */ void *map; /* map of blocks */ unsigned int *bitmap; /* blocks free/busy map */ - unsigned int free_blocks; /* free blocks */ - unsigned int nr_blocks; /* total blocks */ - unsigned int next_non_full; - unsigned int mmap_size; + size_t free_blocks; /* free blocks */ + size_t nr_blocks; /* total blocks */ + size_t next_non_full; + size_t mmap_size; }; struct block_hdr { - unsigned int size; + size_t size; #ifdef SMALLOC_REDZONE unsigned int prered; #endif @@ -90,13 +91,13 @@ static inline int ptr_valid(struct pool *pool, void *ptr) return (ptr >= pool->map) && (ptr < pool->map + pool_size); } -static inline unsigned int size_to_blocks(unsigned int size) +static inline size_t size_to_blocks(size_t size) { return (size + SMALLOC_BPB - 1) / SMALLOC_BPB; } static int blocks_iter(struct pool *pool, unsigned int pool_idx, - unsigned int idx, unsigned int nr_blocks, + unsigned int idx, size_t nr_blocks, int (*func)(unsigned int *map, unsigned int mask)) { @@ -151,19 +152,19 @@ static int mask_set(unsigned int *map, unsigned int mask) } static int blocks_free(struct pool *pool, unsigned int pool_idx, - unsigned int idx, unsigned int nr_blocks) + unsigned int idx, size_t nr_blocks) { return blocks_iter(pool, pool_idx, idx, nr_blocks, mask_cmp); } static void set_blocks(struct pool *pool, unsigned int pool_idx, - unsigned int idx, unsigned int nr_blocks) + unsigned int idx, size_t nr_blocks) { blocks_iter(pool, pool_idx, idx, nr_blocks, mask_set); } static void clear_blocks(struct pool *pool, unsigned int pool_idx, - unsigned int idx, unsigned int nr_blocks) + unsigned int idx, size_t nr_blocks) { blocks_iter(pool, pool_idx, idx, nr_blocks, mask_clear); } @@ -171,8 +172,8 @@ static void clear_blocks(struct pool *pool, unsigned int pool_idx, static int find_next_zero(int word, int start) { assert(word != -1U); - word >>= (start + 1); - return ffz(word) + start + 1; + word >>= start; + return ffz(word) + start; } static int add_pool(struct pool *pool, unsigned int alloc_size) @@ -205,7 +206,7 @@ static int add_pool(struct pool *pool, unsigned int alloc_size) pool->map = ptr; pool->bitmap = (void *) ptr + (pool->nr_blocks * SMALLOC_BPL); - pool->lock = fio_mutex_init(1); + pool->lock = fio_mutex_init(FIO_MUTEX_UNLOCKED); if (!pool->lock) goto out_fail; @@ -253,9 +254,9 @@ void scleanup(void) #ifdef SMALLOC_REDZONE static void *postred_ptr(struct block_hdr *hdr) { - unsigned long ptr; + uintptr_t ptr; - ptr = (unsigned long) hdr + hdr->size - sizeof(unsigned int); + ptr = (uintptr_t) hdr + hdr->size - sizeof(unsigned int); ptr = (ptr + int_mask) & ~int_mask; return (void *) ptr; @@ -347,9 +348,9 @@ void sfree(void *ptr) sfree_pool(pool, ptr); } -static void *__smalloc_pool(struct pool *pool, unsigned int size) +static void *__smalloc_pool(struct pool *pool, size_t size) { - unsigned int nr_blocks; + size_t nr_blocks; unsigned int i; unsigned int offset; unsigned int last_idx; @@ -402,9 +403,9 @@ fail: return ret; } -static void *smalloc_pool(struct pool *pool, unsigned int size) +static void *smalloc_pool(struct pool *pool, size_t size) { - unsigned int alloc_size = size + sizeof(struct block_hdr); + size_t alloc_size = size + sizeof(struct block_hdr); void *ptr; /* @@ -430,10 +431,13 @@ static void *smalloc_pool(struct pool *pool, unsigned int size) return ptr; } -void *smalloc(unsigned int size) +void *smalloc(size_t size) { unsigned int i; + if (size != (unsigned int) size) + return NULL; + global_write_lock(); i = last_pool;