19b797a37SJens Axboe #ifndef IOU_ALLOC_CACHE_H 29b797a37SJens Axboe #define IOU_ALLOC_CACHE_H 39b797a37SJens Axboe 49731bc98SJens Axboe /* 59731bc98SJens Axboe * Don't allow the cache to grow beyond this size. 69731bc98SJens Axboe */ 79731bc98SJens Axboe #define IO_ALLOC_CACHE_MAX 512 89731bc98SJens Axboe 99b797a37SJens Axboe struct io_cache_entry { 109b797a37SJens Axboe struct hlist_node node; 119b797a37SJens Axboe }; 129b797a37SJens Axboe 139731bc98SJens Axboe static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, 149b797a37SJens Axboe struct io_cache_entry *entry) 159b797a37SJens Axboe { 169731bc98SJens Axboe if (cache->nr_cached < IO_ALLOC_CACHE_MAX) { 179731bc98SJens Axboe cache->nr_cached++; 189b797a37SJens Axboe hlist_add_head(&entry->node, &cache->list); 199731bc98SJens Axboe return true; 209731bc98SJens Axboe } 219731bc98SJens Axboe return false; 229b797a37SJens Axboe } 239b797a37SJens Axboe 249b797a37SJens Axboe static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) 259b797a37SJens Axboe { 269b797a37SJens Axboe if (!hlist_empty(&cache->list)) { 279b797a37SJens Axboe struct hlist_node *node = cache->list.first; 289b797a37SJens Axboe 299b797a37SJens Axboe hlist_del(node); 30*fd30d1cdSPavel Begunkov cache->nr_cached--; 319b797a37SJens Axboe return container_of(node, struct io_cache_entry, node); 329b797a37SJens Axboe } 339b797a37SJens Axboe 349b797a37SJens Axboe return NULL; 359b797a37SJens Axboe } 369b797a37SJens Axboe 379b797a37SJens Axboe static inline void io_alloc_cache_init(struct io_alloc_cache *cache) 389b797a37SJens Axboe { 399b797a37SJens Axboe INIT_HLIST_HEAD(&cache->list); 409731bc98SJens Axboe cache->nr_cached = 0; 419b797a37SJens Axboe } 429b797a37SJens Axboe 439b797a37SJens Axboe static inline void io_alloc_cache_free(struct io_alloc_cache *cache, 449b797a37SJens Axboe void (*free)(struct io_cache_entry *)) 459b797a37SJens Axboe { 469b797a37SJens Axboe while (!hlist_empty(&cache->list)) { 479b797a37SJens Axboe struct hlist_node *node = cache->list.first; 489b797a37SJens Axboe 499b797a37SJens Axboe hlist_del(node); 509b797a37SJens Axboe free(container_of(node, struct io_cache_entry, node)); 519b797a37SJens Axboe } 529731bc98SJens Axboe cache->nr_cached = 0; 539b797a37SJens Axboe } 549b797a37SJens Axboe #endif 55