Merge tag 'drm-msm-next-2023-08-20' of https://gitlab.freedesktop.org/drm/msm into...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / msm / msm_gem.c
index 20cfd86d2b324ae44287b51c30fd59f7e90425fb..db1e748daa753fa9293d883b83db2047a83b1024 100644 (file)
@@ -222,9 +222,7 @@ static void put_pages(struct drm_gem_object *obj)
 static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
                                              unsigned madv)
 {
-       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       struct page **p;
 
        msm_gem_assert_locked(obj);
 
@@ -234,16 +232,29 @@ static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
                return ERR_PTR(-EBUSY);
        }
 
-       p = get_pages(obj);
-       if (IS_ERR(p))
-               return p;
+       return get_pages(obj);
+}
+
+/*
+ * Update the pin count of the object, call under lru.lock
+ */
+void msm_gem_pin_obj_locked(struct drm_gem_object *obj)
+{
+       struct msm_drm_private *priv = obj->dev->dev_private;
+
+       msm_gem_assert_locked(obj);
+
+       to_msm_bo(obj)->pin_count++;
+       drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
+}
+
+static void pin_obj_locked(struct drm_gem_object *obj)
+{
+       struct msm_drm_private *priv = obj->dev->dev_private;
 
        mutex_lock(&priv->lru.lock);
-       msm_obj->pin_count++;
-       update_lru_locked(obj);
+       msm_gem_pin_obj_locked(obj);
        mutex_unlock(&priv->lru.lock);
-
-       return p;
 }
 
 struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
@@ -252,6 +263,8 @@ struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
 
        msm_gem_lock(obj);
        p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
+       if (!IS_ERR(p))
+               pin_obj_locked(obj);
        msm_gem_unlock(obj);
 
        return p;
@@ -463,7 +476,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct page **pages;
-       int ret, prot = IOMMU_READ;
+       int prot = IOMMU_READ;
 
        if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
                prot |= IOMMU_WRITE;
@@ -480,11 +493,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
-       ret = msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
-       if (ret)
-               msm_gem_unpin_locked(obj);
-
-       return ret;
+       return msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
 }
 
 void msm_gem_unpin_locked(struct drm_gem_object *obj)
@@ -509,14 +518,11 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj)
  */
 void msm_gem_unpin_active(struct drm_gem_object *obj)
 {
-       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
-       mutex_lock(&priv->lru.lock);
        msm_obj->pin_count--;
        GEM_WARN_ON(msm_obj->pin_count < 0);
        update_lru_active(obj);
-       mutex_unlock(&priv->lru.lock);
 }
 
 struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,
@@ -539,8 +545,10 @@ static int get_and_pin_iova_range_locked(struct drm_gem_object *obj,
                return PTR_ERR(vma);
 
        ret = msm_gem_pin_vma_locked(obj, vma);
-       if (!ret)
+       if (!ret) {
                *iova = vma->iova;
+               pin_obj_locked(obj);
+       }
 
        return ret;
 }
@@ -599,9 +607,6 @@ static int clear_iova(struct drm_gem_object *obj,
        if (!vma)
                return 0;
 
-       if (msm_gem_vma_inuse(vma))
-               return -EBUSY;
-
        msm_gem_vma_purge(vma);
        msm_gem_vma_close(vma);
        del_vma(vma);
@@ -652,7 +657,6 @@ void msm_gem_unpin_iova(struct drm_gem_object *obj,
        msm_gem_lock(obj);
        vma = lookup_vma(obj, aspace);
        if (!GEM_WARN_ON(!vma)) {
-               msm_gem_vma_unpin(vma);
                msm_gem_unpin_locked(obj);
        }
        msm_gem_unlock(obj);
@@ -703,6 +707,8 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
        if (IS_ERR(pages))
                return ERR_CAST(pages);
 
+       pin_obj_locked(obj);
+
        /* increment vmap_count *before* vmap() call, so shrinker can
         * check vmap_count (is_vunmapable()) outside of msm_obj lock.
         * This guarantees that we won't try to msm_gem_vunmap() this
@@ -981,11 +987,10 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,
                        } else {
                                name = comm = NULL;
                        }
-                       seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s,inuse=%d]",
+                       seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s]",
                                name, comm ? ":" : "", comm ? comm : "",
                                vma->aspace, vma->iova,
-                               vma->mapped ? "mapped" : "unmapped",
-                               msm_gem_vma_inuse(vma));
+                               vma->mapped ? "mapped" : "unmapped");
                        kfree(comm);
                }
 
@@ -1234,6 +1239,10 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32
        list_add_tail(&msm_obj->node, &priv->objects);
        mutex_unlock(&priv->obj_lock);
 
+       ret = drm_gem_create_mmap_offset(obj);
+       if (ret)
+               goto fail;
+
        return obj;
 
 fail:
@@ -1290,6 +1299,10 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
        list_add_tail(&msm_obj->node, &priv->objects);
        mutex_unlock(&priv->obj_lock);
 
+       ret = drm_gem_create_mmap_offset(obj);
+       if (ret)
+               goto fail;
+
        return obj;
 
 fail: