Patch "drm/rockchip: use drm_gem_mmap helpers" has been added to the 4.1-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
drm/rockchip: use drm_gem_mmap helpers
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-rockchip-use-drm_gem_mmap-helpers.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
41315b793e13f884cda79389f0d5d44d027e57d1Mon Sep 17 00:00:00 2001
From: Daniel Kurtz <[email protected]>
Date: Tue, 7 Jul 2015 17:03:36 +0800
Subject: drm/rockchip: use drm_gem_mmap helpers
From: Daniel Kurtz <[email protected]>
commit 41315b793e13f884cda79389f0d5d44d027e57d1 upstream.
Rather than (incompletely [0]) re-implementing drm_gem_mmap() and drm_gem_mmap_obj() helpers, call them directly from the rockchip mmap routines.
Once the core functions return successfully, the rockchip mmap routines can still use dma_mmap_attrs() to simply mmap the entire buffer.
[0] Previously, we were performing the mmap() without first taking a reference on the underlying gem buffer. This could leak ptes if the gem object is destroyed while userspace is still holding the mapping.
--- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 67 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 33 deletions(-)
drivers/gpu/drm/rockchip/rockchip_drm_gem.c +34 -33
@@ -54,55 +54,56 @@ static void rockchip_gem_free_buf(struct &rk_obj->dma_attrs); } -int rockchip_gem_mmap_buf (struct drm_gem_object *obj, -struct vm_area_struct *vma) +static int rockchip_drm_gem_object_mmap (struct drm_gem_object *obj, +struct vm_area_struct *vma) + { +int ret;struct rockchip_gem_object *rk_obj =to_rockchip_obj (obj);struct drm_device *drm = obj->dev; -unsigned long vm_size; - - vma->vm_flags |=VM_IO |VM_DONTEXPAND |VM_DONTDUMP ; - vm_size = vma->vm_end - vma->vm_start; -if (vm_size > obj->size) -return -EINVAL ; +/* +* dma_alloc_attrs() allocated a struct page table for rk_obj, so clear +* VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). +*/ + vma->vm_flags &= ~VM_PFNMAP ; -return dma_mmap_attrs (drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, + ret =dma_mmap_attrs (drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, obj->size, &rk_obj->dma_attrs); +if (ret) +drm_gem_vm_close (vma); + +return ret; } -/* drm driver mmap file operations */ -int rockchip_gem_mmap (struct file *filp,struct vm_area_struct *vma) +int rockchip_gem_mmap_buf (struct drm_gem_object *obj, +struct vm_area_struct *vma) { -struct drm_file *priv = filp->private_data; -struct drm_device *dev = priv->minor->dev; -struct drm_gem_object *obj; -struct drm_vma_offset_node *node; +struct drm_device *drm = obj->dev;int ret; -if (drm_device_is_unplugged (dev)) -return -ENODEV ; +mutex_lock (&drm->struct_mutex); + ret =drm_gem_mmap_obj (obj, obj->size, vma); +mutex_unlock (&drm->struct_mutex); +if (ret) +return ret; -mutex_lock (&dev->struct_mutex); +return rockchip_drm_gem_object_mmap (obj, vma); +} - node =drm_vma_offset_exact_lookup (dev->vma_offset_manager, - vma->vm_pgoff, -vma_pages (vma)); -if (!node) { -mutex_unlock (&dev->struct_mutex); -DRM_ERROR ("failed to find vma node.\n" ); -return -EINVAL ; - }else if (!drm_vma_node_is_allowed (node, filp)) { -mutex_unlock (&dev->struct_mutex); -return -EACCES ; - } +/* drm driver mmap file operations */ +int rockchip_gem_mmap (struct file *filp,struct vm_area_struct *vma) +{ +struct drm_gem_object *obj; +int ret; - obj = container_of(node, struct drm_gem_object, vma_node); - ret =rockchip_gem_mmap_buf (obj, vma); + ret =drm_gem_mmap (filp, vma); +if (ret) +return ret; -mutex_unlock (&dev->struct_mutex); + obj = vma->vm_private_data; -return ret; +return rockchip_drm_gem_object_mmap (obj, vma); } struct rockchip_gem_object *
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/drm-rockchip-use-drm_gem_mmap-helpers.patch