drm/panfrost: Don't try to map pages that are already mapped
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 5 Feb 2021 11:17:56 +0000 (12:17 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 May 2021 07:50:01 +0000 (09:50 +0200)
commit f45da8204ff1707c529a8769f5467ff16f504b26 upstream.

We allocate 2MB chunks at a time, so it might appear that a page fault
has already been handled by a previous page fault when we reach
panfrost_mmu_map_fault_addr(). Bail out in that case to avoid mapping the
same area twice.

Cc: <stable@vger.kernel.org>
Fixes: 187d2929206e ("drm/panfrost: Add support for GPU heap allocations")
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Steven Price <steven.price@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210205111757.585248-3-boris.brezillon@collabora.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/panfrost/panfrost_mmu.c

index e5f7f647430f210891ac30c5241fef7cd3a24a87..1986862163178ab581b393ca1639415abdcef749 100644 (file)
@@ -495,8 +495,14 @@ static int panfrost_mmu_map_fault_addr(struct panfrost_device *pfdev, int as,
                }
                bo->base.pages = pages;
                bo->base.pages_use_count = 1;
-       } else
+       } else {
                pages = bo->base.pages;
+               if (pages[page_offset]) {
+                       /* Pages are already mapped, bail out. */
+                       mutex_unlock(&bo->base.pages_lock);
+                       goto out;
+               }
+       }
 
        mapping = bo->base.base.filp->f_mapping;
        mapping_set_unevictable(mapping);
@@ -529,6 +535,7 @@ static int panfrost_mmu_map_fault_addr(struct panfrost_device *pfdev, int as,
 
        dev_dbg(pfdev->dev, "mapped page fault @ AS%d %llx", as, addr);
 
+out:
        panfrost_gem_mapping_put(bomapping);
 
        return 0;