OSDN Git Service

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)
committerBoris Brezillon <boris.brezillon@collabora.com>
Mon, 15 Feb 2021 08:43:33 +0000 (09:43 +0100)
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
drivers/gpu/drm/panfrost/panfrost_mmu.c

index 904d634..21e552d 100644 (file)
@@ -488,8 +488,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);
@@ -522,6 +528,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;