1 /* SPDX-License-Identifier: GPL-2.0 */
3 * memory buffer pool support
5 #ifndef _LINUX_MEMPOOL_H
6 #define _LINUX_MEMPOOL_H
8 #include <linux/wait.h>
9 #include <linux/compiler.h>
13 typedef void * (mempool_alloc_t
)(gfp_t gfp_mask
, void *pool_data
);
14 typedef void (mempool_free_t
)(void *element
, void *pool_data
);
16 typedef struct mempool_s
{
18 int min_nr
; /* nr of elements at *elements */
19 int curr_nr
; /* Current nr of elements at *elements */
23 mempool_alloc_t
*alloc
;
25 wait_queue_head_t wait
;
28 static inline bool mempool_initialized(mempool_t
*pool
)
30 return pool
->elements
!= NULL
;
33 void mempool_exit(mempool_t
*pool
);
34 int mempool_init_node(mempool_t
*pool
, int min_nr
, mempool_alloc_t
*alloc_fn
,
35 mempool_free_t
*free_fn
, void *pool_data
,
36 gfp_t gfp_mask
, int node_id
);
37 int mempool_init(mempool_t
*pool
, int min_nr
, mempool_alloc_t
*alloc_fn
,
38 mempool_free_t
*free_fn
, void *pool_data
);
40 extern mempool_t
*mempool_create(int min_nr
, mempool_alloc_t
*alloc_fn
,
41 mempool_free_t
*free_fn
, void *pool_data
);
42 extern mempool_t
*mempool_create_node(int min_nr
, mempool_alloc_t
*alloc_fn
,
43 mempool_free_t
*free_fn
, void *pool_data
,
44 gfp_t gfp_mask
, int nid
);
46 extern int mempool_resize(mempool_t
*pool
, int new_min_nr
);
47 extern void mempool_destroy(mempool_t
*pool
);
48 extern void *mempool_alloc(mempool_t
*pool
, gfp_t gfp_mask
) __malloc
;
49 extern void mempool_free(void *element
, mempool_t
*pool
);
52 * A mempool_alloc_t and mempool_free_t that get the memory from
53 * a slab cache that is passed in through pool_data.
54 * Note: the slab cache may not have a ctor function.
56 void *mempool_alloc_slab(gfp_t gfp_mask
, void *pool_data
);
57 void mempool_free_slab(void *element
, void *pool_data
);
60 mempool_init_slab_pool(mempool_t
*pool
, int min_nr
, struct kmem_cache
*kc
)
62 return mempool_init(pool
, min_nr
, mempool_alloc_slab
,
63 mempool_free_slab
, (void *) kc
);
66 static inline mempool_t
*
67 mempool_create_slab_pool(int min_nr
, struct kmem_cache
*kc
)
69 return mempool_create(min_nr
, mempool_alloc_slab
, mempool_free_slab
,
74 * a mempool_alloc_t and a mempool_free_t to kmalloc and kfree the
75 * amount of memory specified by pool_data
77 void *mempool_kmalloc(gfp_t gfp_mask
, void *pool_data
);
78 void mempool_kfree(void *element
, void *pool_data
);
80 static inline int mempool_init_kmalloc_pool(mempool_t
*pool
, int min_nr
, size_t size
)
82 return mempool_init(pool
, min_nr
, mempool_kmalloc
,
83 mempool_kfree
, (void *) size
);
86 static inline mempool_t
*mempool_create_kmalloc_pool(int min_nr
, size_t size
)
88 return mempool_create(min_nr
, mempool_kmalloc
, mempool_kfree
,
93 * A mempool_alloc_t and mempool_free_t for a simple page allocator that
94 * allocates pages of the order specified by pool_data
96 void *mempool_alloc_pages(gfp_t gfp_mask
, void *pool_data
);
97 void mempool_free_pages(void *element
, void *pool_data
);
99 static inline int mempool_init_page_pool(mempool_t
*pool
, int min_nr
, int order
)
101 return mempool_init(pool
, min_nr
, mempool_alloc_pages
,
102 mempool_free_pages
, (void *)(long)order
);
105 static inline mempool_t
*mempool_create_page_pool(int min_nr
, int order
)
107 return mempool_create(min_nr
, mempool_alloc_pages
, mempool_free_pages
,
108 (void *)(long)order
);
111 #endif /* _LINUX_MEMPOOL_H */