Skip to content

Commit

Permalink
io_uring: impose max limit on apoll cache
Browse files Browse the repository at this point in the history
Caches like this tend to grow to the peak size, and then never get any
smaller. Impose a max limit on the size, to prevent it from growing too
big.

A somewhat randomly chosen 512 is the max size we'll allow the cache
to get. If a batch of frees come in and would bring it over that, we
simply start kfree'ing the surplus.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Jens Axboe committed Jul 25, 2022
1 parent 9b797a3 commit 9731bc9
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/linux/io_uring_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ struct io_ev_fd {

struct io_alloc_cache {
struct hlist_head list;
unsigned int nr_cached;
};

struct io_ring_ctx {
Expand Down
16 changes: 14 additions & 2 deletions io_uring/alloc_cache.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
#ifndef IOU_ALLOC_CACHE_H
#define IOU_ALLOC_CACHE_H

/*
* Don't allow the cache to grow beyond this size.
*/
#define IO_ALLOC_CACHE_MAX 512

struct io_cache_entry {
struct hlist_node node;
};

static inline void io_alloc_cache_put(struct io_alloc_cache *cache,
static inline bool io_alloc_cache_put(struct io_alloc_cache *cache,
struct io_cache_entry *entry)
{
hlist_add_head(&entry->node, &cache->list);
if (cache->nr_cached < IO_ALLOC_CACHE_MAX) {
cache->nr_cached++;
hlist_add_head(&entry->node, &cache->list);
return true;
}
return false;
}

static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *cache)
Expand All @@ -26,6 +36,7 @@ static inline struct io_cache_entry *io_alloc_cache_get(struct io_alloc_cache *c
static inline void io_alloc_cache_init(struct io_alloc_cache *cache)
{
INIT_HLIST_HEAD(&cache->list);
cache->nr_cached = 0;
}

static inline void io_alloc_cache_free(struct io_alloc_cache *cache,
Expand All @@ -37,5 +48,6 @@ static inline void io_alloc_cache_free(struct io_alloc_cache *cache,
hlist_del(node);
free(container_of(node, struct io_cache_entry, node));
}
cache->nr_cached = 0;
}
#endif
3 changes: 2 additions & 1 deletion io_uring/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -1181,7 +1181,8 @@ void io_free_batch_list(struct io_ring_ctx *ctx, struct io_wq_work_node *node)

if (apoll->double_poll)
kfree(apoll->double_poll);
io_alloc_cache_put(&ctx->apoll_cache, &apoll->cache);
if (!io_alloc_cache_put(&ctx->apoll_cache, &apoll->cache))
kfree(apoll);
req->flags &= ~REQ_F_POLLED;
}
if (req->flags & IO_REQ_LINK_FLAGS)
Expand Down

0 comments on commit 9731bc9

Please sign in to comment.