diff options
author | Jens Axboe <axboe@kernel.dk> | 2024-04-02 16:16:03 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2024-04-02 19:03:27 -0600 |
commit | 561e4f9451d65fc2f7eef564e0064373e3019793 (patch) | |
tree | 2e64d28297c67422596b02f7504fe734a554676a /io_uring/kbuf.h | |
parent | 6b69c4ab4f685327d9e10caf0d84217ba23a8c4b (diff) | |
download | linux-561e4f9451d65fc2f7eef564e0064373e3019793.tar.gz linux-561e4f9451d65fc2f7eef564e0064373e3019793.tar.bz2 linux-561e4f9451d65fc2f7eef564e0064373e3019793.zip |
io_uring/kbuf: hold io_buffer_list reference over mmap
If we look up the kbuf, ensure that it doesn't get unregistered until
after we're done with it. Since we're inside mmap, we cannot safely use
the io_uring lock. Rely on the fact that we can lookup the buffer list
under RCU now and grab a reference to it, preventing it from being
unregistered until we're done with it. The lookup returns the
io_buffer_list directly with it referenced.
Cc: stable@vger.kernel.org # v6.4+
Fixes: 5cf4f52e6d8a ("io_uring: free io_buffer_list entries via RCU")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/kbuf.h')
-rw-r--r-- | io_uring/kbuf.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/io_uring/kbuf.h b/io_uring/kbuf.h index 8b868a1744e2..df365b8860cf 100644 --- a/io_uring/kbuf.h +++ b/io_uring/kbuf.h @@ -61,7 +61,9 @@ void __io_put_kbuf(struct io_kiocb *req, unsigned issue_flags); bool io_kbuf_recycle_legacy(struct io_kiocb *req, unsigned issue_flags); -void *io_pbuf_get_address(struct io_ring_ctx *ctx, unsigned long bgid); +void io_put_bl(struct io_ring_ctx *ctx, struct io_buffer_list *bl); +struct io_buffer_list *io_pbuf_get_bl(struct io_ring_ctx *ctx, + unsigned long bgid); static inline bool io_kbuf_recycle_ring(struct io_kiocb *req) { |