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