xref: /optee_os/lib/libutils/ext/include/mempool.h (revision 95d0db1e6e686112855df4c41cde38b84fc2140a)
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