smalloc: get rid of global lock
[fio.git] / smalloc.c
index 5047cda5e3438c8215a3bb549577f5a81e5b0a29..b6b367ae9a6b5be292f0db870c393b90d18137ab 100644 (file)
--- a/smalloc.c
+++ b/smalloc.c
@@ -56,37 +56,6 @@ struct block_hdr {
 static struct pool mp[MAX_POOLS];
 static unsigned int nr_pools;
 static unsigned int last_pool;
-static struct fio_rwlock *lock;
-
-static inline void pool_lock(struct pool *pool)
-{
-       fio_mutex_down(pool->lock);
-}
-
-static inline void pool_unlock(struct pool *pool)
-{
-       fio_mutex_up(pool->lock);
-}
-
-static inline void global_read_lock(void)
-{
-       fio_rwlock_read(lock);
-}
-
-static inline void global_read_unlock(void)
-{
-       fio_rwlock_unlock(lock);
-}
-
-static inline void global_write_lock(void)
-{
-       fio_rwlock_write(lock);
-}
-
-static inline void global_write_unlock(void)
-{
-       fio_rwlock_unlock(lock);
-}
 
 static inline int ptr_valid(struct pool *pool, void *ptr)
 {
@@ -234,8 +203,6 @@ void sinit(void)
 {
        int i, ret;
 
-       lock = fio_rwlock_init();
-
        for (i = 0; i < MAX_POOLS; i++) {
                ret = add_pool(&mp[i], INITIAL_SIZE);
                if (ret)
@@ -267,9 +234,6 @@ void scleanup(void)
 
        for (i = 0; i < nr_pools; i++)
                cleanup_pool(&mp[i]);
-
-       if (lock)
-               fio_rwlock_remove(lock);
 }
 
 #ifdef SMALLOC_REDZONE
@@ -338,12 +302,12 @@ static void sfree_pool(struct pool *pool, void *ptr)
        i = offset / SMALLOC_BPL;
        idx = (offset % SMALLOC_BPL) / SMALLOC_BPB;
 
-       pool_lock(pool);
+       fio_mutex_down(pool->lock);
        clear_blocks(pool, i, idx, size_to_blocks(hdr->size));
        if (i < pool->next_non_full)
                pool->next_non_full = i;
        pool->free_blocks += size_to_blocks(hdr->size);
-       pool_unlock(pool);
+       fio_mutex_up(pool->lock);
 }
 
 void sfree(void *ptr)
@@ -354,8 +318,6 @@ void sfree(void *ptr)
        if (!ptr)
                return;
 
-       global_read_lock();
-
        for (i = 0; i < nr_pools; i++) {
                if (ptr_valid(&mp[i], ptr)) {
                        pool = &mp[i];
@@ -363,8 +325,6 @@ void sfree(void *ptr)
                }
        }
 
-       global_read_unlock();
-
        if (pool) {
                sfree_pool(pool, ptr);
                return;
@@ -381,7 +341,7 @@ static void *__smalloc_pool(struct pool *pool, size_t size)
        unsigned int last_idx;
        void *ret = NULL;
 
-       pool_lock(pool);
+       fio_mutex_down(pool->lock);
 
        nr_blocks = size_to_blocks(size);
        if (nr_blocks > pool->free_blocks)
@@ -424,7 +384,7 @@ static void *__smalloc_pool(struct pool *pool, size_t size)
                ret = pool->map + offset;
        }
 fail:
-       pool_unlock(pool);
+       fio_mutex_up(pool->lock);
        return ret;
 }
 
@@ -463,7 +423,6 @@ void *smalloc(size_t size)
        if (size != (unsigned int) size)
                return NULL;
 
-       global_write_lock();
        i = last_pool;
        end_pool = nr_pools;
 
@@ -473,7 +432,6 @@ void *smalloc(size_t size)
 
                        if (ptr) {
                                last_pool = i;
-                               global_write_unlock();
                                return ptr;
                        }
                }
@@ -486,7 +444,6 @@ void *smalloc(size_t size)
                break;
        } while (1);
 
-       global_write_unlock();
        return NULL;
 }