aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2021-02-13 09:09:44 -0700
committerJens Axboe <axboe@kernel.dk>2021-02-13 09:09:44 -0700
commit9a4fdbd8ee0d8aca0cb5692446e5ca583b230cd7 (patch)
treeb6fbe7f4f4173da7889132aeee6675c066c6a754 /fs
parentio_uring: allow task match to be passed to io_req_cache_free() (diff)
downloadwireguard-linux-9a4fdbd8ee0d8aca0cb5692446e5ca583b230cd7.tar.xz
wireguard-linux-9a4fdbd8ee0d8aca0cb5692446e5ca583b230cd7.zip
io_uring: add helper to free all request caches
We have three different ones, put it in a helper for easy calling. This is in preparation for doing it outside of ring freeing as well. With that in mind, also ensure that we do the proper locking for safe calling from a context where the ring it still live. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/io_uring.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 9cd7b03a6f34..1895fc132252 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -8693,10 +8693,27 @@ static void io_req_cache_free(struct list_head *list, struct task_struct *tsk)
}
}
-static void io_ring_ctx_free(struct io_ring_ctx *ctx)
+static void io_req_caches_free(struct io_ring_ctx *ctx, struct task_struct *tsk)
{
struct io_submit_state *submit_state = &ctx->submit_state;
+ mutex_lock(&ctx->uring_lock);
+
+ if (submit_state->free_reqs)
+ kmem_cache_free_bulk(req_cachep, submit_state->free_reqs,
+ submit_state->reqs);
+
+ io_req_cache_free(&submit_state->comp.free_list, NULL);
+
+ spin_lock_irq(&ctx->completion_lock);
+ io_req_cache_free(&submit_state->comp.locked_free_list, NULL);
+ spin_unlock_irq(&ctx->completion_lock);
+
+ mutex_unlock(&ctx->uring_lock);
+}
+
+static void io_ring_ctx_free(struct io_ring_ctx *ctx)
+{
/*
* Some may use context even when all refs and requests have been put,
* and they are free to do so while still holding uring_lock, see
@@ -8715,10 +8732,6 @@ static void io_ring_ctx_free(struct io_ring_ctx *ctx)
ctx->mm_account = NULL;
}
- if (submit_state->free_reqs)
- kmem_cache_free_bulk(req_cachep, submit_state->free_reqs,
- submit_state->reqs);
-
#ifdef CONFIG_BLK_CGROUP
if (ctx->sqo_blkcg_css)
css_put(ctx->sqo_blkcg_css);
@@ -8742,9 +8755,8 @@ static void io_ring_ctx_free(struct io_ring_ctx *ctx)
percpu_ref_exit(&ctx->refs);
free_uid(ctx->user);
put_cred(ctx->creds);
+ io_req_caches_free(ctx, NULL);
kfree(ctx->cancel_hash);
- io_req_cache_free(&ctx->submit_state.comp.free_list, NULL);
- io_req_cache_free(&ctx->submit_state.comp.locked_free_list, NULL);
kfree(ctx);
}