drm/gma500: Add driver private mutex for the fault handler
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 23 Nov 2015 09:32:53 +0000 (10:32 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 1 Dec 2015 09:05:11 +0000 (10:05 +0100)
There's currently two places where the gma500 fault handler relies
upon dev->struct_mutex:
- To protect r->mappping
- To make sure vm_insert_pfn isn't called concurrently (in which case
  the 2nd thread would get an error code).

Everything else (specifically psb_gtt_pin) is already protected by
some other locks. Hence just create a new driver-private mmap_mutex
just for this function.

With this gma500 is complete dev->struct_mutex free!

Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1448271183-20523-21-git-send-email-daniel.vetter@ffwll.ch
drivers/gpu/drm/gma500/gem.c
drivers/gpu/drm/gma500/gtt.c
drivers/gpu/drm/gma500/psb_drv.h

index f0357f525f56ef7de27161c3f0393289d589970f..506224b3a0adf298ea5d5f4d71416df4aa88d41e 100644 (file)
@@ -182,7 +182,7 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 
        /* Make sure we don't parallel update on a fault, nor move or remove
           something from beneath our feet */
-       mutex_lock(&dev->struct_mutex);
+       mutex_lock(&dev_priv->mmap_mutex);
 
        /* For now the mmap pins the object and it stays pinned. As things
           stand that will do us no harm */
@@ -208,7 +208,7 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
 
 fail:
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev_priv->mmap_mutex);
        switch (ret) {
        case 0:
        case -ERESTARTSYS:
index ce015db59dc6f594c55deb94479cd10c4fef2d00..8f69225ce2b4a9da3d22c81a63e3e31abd9f2cd0 100644 (file)
@@ -425,6 +425,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
 
        if (!resume) {
                mutex_init(&dev_priv->gtt_mutex);
+               mutex_init(&dev_priv->mmap_mutex);
                psb_gtt_alloc(dev);
        }
 
index e21726ecac327792c17be5bf56ec8566bd0c2304..3bd2c726dd61526f435d121f64c507f7de32bb56 100644 (file)
@@ -465,6 +465,8 @@ struct drm_psb_private {
        struct mutex gtt_mutex;
        struct resource *gtt_mem;       /* Our PCI resource */
 
+       struct mutex mmap_mutex;
+
        struct psb_mmu_driver *mmu;
        struct psb_mmu_pd *pf_pd;