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

drm/shmem: switch shmem helper to &drm_gem_object_funcs.mmap

Switch gem shmem helper to the new mmap() workflow,
from &gem_driver.fops.mmap to &drm_gem_object_funcs.mmap.

v2: Fix vm_flags and vm_page_prot handling.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20191016115203.20095-3-kraxel@redhat.com

+15 -25
+10 -18
drivers/gpu/drm/drm_gem_shmem_helper.c
··· 32 32 .get_sg_table = drm_gem_shmem_get_sg_table, 33 33 .vmap = drm_gem_shmem_vmap, 34 34 .vunmap = drm_gem_shmem_vunmap, 35 - .vm_ops = &drm_gem_shmem_vm_ops, 35 + .mmap = drm_gem_shmem_mmap, 36 36 }; 37 37 38 38 /** ··· 505 505 drm_gem_vm_close(vma); 506 506 } 507 507 508 - const struct vm_operations_struct drm_gem_shmem_vm_ops = { 508 + static const struct vm_operations_struct drm_gem_shmem_vm_ops = { 509 509 .fault = drm_gem_shmem_fault, 510 510 .open = drm_gem_shmem_vm_open, 511 511 .close = drm_gem_shmem_vm_close, 512 512 }; 513 - EXPORT_SYMBOL_GPL(drm_gem_shmem_vm_ops); 514 513 515 514 /** 516 515 * drm_gem_shmem_mmap - Memory-map a shmem GEM object 517 - * @filp: File object 516 + * @obj: gem object 518 517 * @vma: VMA for the area to be mapped 519 518 * 520 519 * This function implements an augmented version of the GEM DRM file mmap 521 520 * operation for shmem objects. Drivers which employ the shmem helpers should 522 - * use this function as their &file_operations.mmap handler in the DRM device file's 523 - * file_operations structure. 524 - * 525 - * Instead of directly referencing this function, drivers should use the 526 - * DEFINE_DRM_GEM_SHMEM_FOPS() macro. 521 + * use this function as their &drm_gem_object_funcs.mmap handler. 527 522 * 528 523 * Returns: 529 524 * 0 on success or a negative error code on failure. 530 525 */ 531 - int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma) 526 + int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 532 527 { 533 528 struct drm_gem_shmem_object *shmem; 534 529 int ret; 535 530 536 - ret = drm_gem_mmap(filp, vma); 537 - if (ret) 538 - return ret; 539 - 540 - shmem = to_drm_gem_shmem_obj(vma->vm_private_data); 531 + shmem = to_drm_gem_shmem_obj(obj); 541 532 542 533 ret = drm_gem_shmem_get_pages(shmem); 543 534 if (ret) { ··· 536 545 return ret; 537 546 } 538 547 539 - /* VM_PFNMAP was set by drm_gem_mmap() */ 540 - vma->vm_flags &= ~VM_PFNMAP; 541 - vma->vm_flags |= VM_MIXEDMAP; 548 + vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP; 549 + vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); 550 + vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); 551 + vma->vm_ops = &drm_gem_shmem_vm_ops; 542 552 543 553 /* Remove the fake offset */ 544 554 vma->vm_pgoff -= drm_vma_node_start(&shmem->base.vma_node);
+1 -1
drivers/gpu/drm/panfrost/panfrost_gem.c
··· 112 112 .get_sg_table = drm_gem_shmem_get_sg_table, 113 113 .vmap = drm_gem_shmem_vmap, 114 114 .vunmap = drm_gem_shmem_vunmap, 115 - .vm_ops = &drm_gem_shmem_vm_ops, 115 + .mmap = drm_gem_shmem_mmap, 116 116 }; 117 117 118 118 /**
+1 -1
drivers/gpu/drm/v3d/v3d_bo.c
··· 58 58 .get_sg_table = drm_gem_shmem_get_sg_table, 59 59 .vmap = drm_gem_shmem_vmap, 60 60 .vunmap = drm_gem_shmem_vunmap, 61 - .vm_ops = &drm_gem_shmem_vm_ops, 61 + .mmap = drm_gem_shmem_mmap, 62 62 }; 63 63 64 64 /* gem_create_object function for allocating a BO struct and doing
+1 -1
drivers/gpu/drm/virtio/virtgpu_object.c
··· 86 86 .get_sg_table = drm_gem_shmem_get_sg_table, 87 87 .vmap = drm_gem_shmem_vmap, 88 88 .vunmap = drm_gem_shmem_vunmap, 89 - .vm_ops = &drm_gem_shmem_vm_ops, 89 + .mmap = &drm_gem_shmem_mmap, 90 90 }; 91 91 92 92 struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev,
+2 -4
include/drm/drm_gem_shmem_helper.h
··· 111 111 .poll = drm_poll,\ 112 112 .read = drm_read,\ 113 113 .llseek = noop_llseek,\ 114 - .mmap = drm_gem_shmem_mmap, \ 114 + .mmap = drm_gem_mmap, \ 115 115 } 116 116 117 117 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size); ··· 143 143 int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev, 144 144 struct drm_mode_create_dumb *args); 145 145 146 - int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma); 147 - 148 - extern const struct vm_operations_struct drm_gem_shmem_vm_ops; 146 + int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 149 147 150 148 void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent, 151 149 const struct drm_gem_object *obj);