Line data Source code
1 : #ifndef IOU_ALLOC_CACHE_H 2 : #define IOU_ALLOC_CACHE_H 3 : 4 : /* 5 : * Don't allow the cache to grow beyond this size. 6 : */ 7 : #define IO_ALLOC_CACHE_MAX 512 8 : 9 : struct io_cache_entry { 10 : struct hlist_node node; 11 : }; 12 : 13 : static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, 14 : struct io_cache_entry *entry) 15 : { 16 0 : if (cache->nr_cached < IO_ALLOC_CACHE_MAX) { 17 0 : cache->nr_cached++; 18 0 : hlist_add_head(&entry->node, &cache->list); 19 : return true; 20 : } 21 : return false; 22 : } 23 : 24 : static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) 25 : { 26 0 : if (!hlist_empty(&cache->list)) { 27 0 : struct hlist_node *node = cache->list.first; 28 : 29 0 : hlist_del(node); 30 0 : return container_of(node, struct io_cache_entry, node); 31 : } 32 : 33 : return NULL; 34 : } 35 : 36 : static inline void io_alloc_cache_init(struct io_alloc_cache *cache) 37 : { 38 0 : INIT_HLIST_HEAD(&cache->list); 39 0 : cache->nr_cached = 0; 40 : } 41 : 42 : static inline void io_alloc_cache_free(struct io_alloc_cache *cache, 43 : void (*free)(struct io_cache_entry *)) 44 : { 45 0 : while (!hlist_empty(&cache->list)) { 46 0 : struct hlist_node *node = cache->list.first; 47 : 48 0 : hlist_del(node); 49 0 : free(container_of(node, struct io_cache_entry, node)); 50 : } 51 0 : cache->nr_cached = 0; 52 : } 53 : #endif