Home | History | Annotate | Download | only in linux
      1 /*
      2  * memory buffer pool support
      3  */
      4 #ifndef _LINUX_MEMPOOL_H
      5 #define _LINUX_MEMPOOL_H
      6 
      7 #include <linux/wait.h>
      8 
      9 struct kmem_cache;
     10 
     11 typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data);
     12 typedef void (mempool_free_t)(void *element, void *pool_data);
     13 
     14 typedef struct mempool_s {
     15 	spinlock_t lock;
     16 	int min_nr;		/* nr of elements at *elements */
     17 	int curr_nr;		/* Current nr of elements at *elements */
     18 	void **elements;
     19 
     20 	void *pool_data;
     21 	mempool_alloc_t *alloc;
     22 	mempool_free_t *free;
     23 	wait_queue_head_t wait;
     24 } mempool_t;
     25 
     26 extern mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
     27 			mempool_free_t *free_fn, void *pool_data);
     28 extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
     29 			mempool_free_t *free_fn, void *pool_data, int nid);
     30 
     31 extern int mempool_resize(mempool_t *pool, int new_min_nr, gfp_t gfp_mask);
     32 extern void mempool_destroy(mempool_t *pool);
     33 extern void * mempool_alloc(mempool_t *pool, gfp_t gfp_mask);
     34 extern void mempool_free(void *element, mempool_t *pool);
     35 
     36 /*
     37  * A mempool_alloc_t and mempool_free_t that get the memory from
     38  * a slab that is passed in through pool_data.
     39  */
     40 void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data);
     41 void mempool_free_slab(void *element, void *pool_data);
     42 static inline mempool_t *
     43 mempool_create_slab_pool(int min_nr, struct kmem_cache *kc)
     44 {
     45 	return mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab,
     46 			      (void *) kc);
     47 }
     48 
     49 /*
     50  * 2 mempool_alloc_t's and a mempool_free_t to kmalloc/kzalloc and kfree
     51  * the amount of memory specified by pool_data
     52  */
     53 void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data);
     54 void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data);
     55 void mempool_kfree(void *element, void *pool_data);
     56 static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size)
     57 {
     58 	return mempool_create(min_nr, mempool_kmalloc, mempool_kfree,
     59 			      (void *) size);
     60 }
     61 static inline mempool_t *mempool_create_kzalloc_pool(int min_nr, size_t size)
     62 {
     63 	return mempool_create(min_nr, mempool_kzalloc, mempool_kfree,
     64 			      (void *) size);
     65 }
     66 
     67 /*
     68  * A mempool_alloc_t and mempool_free_t for a simple page allocator that
     69  * allocates pages of the order specified by pool_data
     70  */
     71 void *mempool_alloc_pages(gfp_t gfp_mask, void *pool_data);
     72 void mempool_free_pages(void *element, void *pool_data);
     73 static inline mempool_t *mempool_create_page_pool(int min_nr, int order)
     74 {
     75 	return mempool_create(min_nr, mempool_alloc_pages, mempool_free_pages,
     76 			      (void *)(long)order);
     77 }
     78 
     79 #endif /* _LINUX_MEMPOOL_H */
     80