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
  28extern mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
  29                        mempool_free_t *free_fn, void *pool_data);
  30extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
  31                        mempool_free_t *free_fn, void *pool_data,
  32                        gfp_t gfp_mask, int nid);
  33
  34extern int mempool_resize(mempool_t *pool, int new_min_nr);
  35extern void mempool_destroy(mempool_t *pool);
  36extern void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask) __malloc;
  37extern void mempool_free(void *element, mempool_t *pool);
  38
  39/*
  40 * A mempool_alloc_t and mempool_free_t that get the memory from
  41 * a slab cache that is passed in through pool_data.
  42 * Note: the slab cache may not have a ctor function.
  43 */
  44void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data);
  45void mempool_free_slab(void *element, void *pool_data);
  46static inline mempool_t *
  47mempool_create_slab_pool(int min_nr, struct kmem_cache *kc)
  48{
  49        return mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab,
  50                              (void *) kc);
  51}
  52
  53/*
  54 * a mempool_alloc_t and a mempool_free_t to kmalloc and kfree the
  55 * amount of memory specified by pool_data
  56 */
  57void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data);
  58void mempool_kfree(void *element, void *pool_data);
  59static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size)
  60{
  61        return mempool_create(min_nr, mempool_kmalloc, mempool_kfree,
  62                              (void *) size);
  63}
  64
  65/*
  66 * A mempool_alloc_t and mempool_free_t for a simple page allocator that
  67 * allocates pages of the order specified by pool_data
  68 */
  69void *mempool_alloc_pages(gfp_t gfp_mask, void *pool_data);
  70void mempool_free_pages(void *element, void *pool_data);
  71static inline mempool_t *mempool_create_page_pool(int min_nr, int order)
  72{
  73        return mempool_create(min_nr, mempool_alloc_pages, mempool_free_pages,
  74                              (void *)(long)order);
  75}
  76
  77#endif /* _LINUX_MEMPOOL_H */
  78