linux/include/linux/mempool.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * memory buffer pool support
   4 */
   5#ifndef _LINUX_MEMPOOL_H
   6#define _LINUX_MEMPOOL_H
   7
   8#include <linux/wait.h>
   9#include <linux/compiler.h>
  10
  11struct kmem_cache;
  12
  13typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data);
  14typedef void (mempool_free_t)(void *element, void *pool_data);
  15
  16typedef struct mempool_s {
  17        spinlock_t lock;
  18        int min_nr;             /* nr of elements at *elements */
  19        int curr_nr;            /* Current nr of elements at *elements */
  20        void **elements;
  21
  22        void *pool_data;
  23        mempool_alloc_t *alloc;
  24        mempool_free_t *free;
  25        wait_queue_head_t wait;
  26} mempool_t;
  27
  28static inline bool mempool_initialized(mempool_t *pool)
  29{
  30        return pool->elements != NULL;
  31}
  32
  33void mempool_exit(mempool_t *pool);
  34int 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);
  37int mempool_init(mempool_t *pool, int min_nr, mempool_alloc_t *alloc_fn,
  38                 mempool_free_t *free_fn, void *pool_data);
  39
  40extern mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
  41                        mempool_free_t *free_fn, void *pool_data);
  42extern 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);
  45
  46extern int mempool_resize(mempool_t *pool, int new_min_nr);
  47extern void mempool_destroy(mempool_t *pool);
  48extern void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask) __malloc;
  49extern void mempool_free(void *element, mempool_t *pool);
  50
  51/*
  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.
  55 */
  56void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data);
  57void mempool_free_slab(void *element, void *pool_data);
  58
  59static inline int
  60mempool_init_slab_pool(mempool_t *pool, int min_nr, struct kmem_cache *kc)
  61{
  62        return mempool_init(pool, min_nr, mempool_alloc_slab,
  63                            mempool_free_slab, (void *) kc);
  64}
  65
  66static inline mempool_t *
  67mempool_create_slab_pool(int min_nr, struct kmem_cache *kc)
  68{
  69        return mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab,
  70                              (void *) kc);
  71}
  72
  73/*
  74 * a mempool_alloc_t and a mempool_free_t to kmalloc and kfree the
  75 * amount of memory specified by pool_data
  76 */
  77void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data);
  78void mempool_kfree(void *element, void *pool_data);
  79
  80static inline int mempool_init_kmalloc_pool(mempool_t *pool, int min_nr, size_t size)
  81{
  82        return mempool_init(pool, min_nr, mempool_kmalloc,
  83                            mempool_kfree, (void *) size);
  84}
  85
  86static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size)
  87{
  88        return mempool_create(min_nr, mempool_kmalloc, mempool_kfree,
  89                              (void *) size);
  90}
  91
  92/*
  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
  95 */
  96void *mempool_alloc_pages(gfp_t gfp_mask, void *pool_data);
  97void mempool_free_pages(void *element, void *pool_data);
  98
  99static inline int mempool_init_page_pool(mempool_t *pool, int min_nr, int order)
 100{
 101        return mempool_init(pool, min_nr, mempool_alloc_pages,
 102                            mempool_free_pages, (void *)(long)order);
 103}
 104
 105static inline mempool_t *mempool_create_page_pool(int min_nr, int order)
 106{
 107        return mempool_create(min_nr, mempool_alloc_pages, mempool_free_pages,
 108                              (void *)(long)order);
 109}
 110
 111#endif /* _LINUX_MEMPOOL_H */
 112