Message ID | 20240327191933.607220-4-axboe@kernel.dk (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Move away from remap_pfn_range() | expand |
Jens Axboe <axboe@kernel.dk> writes: > This is the last holdout which does odd page checking, convert it to > vmap just like what is done for the non-mmap path. > > Signed-off-by: Jens Axboe <axboe@kernel.dk> > --- > io_uring/io_uring.c | 40 +++++++++------------------------------- > 1 file changed, 9 insertions(+), 31 deletions(-) > > diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c > index 29d0c1764aab..67c93b290ed9 100644 > --- a/io_uring/io_uring.c > +++ b/io_uring/io_uring.c > @@ -63,7 +63,6 @@ > #include <linux/sched/mm.h> > #include <linux/uaccess.h> > #include <linux/nospec.h> > -#include <linux/highmem.h> > #include <linux/fsnotify.h> > #include <linux/fadvise.h> > #include <linux/task_work.h> > @@ -2650,7 +2649,7 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, > struct page **page_array; > unsigned int nr_pages; > void *page_addr; > - int ret, i, pinned; > + int ret, pinned; > > *npages = 0; > > @@ -2659,8 +2658,6 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, > > nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; > if (nr_pages > USHRT_MAX) > - return ERR_PTR(-EINVAL); > - page_array = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); > if (!page_array) > return ERR_PTR(-ENOMEM); That's not right. ;-) It gets fixed up (removed) in the next patch. -Jeff
On 3/27/24 2:29 PM, Jeff Moyer wrote: > Jens Axboe <axboe@kernel.dk> writes: > >> This is the last holdout which does odd page checking, convert it to >> vmap just like what is done for the non-mmap path. >> >> Signed-off-by: Jens Axboe <axboe@kernel.dk> >> --- >> io_uring/io_uring.c | 40 +++++++++------------------------------- >> 1 file changed, 9 insertions(+), 31 deletions(-) >> >> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c >> index 29d0c1764aab..67c93b290ed9 100644 >> --- a/io_uring/io_uring.c >> +++ b/io_uring/io_uring.c >> @@ -63,7 +63,6 @@ >> #include <linux/sched/mm.h> >> #include <linux/uaccess.h> >> #include <linux/nospec.h> >> -#include <linux/highmem.h> >> #include <linux/fsnotify.h> >> #include <linux/fadvise.h> >> #include <linux/task_work.h> >> @@ -2650,7 +2649,7 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, >> struct page **page_array; >> unsigned int nr_pages; >> void *page_addr; >> - int ret, i, pinned; >> + int ret, pinned; >> >> *npages = 0; >> >> @@ -2659,8 +2658,6 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, >> >> nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; >> if (nr_pages > USHRT_MAX) >> - return ERR_PTR(-EINVAL); >> - page_array = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); >> if (!page_array) >> return ERR_PTR(-ENOMEM); > > That's not right. ;-) It gets fixed up (removed) in the next patch. Ah crap, I had to re-order the series this morning before posting, I guess that snuck in. Let me build/test each in order and fix this hunk up.
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 29d0c1764aab..67c93b290ed9 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -63,7 +63,6 @@ #include <linux/sched/mm.h> #include <linux/uaccess.h> #include <linux/nospec.h> -#include <linux/highmem.h> #include <linux/fsnotify.h> #include <linux/fadvise.h> #include <linux/task_work.h> @@ -2650,7 +2649,7 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, struct page **page_array; unsigned int nr_pages; void *page_addr; - int ret, i, pinned; + int ret, pinned; *npages = 0; @@ -2659,8 +2658,6 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; if (nr_pages > USHRT_MAX) - return ERR_PTR(-EINVAL); - page_array = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); if (!page_array) return ERR_PTR(-ENOMEM); @@ -2672,34 +2669,13 @@ static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, goto free_pages; } - page_addr = page_address(page_array[0]); - for (i = 0; i < nr_pages; i++) { - ret = -EINVAL; - - /* - * Can't support mapping user allocated ring memory on 32-bit - * archs where it could potentially reside in highmem. Just - * fail those with -EINVAL, just like we did on kernels that - * didn't support this feature. - */ - if (PageHighMem(page_array[i])) - goto free_pages; - - /* - * No support for discontig pages for now, should either be a - * single normal page, or a huge page. Later on we can add - * support for remapping discontig pages, for now we will - * just fail them with EINVAL. - */ - if (page_address(page_array[i]) != page_addr) - goto free_pages; - page_addr += PAGE_SIZE; + page_addr = vmap(page_array, nr_pages, VM_MAP, PAGE_KERNEL); + if (page_addr) { + *pages = page_array; + *npages = nr_pages; + return page_addr; } - - *pages = page_array; - *npages = nr_pages; - return page_to_virt(page_array[0]); - + ret = -ENOMEM; free_pages: io_pages_free(&page_array, pinned > 0 ? pinned : 0); return ERR_PTR(ret); @@ -2729,6 +2705,8 @@ static void io_rings_free(struct io_ring_ctx *ctx) ctx->n_ring_pages = 0; io_pages_free(&ctx->sqe_pages, ctx->n_sqe_pages); ctx->n_sqe_pages = 0; + vunmap(ctx->rings); + vunmap(ctx->sq_sqes); } ctx->rings = NULL;
This is the last holdout which does odd page checking, convert it to vmap just like what is done for the non-mmap path. Signed-off-by: Jens Axboe <axboe@kernel.dk> --- io_uring/io_uring.c | 40 +++++++++------------------------------- 1 file changed, 9 insertions(+), 31 deletions(-)