Skip to content

Commit 4b851d2

Browse files
isilenceaxboe
authored andcommitted
io_uring/memmap: add IO_REGION_F_SINGLE_REF
Kernel allocated compound pages will have just one reference for the entire page array, add a flag telling io_free_region about that. Signed-off-by: Pavel Begunkov <[email protected]> Link: https://lore.kernel.org/r/a7abfa7535e9728d5fcade29a1ea1605ec2c04ce.1732886067.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <[email protected]>
1 parent a90558b commit 4b851d2

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

io_uring/memmap.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,15 +207,23 @@ enum {
207207
IO_REGION_F_VMAP = 1,
208208
/* memory is provided by user and pinned by the kernel */
209209
IO_REGION_F_USER_PROVIDED = 2,
210+
/* only the first page in the array is ref'ed */
211+
IO_REGION_F_SINGLE_REF = 4,
210212
};
211213

212214
void io_free_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr)
213215
{
214216
if (mr->pages) {
217+
long nr_refs = mr->nr_pages;
218+
219+
if (mr->flags & IO_REGION_F_SINGLE_REF)
220+
nr_refs = 1;
221+
215222
if (mr->flags & IO_REGION_F_USER_PROVIDED)
216-
unpin_user_pages(mr->pages, mr->nr_pages);
223+
unpin_user_pages(mr->pages, nr_refs);
217224
else
218-
release_pages(mr->pages, mr->nr_pages);
225+
release_pages(mr->pages, nr_refs);
226+
219227
kvfree(mr->pages);
220228
}
221229
if ((mr->flags & IO_REGION_F_VMAP) && mr->ptr)

0 commit comments

Comments
 (0)