diff options
Diffstat (limited to 'io_uring/alloc_cache.h')
| -rw-r--r-- | io_uring/alloc_cache.h | 59 | 
1 files changed, 27 insertions, 32 deletions
diff --git a/io_uring/alloc_cache.h b/io_uring/alloc_cache.h index bf2fb26a6539..b7a38a2069cf 100644 --- a/io_uring/alloc_cache.h +++ b/io_uring/alloc_cache.h @@ -4,63 +4,58 @@  /*   * Don't allow the cache to grow beyond this size.   */ -#define IO_ALLOC_CACHE_MAX	512 - -struct io_cache_entry { -	struct io_wq_work_node node; -}; +#define IO_ALLOC_CACHE_MAX	128  static inline bool io_alloc_cache_put(struct io_alloc_cache *cache, -				      struct io_cache_entry *entry) +				      void *entry)  {  	if (cache->nr_cached < cache->max_cached) { -		cache->nr_cached++; -		wq_stack_add_head(&entry->node, &cache->list); -		kasan_mempool_poison_object(entry); +		if (!kasan_mempool_poison_object(entry)) +			return false; +		cache->entries[cache->nr_cached++] = entry;  		return true;  	}  	return false;  } -static inline bool io_alloc_cache_empty(struct io_alloc_cache *cache) -{ -	return !cache->list.next; -} - -static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache) +static inline void *io_alloc_cache_get(struct io_alloc_cache *cache)  { -	if (cache->list.next) { -		struct io_cache_entry *entry; +	if (cache->nr_cached) { +		void *entry = cache->entries[--cache->nr_cached]; -		entry = container_of(cache->list.next, struct io_cache_entry, node);  		kasan_mempool_unpoison_object(entry, cache->elem_size); -		cache->list.next = cache->list.next->next; -		cache->nr_cached--;  		return entry;  	}  	return NULL;  } -static inline void io_alloc_cache_init(struct io_alloc_cache *cache, +/* returns false if the cache was initialized properly */ +static inline bool io_alloc_cache_init(struct io_alloc_cache *cache,  				       unsigned max_nr, size_t size)  { -	cache->list.next = NULL; -	cache->nr_cached = 0; -	cache->max_cached = max_nr; -	cache->elem_size = size; +	cache->entries = kvmalloc_array(max_nr, sizeof(void *), GFP_KERNEL); +	if (cache->entries) { +		cache->nr_cached = 0; +		cache->max_cached = max_nr; +		cache->elem_size = size; +		return false; +	} +	return true;  }  static inline void io_alloc_cache_free(struct io_alloc_cache *cache, -					void (*free)(struct io_cache_entry *)) +				       void (*free)(const void *))  { -	while (1) { -		struct io_cache_entry *entry = io_alloc_cache_get(cache); +	void *entry; + +	if (!cache->entries) +		return; -		if (!entry) -			break; +	while ((entry = io_alloc_cache_get(cache)) != NULL)  		free(entry); -	} -	cache->nr_cached = 0; + +	kvfree(cache->entries); +	cache->entries = NULL;  }  #endif  |