Commit | Line | Data |
---|---|---|
9b797a37 JA |
1 | #ifndef IOU_ALLOC_CACHE_H |
2 | #define IOU_ALLOC_CACHE_H | |
3 | ||
9731bc98 JA |
4 | /* |
5 | * Don't allow the cache to grow beyond this size. | |
6 | */ | |
7 | #define IO_ALLOC_CACHE_MAX 512 | |
8 | ||
9b797a37 | 9 | struct io_cache_entry { |
efba1a9e | 10 | struct io_wq_work_node node; |
9b797a37 JA |
11 | }; |
12 | ||
9731bc98 | 13 | static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, |
9b797a37 JA |
14 | struct io_cache_entry *entry) |
15 | { | |
69bbc6ad | 16 | if (cache->nr_cached < cache->max_cached) { |
9731bc98 | 17 | cache->nr_cached++; |
efba1a9e | 18 | wq_stack_add_head(&entry->node, &cache->list); |
e1fe7ee8 BL |
19 | /* KASAN poisons object */ |
20 | kasan_slab_free_mempool(entry); | |
9731bc98 JA |
21 | return true; |
22 | } | |
23 | return false; | |
9b797a37 JA |
24 | } |
25 | ||
26 | static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) | |
27 | { | |
efba1a9e BL |
28 | if (cache->list.next) { |
29 | struct io_cache_entry *entry; | |
9b797a37 | 30 | |
efba1a9e | 31 | entry = container_of(cache->list.next, struct io_cache_entry, node); |
e1fe7ee8 | 32 | kasan_unpoison_range(entry, cache->elem_size); |
efba1a9e | 33 | cache->list.next = cache->list.next->next; |
fd30d1cd | 34 | cache->nr_cached--; |
efba1a9e | 35 | return entry; |
9b797a37 JA |
36 | } |
37 | ||
38 | return NULL; | |
39 | } | |
40 | ||
69bbc6ad PB |
41 | static inline void io_alloc_cache_init(struct io_alloc_cache *cache, |
42 | unsigned max_nr, size_t size) | |
9b797a37 | 43 | { |
efba1a9e | 44 | cache->list.next = NULL; |
9731bc98 | 45 | cache->nr_cached = 0; |
69bbc6ad | 46 | cache->max_cached = max_nr; |
e1fe7ee8 | 47 | cache->elem_size = size; |
9b797a37 JA |
48 | } |
49 | ||
50 | static inline void io_alloc_cache_free(struct io_alloc_cache *cache, | |
51 | void (*free)(struct io_cache_entry *)) | |
52 | { | |
efba1a9e BL |
53 | while (1) { |
54 | struct io_cache_entry *entry = io_alloc_cache_get(cache); | |
9b797a37 | 55 | |
efba1a9e BL |
56 | if (!entry) |
57 | break; | |
58 | free(entry); | |
9b797a37 | 59 | } |
9731bc98 | 60 | cache->nr_cached = 0; |
9b797a37 JA |
61 | } |
62 | #endif |