@@ -254,6 +254,27 @@ int io_create_region_mmap_safe(struct io_ring_ctx *ctx, struct io_mapped_region
254
254
return 0 ;
255
255
}
256
256
257
+ static struct io_mapped_region * io_mmap_get_region (struct io_ring_ctx * ctx ,
258
+ loff_t pgoff )
259
+ {
260
+ loff_t offset = pgoff << PAGE_SHIFT ;
261
+ unsigned int bgid ;
262
+
263
+ switch (offset & IORING_OFF_MMAP_MASK ) {
264
+ case IORING_OFF_SQ_RING :
265
+ case IORING_OFF_CQ_RING :
266
+ return & ctx -> ring_region ;
267
+ case IORING_OFF_SQES :
268
+ return & ctx -> sq_region ;
269
+ case IORING_OFF_PBUF_RING :
270
+ bgid = (offset & ~IORING_OFF_MMAP_MASK ) >> IORING_OFF_PBUF_SHIFT ;
271
+ return io_pbuf_get_region (ctx , bgid );
272
+ case IORING_MAP_OFF_PARAM_REGION :
273
+ return & ctx -> param_region ;
274
+ }
275
+ return NULL ;
276
+ }
277
+
257
278
static void * io_region_validate_mmap (struct io_ring_ctx * ctx ,
258
279
struct io_mapped_region * mr )
259
280
{
@@ -271,39 +292,12 @@ static void *io_uring_validate_mmap_request(struct file *file, loff_t pgoff,
271
292
size_t sz )
272
293
{
273
294
struct io_ring_ctx * ctx = file -> private_data ;
274
- loff_t offset = pgoff << PAGE_SHIFT ;
295
+ struct io_mapped_region * region ;
275
296
276
- switch ((pgoff << PAGE_SHIFT ) & IORING_OFF_MMAP_MASK ) {
277
- case IORING_OFF_SQ_RING :
278
- case IORING_OFF_CQ_RING :
279
- /* Don't allow mmap if the ring was setup without it */
280
- if (ctx -> flags & IORING_SETUP_NO_MMAP )
281
- return ERR_PTR (- EINVAL );
282
- if (!ctx -> rings )
283
- return ERR_PTR (- EFAULT );
284
- return ctx -> rings ;
285
- case IORING_OFF_SQES :
286
- /* Don't allow mmap if the ring was setup without it */
287
- if (ctx -> flags & IORING_SETUP_NO_MMAP )
288
- return ERR_PTR (- EINVAL );
289
- if (!ctx -> sq_sqes )
290
- return ERR_PTR (- EFAULT );
291
- return ctx -> sq_sqes ;
292
- case IORING_OFF_PBUF_RING : {
293
- struct io_mapped_region * region ;
294
- unsigned int bgid ;
295
-
296
- bgid = (offset & ~IORING_OFF_MMAP_MASK ) >> IORING_OFF_PBUF_SHIFT ;
297
- region = io_pbuf_get_region (ctx , bgid );
298
- if (!region )
299
- return ERR_PTR (- EINVAL );
300
- return io_region_validate_mmap (ctx , region );
301
- }
302
- case IORING_MAP_OFF_PARAM_REGION :
303
- return io_region_validate_mmap (ctx , & ctx -> param_region );
304
- }
305
-
306
- return ERR_PTR (- EINVAL );
297
+ region = io_mmap_get_region (ctx , pgoff );
298
+ if (!region )
299
+ return ERR_PTR (- EINVAL );
300
+ return io_region_validate_mmap (ctx , region );
307
301
}
308
302
309
303
#ifdef CONFIG_MMU
@@ -324,7 +318,8 @@ __cold int io_uring_mmap(struct file *file, struct vm_area_struct *vma)
324
318
struct io_ring_ctx * ctx = file -> private_data ;
325
319
size_t sz = vma -> vm_end - vma -> vm_start ;
326
320
long offset = vma -> vm_pgoff << PAGE_SHIFT ;
327
- unsigned int page_limit ;
321
+ unsigned int page_limit = UINT_MAX ;
322
+ struct io_mapped_region * region ;
328
323
void * ptr ;
329
324
330
325
guard (mutex )(& ctx -> mmap_lock );
@@ -337,25 +332,11 @@ __cold int io_uring_mmap(struct file *file, struct vm_area_struct *vma)
337
332
case IORING_OFF_SQ_RING :
338
333
case IORING_OFF_CQ_RING :
339
334
page_limit = (sz + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
340
- return io_region_mmap (ctx , & ctx -> ring_region , vma , page_limit );
341
- case IORING_OFF_SQES :
342
- return io_region_mmap (ctx , & ctx -> sq_region , vma , UINT_MAX );
343
- case IORING_OFF_PBUF_RING : {
344
- struct io_mapped_region * region ;
345
- unsigned int bgid ;
346
-
347
- bgid = (offset & ~IORING_OFF_MMAP_MASK ) >> IORING_OFF_PBUF_SHIFT ;
348
- region = io_pbuf_get_region (ctx , bgid );
349
- if (!region )
350
- return - EINVAL ;
351
-
352
- return io_region_mmap (ctx , region , vma , UINT_MAX );
353
- }
354
- case IORING_MAP_OFF_PARAM_REGION :
355
- return io_region_mmap (ctx , & ctx -> param_region , vma , UINT_MAX );
335
+ break ;
356
336
}
357
337
358
- return - EINVAL ;
338
+ region = io_mmap_get_region (ctx , vma -> vm_pgoff );
339
+ return io_region_mmap (ctx , region , vma , page_limit );
359
340
}
360
341
361
342
unsigned long io_uring_get_unmapped_area (struct file * filp , unsigned long addr ,
0 commit comments