xref: /openbmc/linux/io_uring/alloc_cache.h (revision 9b797a37c4bd83b03cedcfbd15852b836f5e562c)
1*9b797a37SJens Axboe #ifndef IOU_ALLOC_CACHE_H
2*9b797a37SJens Axboe #define IOU_ALLOC_CACHE_H
3*9b797a37SJens Axboe 
4*9b797a37SJens Axboe struct io_cache_entry {
5*9b797a37SJens Axboe 	struct hlist_node	node;
6*9b797a37SJens Axboe };
7*9b797a37SJens Axboe 
8*9b797a37SJens Axboe static inline void io_alloc_cache_put(struct io_alloc_cache *cache,
9*9b797a37SJens Axboe 				      struct io_cache_entry *entry)
10*9b797a37SJens Axboe {
11*9b797a37SJens Axboe 	hlist_add_head(&entry->node, &cache->list);
12*9b797a37SJens Axboe }
13*9b797a37SJens Axboe 
14*9b797a37SJens Axboe static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache)
15*9b797a37SJens Axboe {
16*9b797a37SJens Axboe 	if (!hlist_empty(&cache->list)) {
17*9b797a37SJens Axboe 		struct hlist_node *node = cache->list.first;
18*9b797a37SJens Axboe 
19*9b797a37SJens Axboe 		hlist_del(node);
20*9b797a37SJens Axboe 		return container_of(node, struct io_cache_entry, node);
21*9b797a37SJens Axboe 	}
22*9b797a37SJens Axboe 
23*9b797a37SJens Axboe 	return NULL;
24*9b797a37SJens Axboe }
25*9b797a37SJens Axboe 
26*9b797a37SJens Axboe static inline void io_alloc_cache_init(struct io_alloc_cache *cache)
27*9b797a37SJens Axboe {
28*9b797a37SJens Axboe 	INIT_HLIST_HEAD(&cache->list);
29*9b797a37SJens Axboe }
30*9b797a37SJens Axboe 
31*9b797a37SJens Axboe static inline void io_alloc_cache_free(struct io_alloc_cache *cache,
32*9b797a37SJens Axboe 					void (*free)(struct io_cache_entry *))
33*9b797a37SJens Axboe {
34*9b797a37SJens Axboe 	while (!hlist_empty(&cache->list)) {
35*9b797a37SJens Axboe 		struct hlist_node *node = cache->list.first;
36*9b797a37SJens Axboe 
37*9b797a37SJens Axboe 		hlist_del(node);
38*9b797a37SJens Axboe 		free(container_of(node, struct io_cache_entry, node));
39*9b797a37SJens Axboe 	}
40*9b797a37SJens Axboe }
41*9b797a37SJens Axboe #endif
42