Skip to content

Commit a90558b

Browse files
isilenceaxboe
authored andcommitted
io_uring/memmap: helper for pinning region pages
In preparation to adding kernel allocated regions extract a new helper that pins user pages. Signed-off-by: Pavel Begunkov <[email protected]> Link: https://lore.kernel.org/r/a17d7c39c3de4266b66b75b2dcf768150e1fc618.1732886067.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <[email protected]>
1 parent c4d0ac1 commit a90558b

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

io_uring/memmap.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,28 @@ static int io_region_init_ptr(struct io_mapped_region *mr)
246246
return 0;
247247
}
248248

249+
static int io_region_pin_pages(struct io_ring_ctx *ctx,
250+
struct io_mapped_region *mr,
251+
struct io_uring_region_desc *reg)
252+
{
253+
unsigned long size = mr->nr_pages << PAGE_SHIFT;
254+
struct page **pages;
255+
int nr_pages;
256+
257+
pages = io_pin_pages(reg->user_addr, size, &nr_pages);
258+
if (IS_ERR(pages))
259+
return PTR_ERR(pages);
260+
if (WARN_ON_ONCE(nr_pages != mr->nr_pages))
261+
return -EFAULT;
262+
263+
mr->pages = pages;
264+
mr->flags |= IO_REGION_F_USER_PROVIDED;
265+
return 0;
266+
}
267+
249268
int io_create_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr,
250269
struct io_uring_region_desc *reg)
251270
{
252-
struct page **pages;
253271
int nr_pages, ret;
254272
u64 end;
255273

@@ -278,13 +296,9 @@ int io_create_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr,
278296
}
279297
mr->nr_pages = nr_pages;
280298

281-
pages = io_pin_pages(reg->user_addr, reg->size, &nr_pages);
282-
if (IS_ERR(pages)) {
283-
ret = PTR_ERR(pages);
299+
ret = io_region_pin_pages(ctx, mr, reg);
300+
if (ret)
284301
goto out_free;
285-
}
286-
mr->pages = pages;
287-
mr->flags |= IO_REGION_F_USER_PROVIDED;
288302

289303
ret = io_region_init_ptr(mr);
290304
if (ret)

0 commit comments

Comments
 (0)