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

drm/omapdrm: Set VM flags in GEM-object mmap function

Use the mmap callback in struct drm_gem_object_funcs to set the
VM flags. Replace a number of mmap helpers in omapdrm with their
GEM helper counterparts. Generate DRM's file-operations instance
with GEM's DEFINE_DRM_GEM_FOPS.

The omapdrm driver uses DRM's drm_gem_mmap() helper to prepare
the VMA structure. It then modifies the resulting VMA state in
its own helper omap_gem_mmap_obj(). The patch improves this by
setting up the VMA in the mmap callback in drm_gem_object_funcs,
which is called from within drm_gem_mmap().

Omapdrm's omap_gem_mmap() and omap_gem_mmap() can then be removed
from the driver. A call to drm_gem_mmap() is sufficient for the
mmap operation.

Finally, with the omap functions gone, the drivers file_ops in
omapdriver_fops can be generated with DEFINE_DRM_GEM_FOPS, which
sets DRM's default helpers.

v2:
* detailed commit message (Javier)
* do not set VM_PFNMAP

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230707083422.18691-9-tzimmermann@suse.de

+8 -38
+1 -11
drivers/gpu/drm/omapdrm/omap_drv.c
··· 636 636 return 0; 637 637 } 638 638 639 - static const struct file_operations omapdriver_fops = { 640 - .owner = THIS_MODULE, 641 - .open = drm_open, 642 - .unlocked_ioctl = drm_ioctl, 643 - .compat_ioctl = drm_compat_ioctl, 644 - .release = drm_release, 645 - .mmap = omap_gem_mmap, 646 - .poll = drm_poll, 647 - .read = drm_read, 648 - .llseek = noop_llseek, 649 - }; 639 + DEFINE_DRM_GEM_FOPS(omapdriver_fops); 650 640 651 641 static const struct drm_driver omap_drm_driver = { 652 642 .driver_features = DRIVER_MODESET | DRIVER_GEM |
+6 -18
drivers/gpu/drm/omapdrm/omap_gem.c
··· 524 524 return ret; 525 525 } 526 526 527 - /** We override mainly to fix up some of the vm mapping flags.. */ 528 - int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma) 529 - { 530 - int ret; 531 - 532 - ret = drm_gem_mmap(filp, vma); 533 - if (ret) { 534 - DBG("mmap failed: %d", ret); 535 - return ret; 536 - } 537 - 538 - return omap_gem_mmap_obj(vma->vm_private_data, vma); 539 - } 540 - 541 - int omap_gem_mmap_obj(struct drm_gem_object *obj, 542 - struct vm_area_struct *vma) 527 + static int omap_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 543 528 { 544 529 struct omap_gem_object *omap_obj = to_omap_bo(obj); 545 530 546 - vm_flags_mod(vma, VM_MIXEDMAP, VM_PFNMAP); 531 + vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP | VM_IO | VM_MIXEDMAP); 547 532 548 533 if (omap_obj->flags & OMAP_BO_WC) { 549 534 vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); ··· 548 563 * address_space (so unmap_mapping_range does what we want, 549 564 * in particular in the case of mmap'd dmabufs) 550 565 */ 551 - vma->vm_pgoff = 0; 566 + vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node); 552 567 vma_set_file(vma, obj->filp); 553 568 554 569 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); 555 570 } 571 + 572 + vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); 556 573 557 574 return 0; 558 575 } ··· 1269 1282 static const struct drm_gem_object_funcs omap_gem_object_funcs = { 1270 1283 .free = omap_gem_free_object, 1271 1284 .export = omap_gem_prime_export, 1285 + .mmap = omap_gem_object_mmap, 1272 1286 .vm_ops = &omap_gem_vm_ops, 1273 1287 }; 1274 1288
-3
drivers/gpu/drm/omapdrm/omap_gem.h
··· 57 57 struct drm_mode_create_dumb *args); 58 58 59 59 /* mmap() Interface */ 60 - int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma); 61 - int omap_gem_mmap_obj(struct drm_gem_object *obj, 62 - struct vm_area_struct *vma); 63 60 u64 omap_gem_mmap_offset(struct drm_gem_object *obj); 64 61 size_t omap_gem_mmap_size(struct drm_gem_object *obj); 65 62
+1 -6
drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
··· 64 64 struct vm_area_struct *vma) 65 65 { 66 66 struct drm_gem_object *obj = buffer->priv; 67 - int ret = 0; 68 67 69 - ret = drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma); 70 - if (ret < 0) 71 - return ret; 72 - 73 - return omap_gem_mmap_obj(obj, vma); 68 + return drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma); 74 69 } 75 70 76 71 static const struct dma_buf_ops omap_dmabuf_ops = {