Lines Matching defs:mr
91 void io_free_region(struct user_struct *user, struct io_mapped_region *mr)
93 if (mr->pages) {
94 long nr_refs = mr->nr_pages;
96 if (mr->flags & IO_REGION_F_SINGLE_REF)
99 if (mr->flags & IO_REGION_F_USER_PROVIDED)
100 unpin_user_pages(mr->pages, nr_refs);
102 release_pages(mr->pages, nr_refs);
104 kvfree(mr->pages);
106 if ((mr->flags & IO_REGION_F_VMAP) && mr->ptr)
107 vunmap(mr->ptr);
108 if (mr->nr_pages && user)
109 __io_unaccount_mem(user, mr->nr_pages);
111 memset(mr, 0, sizeof(*mr));
114 static int io_region_init_ptr(struct io_mapped_region *mr)
119 if (io_check_coalesce_buffer(mr->pages, mr->nr_pages, &ifd)) {
120 if (ifd.nr_folios == 1 && !PageHighMem(mr->pages[0])) {
121 mr->ptr = page_address(mr->pages[0]);
125 ptr = vmap(mr->pages, mr->nr_pages, VM_MAP, PAGE_KERNEL);
129 mr->ptr = ptr;
130 mr->flags |= IO_REGION_F_VMAP;
134 static int io_region_pin_pages(struct io_mapped_region *mr,
137 size_t size = io_region_size(mr);
144 if (WARN_ON_ONCE(nr_pages != mr->nr_pages))
147 mr->pages = pages;
148 mr->flags |= IO_REGION_F_USER_PROVIDED;
152 static int io_region_allocate_pages(struct io_mapped_region *mr,
157 size_t size = io_region_size(mr);
161 pages = kvmalloc_objs(*pages, mr->nr_pages, gfp);
165 if (io_mem_alloc_compound(pages, mr->nr_pages, size, gfp)) {
166 mr->flags |= IO_REGION_F_SINGLE_REF;
171 mr->nr_pages, pages);
172 if (nr_allocated != mr->nr_pages) {
180 mr->pages = pages;
184 int io_create_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr,
191 if (WARN_ON_ONCE(mr->pages || mr->ptr || mr->nr_pages))
215 mr->nr_pages = nr_pages;
218 ret = io_region_pin_pages(mr, reg);
220 ret = io_region_allocate_pages(mr, reg, mmap_offset);
224 ret = io_region_init_ptr(mr);
229 io_free_region(ctx->user, mr);
259 struct io_mapped_region *mr)
263 if (!io_region_is_set(mr))
265 if (mr->flags & IO_REGION_F_USER_PROVIDED)
268 return io_region_get_ptr(mr);
285 struct io_mapped_region *mr,
289 unsigned long nr_pages = min(mr->nr_pages, max_pages);
292 return vm_insert_pages(vma, vma->vm_start, mr->pages, &nr_pages);