Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

io_uring: unify io_pin_pages()

Move it into io_uring.c where it belongs, and use it in there as well
rather than have two implementations of this.

Signed-off-by: Jens Axboe <axboe@kernel.dk>

+42 -55
+42 -19
io_uring/io_uring.c
··· 2650 2650 *pages = NULL; 2651 2651 } 2652 2652 2653 + struct page **io_pin_pages(unsigned long uaddr, unsigned long len, int *npages) 2654 + { 2655 + unsigned long start, end, nr_pages; 2656 + struct page **pages; 2657 + int ret; 2658 + 2659 + end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; 2660 + start = uaddr >> PAGE_SHIFT; 2661 + nr_pages = end - start; 2662 + if (WARN_ON_ONCE(!nr_pages)) 2663 + return ERR_PTR(-EINVAL); 2664 + 2665 + pages = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); 2666 + if (!pages) 2667 + return ERR_PTR(-ENOMEM); 2668 + 2669 + ret = pin_user_pages_fast(uaddr, nr_pages, FOLL_WRITE | FOLL_LONGTERM, 2670 + pages); 2671 + /* success, mapped all pages */ 2672 + if (ret == nr_pages) { 2673 + *npages = nr_pages; 2674 + return pages; 2675 + } 2676 + 2677 + /* partial map, or didn't map anything */ 2678 + if (ret >= 0) { 2679 + /* if we did partial map, release any pages we did get */ 2680 + if (ret) 2681 + unpin_user_pages(pages, ret); 2682 + ret = -EFAULT; 2683 + } 2684 + kvfree(pages); 2685 + return ERR_PTR(ret); 2686 + } 2687 + 2653 2688 static void *__io_uaddr_map(struct page ***pages, unsigned short *npages, 2654 2689 unsigned long uaddr, size_t size) 2655 2690 { 2656 2691 struct page **page_array; 2657 2692 unsigned int nr_pages; 2658 2693 void *page_addr; 2659 - int ret, pinned; 2660 2694 2661 2695 *npages = 0; 2662 2696 2663 2697 if (uaddr & (PAGE_SIZE - 1) || !size) 2664 2698 return ERR_PTR(-EINVAL); 2665 2699 2666 - nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; 2667 - if (nr_pages > USHRT_MAX) 2668 - return ERR_PTR(-EINVAL); 2669 - page_array = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); 2670 - if (!page_array) 2671 - return ERR_PTR(-ENOMEM); 2672 - 2673 - 2674 - pinned = pin_user_pages_fast(uaddr, nr_pages, FOLL_WRITE | FOLL_LONGTERM, 2675 - page_array); 2676 - if (pinned != nr_pages) { 2677 - ret = (pinned < 0) ? pinned : -EFAULT; 2678 - goto free_pages; 2679 - } 2700 + nr_pages = 0; 2701 + page_array = io_pin_pages(uaddr, size, &nr_pages); 2702 + if (IS_ERR(page_array)) 2703 + return page_array; 2680 2704 2681 2705 page_addr = vmap(page_array, nr_pages, VM_MAP, PAGE_KERNEL); 2682 2706 if (page_addr) { ··· 2708 2684 *npages = nr_pages; 2709 2685 return page_addr; 2710 2686 } 2711 - ret = -ENOMEM; 2712 - free_pages: 2713 - io_pages_free(&page_array, pinned > 0 ? pinned : 0); 2714 - return ERR_PTR(ret); 2687 + 2688 + io_pages_free(&page_array, nr_pages); 2689 + return ERR_PTR(-ENOMEM); 2715 2690 } 2716 2691 2717 2692 static void *io_rings_map(struct io_ring_ctx *ctx, unsigned long uaddr,
-36
io_uring/rsrc.c
··· 870 870 return ret; 871 871 } 872 872 873 - struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages) 874 - { 875 - unsigned long start, end, nr_pages; 876 - struct page **pages = NULL; 877 - int ret; 878 - 879 - end = (ubuf + len + PAGE_SIZE - 1) >> PAGE_SHIFT; 880 - start = ubuf >> PAGE_SHIFT; 881 - nr_pages = end - start; 882 - WARN_ON(!nr_pages); 883 - 884 - pages = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL); 885 - if (!pages) 886 - return ERR_PTR(-ENOMEM); 887 - 888 - mmap_read_lock(current->mm); 889 - ret = pin_user_pages(ubuf, nr_pages, FOLL_WRITE | FOLL_LONGTERM, pages); 890 - mmap_read_unlock(current->mm); 891 - 892 - /* success, mapped all pages */ 893 - if (ret == nr_pages) { 894 - *npages = nr_pages; 895 - return pages; 896 - } 897 - 898 - /* partial map, or didn't map anything */ 899 - if (ret >= 0) { 900 - /* if we did partial map, release any pages we did get */ 901 - if (ret) 902 - unpin_user_pages(pages, ret); 903 - ret = -EFAULT; 904 - } 905 - kvfree(pages); 906 - return ERR_PTR(ret); 907 - } 908 - 909 873 static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov, 910 874 struct io_mapped_ubuf **pimu, 911 875 struct page **last_hpage)