/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (c) 2018, Linaro Limited */ #ifndef __MEMPOOL_H #define __MEMPOOL_H #include /* * Memory pool for large temporary memory allocations that must not fail. * With the first allocation from an unused (idle or free) pool the pool * becomes reserved for that particular thread, until all allocations are * freed again. In order to avoid dead-lock and ease code review it is good * practise to free everything allocated by a certain function before * returning. */ /* * struct mempool_item - internal struct to keep track of an item */ struct mempool_item { size_t size; ssize_t prev_item_offset; ssize_t next_item_offset; }; struct mempool; #define MEMPOOL_ALIGN __alignof__(long) #if defined(__KERNEL__) /* * System wide memory pool for large temporary memory allocation. */ extern struct mempool *mempool_default; #endif /* * mempool_alloc_pool() - Allocate a new memory pool * @data: a block of memory to carve out items from, must * have an alignment of MEMPOOL_ALIGN. * @size: size fo the block of memory * @release_mem: function to call when the pool has been emptied, * ignored if NULL. * returns a pointer to a valid pool on success or NULL on failure. */ struct mempool *mempool_alloc_pool(void *data, size_t size, void (*release_mem)(void *ptr, size_t size)); /* * mempool_alloc() - Allocate an item from a memory pool * @pool: A memory pool created with mempool_alloc_pool() * @size: Size in bytes of the item to allocate * return a valid pointer on success or NULL on failure. */ void *mempool_alloc(struct mempool *pool, size_t size); /* * mempool_calloc() - Allocate and zero initialize an array of elements from a * memory pool * @pool: A memory pool created with mempool_alloc_pool() * @nmemb: Number of elements in the array * @size: Size in bytes of each element in the array * return a valid pointer on success or NULL on failure. */ void *mempool_calloc(struct mempool *pool, size_t nmemb, size_t size); /* * mempool_free() - Frees a previously allocated item * @pool: A memory pool create with mempool_alloc_pool() * @ptr: A pointer to a previously allocated item */ void mempool_free(struct mempool *pool, void *ptr); #endif /*__MEMPOOL_H*/