We want to get rid of this helper function, so let's use
drm_gem_shmem_unpin() and move this call out of the
dma_resv-locked section.

Signed-off-by: Boris Brezillon <boris.brezil...@collabora.com>
Cc: Daniel Vetter <dan...@ffwll.ch>
Cc: Thomas Zimmermann <tzimmerm...@suse.de>
Cc: Emil Velikov <emil.l.veli...@gmail.com>
Cc: Dmitry Osipenko <dmitry.osipe...@collabora.com>
Cc: Rob Herring <r...@kernel.org>
Cc: Steven Price <steven.pr...@arm.com>
---
 drivers/gpu/drm/panfrost/panfrost_mmu.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c 
b/drivers/gpu/drm/panfrost/panfrost_mmu.c
index c0123d09f699..0b12f03ef0be 100644
--- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
+++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
@@ -447,6 +447,7 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
        pgoff_t page_offset;
        struct sg_table *sgt;
        struct page **pages;
+       bool pinned = false;
 
        bomapping = addr_to_mapping(pfdev, as, addr);
        if (!bomapping)
@@ -488,12 +489,14 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
                }
                bo->base.pages = pages;
                bo->base.pages_use_count = 1;
+               pinned = true;
        } else {
                pages = bo->base.pages;
                if (pages[page_offset]) {
                        /* Pages are already mapped, bail out. */
                        goto out;
                }
+               pinned = true;
        }
 
        mapping = bo->base.base.filp->f_mapping;
@@ -504,7 +507,7 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
                if (IS_ERR(pages[i])) {
                        ret = PTR_ERR(pages[i]);
                        pages[i] = NULL;
-                       goto err_pages;
+                       goto err_unlock;
                }
        }
 
@@ -512,7 +515,7 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
        ret = sg_alloc_table_from_pages(sgt, pages + page_offset,
                                        NUM_FAULT_PAGES, 0, SZ_2M, GFP_KERNEL);
        if (ret)
-               goto err_pages;
+               goto err_unlock;
 
        ret = dma_map_sgtable(pfdev->dev, sgt, DMA_BIDIRECTIONAL, 0);
        if (ret)
@@ -534,10 +537,12 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
 
 err_map:
        sg_free_table(sgt);
-err_pages:
-       drm_gem_shmem_put_pages(&bo->base);
 err_unlock:
        dma_resv_unlock(obj->resv);
+
+       if (ret && pinned)
+               drm_gem_shmem_unpin(&bo->base);
+
 err_bo:
        panfrost_gem_mapping_put(bomapping);
        return ret;
-- 
2.41.0

Reply via email to