summaryrefslogtreecommitdiff
path: root/io_uring
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2024-11-25 23:10:31 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-12-05 14:02:50 +0100
commitd222fd21dd21b0edf305fec39a7effaace5b0047 (patch)
treecb5f382b4a3d379c6f3d49266c715c92095dcaec /io_uring
parent0a9fd032f934b2fa5dd651e9c84482e79a8eb670 (diff)
downloadlinux-d222fd21dd21b0edf305fec39a7effaace5b0047.tar.gz
linux-d222fd21dd21b0edf305fec39a7effaace5b0047.tar.bz2
linux-d222fd21dd21b0edf305fec39a7effaace5b0047.zip
io_uring: fix corner case forgetting to vunmap
commit 43eef70e7e2ac74e7767731dd806720c7fb5e010 upstream. io_pages_unmap() is a bit tricky in trying to figure whether the pages were previously vmap'ed or not. In particular If there is juts one page it belives there is no need to vunmap. Paired io_pages_map(), however, could've failed io_mem_alloc_compound() and attempted to io_mem_alloc_single(), which does vmap, and that leads to unpaired vmap. The solution is to fail if io_mem_alloc_compound() can't allocate a single page. That's the easiest way to deal with it, and those two functions are getting removed soon, so no need to overcomplicate it. Cc: stable@vger.kernel.org Fixes: 3ab1db3c6039e ("io_uring: get rid of remap_pfn_range() for mapping rings/sqes") Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/477e75a3907a2fe83249e49c0a92cd480b2c60e0.1732569842.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/memmap.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/io_uring/memmap.c b/io_uring/memmap.c
index a0f32a255fd1..de5b584b7fab 100644
--- a/io_uring/memmap.c
+++ b/io_uring/memmap.c
@@ -72,6 +72,8 @@ void *io_pages_map(struct page ***out_pages, unsigned short *npages,
ret = io_mem_alloc_compound(pages, nr_pages, size, gfp);
if (!IS_ERR(ret))
goto done;
+ if (nr_pages == 1)
+ goto fail;
ret = io_mem_alloc_single(pages, nr_pages, size, gfp);
if (!IS_ERR(ret)) {
@@ -80,7 +82,7 @@ done:
*npages = nr_pages;
return ret;
}
-
+fail:
kvfree(pages);
*out_pages = NULL;
*npages = 0;