diff options
| author | Jakub Kicinski <[email protected]> | 2025-02-20 18:36:34 +0000 |
|---|---|---|
| committer | Jakub Kicinski <[email protected]> | 2025-02-20 18:37:30 +0000 |
| commit | 5d6ba5ab8582aa35c1ee98e47af28e6f6772596c (patch) | |
| tree | a4a3a2d311773c19909c9928273e0bcae01a39ce /io_uring/kbuf.c | |
| parent | Merge tag 'linux-can-next-for-6.15-20250219' of git://git.kernel.org/pub/scm/... (diff) | |
| parent | Merge tag 'net-6.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/net... (diff) | |
| download | kernel-5d6ba5ab8582aa35c1ee98e47af28e6f6772596c.tar.gz kernel-5d6ba5ab8582aa35c1ee98e47af28e6f6772596c.zip | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR (net-6.14-rc4).
No conflicts or adjacent changes.
Signed-off-by: Jakub Kicinski <[email protected]>
Diffstat (limited to 'io_uring/kbuf.c')
| -rw-r--r-- | io_uring/kbuf.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index 04bf493eecae..8e72de7712ac 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -415,6 +415,13 @@ void io_destroy_buffers(struct io_ring_ctx *ctx) } } +static void io_destroy_bl(struct io_ring_ctx *ctx, struct io_buffer_list *bl) +{ + scoped_guard(mutex, &ctx->mmap_lock) + WARN_ON_ONCE(xa_erase(&ctx->io_bl_xa, bl->bgid) != bl); + io_put_bl(ctx, bl); +} + int io_remove_buffers_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) { struct io_provide_buf *p = io_kiocb_to_cmd(req, struct io_provide_buf); @@ -636,12 +643,13 @@ int io_register_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg) /* if mapped buffer ring OR classic exists, don't allow */ if (bl->flags & IOBL_BUF_RING || !list_empty(&bl->buf_list)) return -EEXIST; - } else { - free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL); - if (!bl) - return -ENOMEM; + io_destroy_bl(ctx, bl); } + free_bl = bl = kzalloc(sizeof(*bl), GFP_KERNEL); + if (!bl) + return -ENOMEM; + mmap_offset = (unsigned long)reg.bgid << IORING_OFF_PBUF_SHIFT; ring_size = flex_array_size(br, bufs, reg.ring_entries); |
