1a2eb5b55SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2a2eb5b55SJens Wiklander /* 3a2eb5b55SJens Wiklander * Copyright (c) 2018, Linaro Limited 4a2eb5b55SJens Wiklander */ 5a2eb5b55SJens Wiklander 6a2eb5b55SJens Wiklander #ifndef __MEMPOOL_H 7a2eb5b55SJens Wiklander #define __MEMPOOL_H 8a2eb5b55SJens Wiklander 9a2eb5b55SJens Wiklander #include <types_ext.h> 10a2eb5b55SJens Wiklander 11a2eb5b55SJens Wiklander /* 12*95d0db1eSJens Wiklander * Memory pool for large temporary memory allocations that must not fail. 13*95d0db1eSJens Wiklander * With the first allocation from an unused (idle or free) pool the pool 14*95d0db1eSJens Wiklander * becomes reserved for that particular thread, until all allocations are 15*95d0db1eSJens Wiklander * freed again. In order to avoid dead-lock and ease code review it is good 16*95d0db1eSJens Wiklander * practise to free everything allocated by a certain function before 17*95d0db1eSJens Wiklander * returning. 18*95d0db1eSJens Wiklander */ 19*95d0db1eSJens Wiklander 20*95d0db1eSJens Wiklander /* 21a2eb5b55SJens Wiklander * struct mempool_item - internal struct to keep track of an item 22a2eb5b55SJens Wiklander */ 23a2eb5b55SJens Wiklander struct mempool_item { 24a2eb5b55SJens Wiklander size_t size; 25a2eb5b55SJens Wiklander ssize_t prev_item_offset; 26a2eb5b55SJens Wiklander ssize_t next_item_offset; 27a2eb5b55SJens Wiklander }; 28a2eb5b55SJens Wiklander 29a2eb5b55SJens Wiklander struct mempool; 30a2eb5b55SJens Wiklander 31b2dd8747SJens Wiklander #define MEMPOOL_ALIGN __alignof__(long) 32b2dd8747SJens Wiklander 33*95d0db1eSJens Wiklander #if defined(__KERNEL__) 34*95d0db1eSJens Wiklander /* 35*95d0db1eSJens Wiklander * System wide memory pool for large temporary memory allocation. 36*95d0db1eSJens Wiklander */ 37*95d0db1eSJens Wiklander extern struct mempool *mempool_default; 38*95d0db1eSJens Wiklander #endif 39*95d0db1eSJens Wiklander 40a2eb5b55SJens Wiklander /* 41a2eb5b55SJens Wiklander * mempool_alloc_pool() - Allocate a new memory pool 42b2dd8747SJens Wiklander * @data: a block of memory to carve out items from, must 43b2dd8747SJens Wiklander * have an alignment of MEMPOOL_ALIGN. 44a2eb5b55SJens Wiklander * @size: size fo the block of memory 45a2eb5b55SJens Wiklander * @release_mem: function to call when the pool has been emptied, 46a2eb5b55SJens Wiklander * ignored if NULL. 47a2eb5b55SJens Wiklander * returns a pointer to a valid pool on success or NULL on failure. 48a2eb5b55SJens Wiklander */ 49a2eb5b55SJens Wiklander struct mempool *mempool_alloc_pool(void *data, size_t size, 50a2eb5b55SJens Wiklander void (*release_mem)(void *ptr, size_t size)); 51a2eb5b55SJens Wiklander 52a2eb5b55SJens Wiklander /* 53a2eb5b55SJens Wiklander * mempool_alloc() - Allocate an item from a memory pool 54a2eb5b55SJens Wiklander * @pool: A memory pool created with mempool_alloc_pool() 55a2eb5b55SJens Wiklander * @size: Size in bytes of the item to allocate 56a2eb5b55SJens Wiklander * return a valid pointer on success or NULL on failure. 57a2eb5b55SJens Wiklander */ 58a2eb5b55SJens Wiklander void *mempool_alloc(struct mempool *pool, size_t size); 59a2eb5b55SJens Wiklander 60a2eb5b55SJens Wiklander /* 61e7d51f42SJens Wiklander * mempool_calloc() - Allocate and zero initialize an array of elements from a 62e7d51f42SJens Wiklander * memory pool 63e7d51f42SJens Wiklander * @pool: A memory pool created with mempool_alloc_pool() 64e7d51f42SJens Wiklander * @nmemb: Number of elements in the array 65e7d51f42SJens Wiklander * @size: Size in bytes of each element in the array 66e7d51f42SJens Wiklander * return a valid pointer on success or NULL on failure. 67e7d51f42SJens Wiklander */ 68e7d51f42SJens Wiklander void *mempool_calloc(struct mempool *pool, size_t nmemb, size_t size); 69e7d51f42SJens Wiklander 70e7d51f42SJens Wiklander /* 71a2eb5b55SJens Wiklander * mempool_free() - Frees a previously allocated item 72a2eb5b55SJens Wiklander * @pool: A memory pool create with mempool_alloc_pool() 73a2eb5b55SJens Wiklander * @ptr: A pointer to a previously allocated item 74a2eb5b55SJens Wiklander */ 75a2eb5b55SJens Wiklander void mempool_free(struct mempool *pool, void *ptr); 76a2eb5b55SJens Wiklander 77a2eb5b55SJens Wiklander #endif /*__MEMPOOL_H*/ 78