1 #include <stdlib.h> 2 #include <string.h> 3 #include <malloc.h> 4 #include <unistd.h> 5 #include <assert.h> 6 7 #include <linux/mempool.h> 8 #include <linux/slab.h> 9 #include <urcu/uatomic.h> 10 11 int nr_allocated; 12 13 void *mempool_alloc(mempool_t *pool, int gfp_mask) 14 { 15 return pool->alloc(gfp_mask, pool->data); 16 } 17 18 void mempool_free(void *element, mempool_t *pool) 19 { 20 pool->free(element, pool->data); 21 } 22 23 mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 24 mempool_free_t *free_fn, void *pool_data) 25 { 26 mempool_t *ret = malloc(sizeof(*ret)); 27 28 ret->alloc = alloc_fn; 29 ret->free = free_fn; 30 ret->data = pool_data; 31 return ret; 32 } 33 34 void *kmem_cache_alloc(struct kmem_cache *cachep, int flags) 35 { 36 void *ret = malloc(cachep->size); 37 if (cachep->ctor) 38 cachep->ctor(ret); 39 uatomic_inc(&nr_allocated); 40 return ret; 41 } 42 43 void kmem_cache_free(struct kmem_cache *cachep, void *objp) 44 { 45 assert(objp); 46 uatomic_dec(&nr_allocated); 47 memset(objp, 0, cachep->size); 48 free(objp); 49 } 50 51 struct kmem_cache * 52 kmem_cache_create(const char *name, size_t size, size_t offset, 53 unsigned long flags, void (*ctor)(void *)) 54 { 55 struct kmem_cache *ret = malloc(sizeof(*ret)); 56 57 ret->size = size; 58 ret->ctor = ctor; 59 return ret; 60 } 61