Our initial logic for excluding dma-bufs was not quite right.  In
particular we want msm_gem_get/put_pages() path used for exported
dma-bufs to increment/decrement the pin-count.
Also, in case the importer is vmap'ing the dma-buf, we need to be
sure to update the object's status, because it is now no longer
potentially evictable.
Fixes: 63f17ef83428 drm/msm: Support evicting GEM objects to swap
Signed-off-by: Rob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20210426235326.1230125-1-robdclark@gmail.com
Signed-off-by: Rob Clark <robdclark@chromium.org>
        }
 
        p = get_pages(obj);
+
+       if (!IS_ERR(p)) {
+               msm_obj->pin_count++;
+               update_inactive(msm_obj);
+       }
+
        msm_gem_unlock(obj);
        return p;
 }
 
 void msm_gem_put_pages(struct drm_gem_object *obj)
 {
-       /* when we start tracking the pin count, then do something here */
+       struct msm_gem_object *msm_obj = to_msm_bo(obj);
+
+       msm_gem_lock(obj);
+       msm_obj->pin_count--;
+       GEM_WARN_ON(msm_obj->pin_count < 0);
+       update_inactive(msm_obj);
+       msm_gem_unlock(obj);
 }
 
 int msm_gem_mmap_obj(struct drm_gem_object *obj,
                        ret = -ENOMEM;
                        goto fail;
                }
+
+               update_inactive(msm_obj);
        }
 
        return msm_obj->vaddr;
 
 /* imported/exported objects are not purgeable: */
 static inline bool is_unpurgeable(struct msm_gem_object *msm_obj)
 {
-       return msm_obj->base.dma_buf && msm_obj->base.import_attach;
+       return msm_obj->base.import_attach || msm_obj->pin_count;
 }
 
 static inline bool is_purgeable(struct msm_gem_object *msm_obj)
 
 static inline bool is_unevictable(struct msm_gem_object *msm_obj)
 {
-       return is_unpurgeable(msm_obj) || msm_obj->pin_count || msm_obj->vaddr;
+       return is_unpurgeable(msm_obj) || msm_obj->vaddr;
 }
 
 static inline void mark_evictable(struct msm_gem_object *msm_obj)