From: Jens Axboe Date: Thu, 12 Jun 2008 09:50:47 +0000 (+0200) Subject: smalloc: convert to spinlocks X-Git-Tag: fio-1.22-rc1~23 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=3f1959101ed6a935ff3e2aec0fe7f5828f23fbcb smalloc: convert to spinlocks Makes the allocator 10-20% faster. Signed-off-by: Jens Axboe --- diff --git a/smalloc.c b/smalloc.c index 0a86c43b..8eb0f2a0 100644 --- a/smalloc.c +++ b/smalloc.c @@ -11,10 +11,9 @@ #include #include -#include "mutex.h" #include "arch/arch.h" +#include "spinlock.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 */ @@ -30,7 +29,7 @@ unsigned int smalloc_pool_size = INITIAL_SIZE; struct pool { - struct fio_mutex *lock; /* protects this pool */ + struct fio_spinlock *lock; void *map; /* map of blocks */ unsigned int *bitmap; /* blocks free/busy map */ unsigned int free_blocks; /* free blocks */ @@ -51,42 +50,36 @@ struct block_hdr { static struct pool mp[MAX_POOLS]; static unsigned int nr_pools; static unsigned int last_pool; -static struct fio_mutex *lock; +static struct fio_spinlock *slock; static inline void pool_lock(struct pool *pool) { - if (pool->lock) - fio_mutex_down(pool->lock); + fio_spin_lock(pool->lock); } static inline void pool_unlock(struct pool *pool) { - if (pool->lock) - fio_mutex_up(pool->lock); + fio_spin_unlock(pool->lock); } static inline void global_read_lock(void) { - if (lock) - fio_mutex_down_read(lock); + fio_spin_lock(slock); } static inline void global_read_unlock(void) { - if (lock) - fio_mutex_up_read(lock); + fio_spin_unlock(slock); } static inline void global_write_lock(void) { - if (lock) - fio_mutex_down_write(lock); + fio_spin_lock(slock); } static inline void global_write_unlock(void) { - if (lock) - fio_mutex_up_write(lock); + fio_spin_unlock(slock); } static inline int ptr_valid(struct pool *pool, void *ptr) @@ -218,11 +211,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); + pool->lock = fio_spinlock_init(); if (!pool->lock) goto out_unlink; -#endif pool->fd = fd; @@ -245,9 +236,8 @@ void sinit(void) { int ret; -#ifdef MP_SAFE - lock = fio_mutex_rw_init(); -#endif + slock = fio_spinlock_init(); + assert(slock); ret = add_pool(&mp[0], INITIAL_SIZE); assert(!ret); } @@ -257,9 +247,7 @@ static void cleanup_pool(struct pool *pool) unlink(pool->file); close(pool->fd); munmap(pool->map, pool->mmap_size); - - if (pool->lock) - fio_mutex_remove(pool->lock); + fio_spinlock_remove(pool->lock); } void scleanup(void) @@ -269,8 +257,7 @@ void scleanup(void) for (i = 0; i < nr_pools; i++) cleanup_pool(&mp[i]); - if (lock) - fio_mutex_remove(lock); + fio_spinlock_remove(slock); } #ifdef SMALLOC_REDZONE