X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Flinux%2Fmempool.h;h=506da24d6d594f8d6dbd0f66052d2bfd497f3d09;hb=ddac1641ee1e2686c2211a8d671ea723634dfc89;hp=ddf6f94130afa11bf40819986d04f38ba11e4af4;hpb=a5b5eba7f788bb77cf57f9c94f3474a2d439ab0b;p=bcachefs-tools-debian diff --git a/include/linux/mempool.h b/include/linux/mempool.h index ddf6f94..506da24 100644 --- a/include/linux/mempool.h +++ b/include/linux/mempool.h @@ -1,83 +1,112 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * memory buffer pool support */ #ifndef _LINUX_MEMPOOL_H #define _LINUX_MEMPOOL_H +#include #include -#include #include struct kmem_cache; +typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data); +typedef void (mempool_free_t)(void *element, void *pool_data); + typedef struct mempool_s { - size_t elem_size; + spinlock_t lock; + int min_nr; /* nr of elements at *elements */ + int curr_nr; /* Current nr of elements at *elements */ + void **elements; + + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; } mempool_t; static inline bool mempool_initialized(mempool_t *pool) { - return true; + return pool->elements != NULL; } -extern int mempool_resize(mempool_t *pool, int new_min_nr); +void mempool_exit(mempool_t *pool); +int mempool_init_node(mempool_t *pool, int min_nr, mempool_alloc_t *alloc_fn, + mempool_free_t *free_fn, void *pool_data, + gfp_t gfp_mask, int node_id); +int mempool_init(mempool_t *pool, int min_nr, mempool_alloc_t *alloc_fn, + mempool_free_t *free_fn, void *pool_data); -static inline void mempool_free(void *element, mempool_t *pool) -{ - free(element); -} +extern mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, + mempool_free_t *free_fn, void *pool_data); +extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn, + mempool_free_t *free_fn, void *pool_data, + gfp_t gfp_mask, int nid); -static inline void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask) __malloc -{ - BUG_ON(!pool->elem_size); - return kmalloc(pool->elem_size, gfp_mask); -} - -static inline void mempool_exit(mempool_t *pool) {} +extern int mempool_resize(mempool_t *pool, int new_min_nr); +extern void mempool_destroy(mempool_t *pool); +extern void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask) __malloc; +extern void mempool_free(void *element, mempool_t *pool); -static inline void mempool_destroy(mempool_t *pool) -{ - free(pool); -} +/* + * A mempool_alloc_t and mempool_free_t that get the memory from + * a slab cache that is passed in through pool_data. + * Note: the slab cache may not have a ctor function. + */ +void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data); +void mempool_free_slab(void *element, void *pool_data); static inline int mempool_init_slab_pool(mempool_t *pool, int min_nr, struct kmem_cache *kc) { - pool->elem_size = 0; - return 0; + return mempool_init(pool, min_nr, mempool_alloc_slab, + mempool_free_slab, (void *) kc); } static inline mempool_t * mempool_create_slab_pool(int min_nr, struct kmem_cache *kc) { - mempool_t *pool = malloc(sizeof(*pool)); - pool->elem_size = 0; - return pool; + return mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab, + (void *) kc); } +/* + * a mempool_alloc_t and a mempool_free_t to kmalloc and kfree the + * amount of memory specified by pool_data + */ +void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data); +void mempool_kfree(void *element, void *pool_data); + static inline int mempool_init_kmalloc_pool(mempool_t *pool, int min_nr, size_t size) { - pool->elem_size = size; - return 0; + return mempool_init(pool, min_nr, mempool_kmalloc, + mempool_kfree, (void *) size); } static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size) { - mempool_t *pool = malloc(sizeof(*pool)); - pool->elem_size = size; - return pool; + return mempool_create(min_nr, mempool_kmalloc, mempool_kfree, + (void *) size); } +/* + * A mempool_alloc_t and mempool_free_t for a simple page allocator that + * allocates pages of the order specified by pool_data + */ +void *mempool_alloc_pages(gfp_t gfp_mask, void *pool_data); +void mempool_free_pages(void *element, void *pool_data); + static inline int mempool_init_page_pool(mempool_t *pool, int min_nr, int order) { - pool->elem_size = PAGE_SIZE << order; - return 0; + return mempool_init(pool, min_nr, mempool_alloc_pages, + mempool_free_pages, (void *)(long)order); } static inline mempool_t *mempool_create_page_pool(int min_nr, int order) { - mempool_t *pool = malloc(sizeof(*pool)); - pool->elem_size = PAGE_SIZE << order; - return pool; + return mempool_create(min_nr, mempool_alloc_pages, mempool_free_pages, + (void *)(long)order); } #endif /* _LINUX_MEMPOOL_H */