drm/msm/gem: Check for active in shrinker path
authorRob Clark <robdclark@chromium.org>
Tue, 2 Aug 2022 15:51:37 +0000 (08:51 -0700)
committerRob Clark <robdclark@chromium.org>
Sat, 27 Aug 2022 16:32:44 +0000 (09:32 -0700)
Currently in our shrinker path we shouldn't be encountering anything
that is active, but this will change in subsequent patches.  So check
if there are unsignaled fences.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/496117/
Link: https://lore.kernel.org/r/20220802155152.1727594-5-robdclark@gmail.com
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_shrinker.c

index 8ddbd2e..b55d252 100644 (file)
@@ -870,6 +870,16 @@ static void update_inactive(struct msm_gem_object *msm_obj)
        mutex_unlock(&priv->mm_lock);
 }
 
+bool msm_gem_active(struct drm_gem_object *obj)
+{
+       GEM_WARN_ON(!msm_gem_is_locked(obj));
+
+       if (to_msm_bo(obj)->pin_count)
+               return true;
+
+       return !dma_resv_test_signaled(obj->resv, dma_resv_usage_rw(true));
+}
+
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
 {
        bool write = !!(op & MSM_PREP_WRITE);
index 432032a..0ab0dc4 100644 (file)
@@ -173,6 +173,7 @@ void msm_gem_put_vaddr(struct drm_gem_object *obj);
 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv);
 void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu);
 void msm_gem_active_put(struct drm_gem_object *obj);
+bool msm_gem_active(struct drm_gem_object *obj);
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout);
 int msm_gem_cpu_fini(struct drm_gem_object *obj);
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
index 0317055..0ab0587 100644 (file)
@@ -43,6 +43,9 @@ purge(struct msm_gem_object *msm_obj)
        if (!is_purgeable(msm_obj))
                return false;
 
+       if (msm_gem_active(&msm_obj->base))
+               return false;
+
        /*
         * This will move the obj out of still_in_list to
         * the purged list
@@ -58,6 +61,9 @@ evict(struct msm_gem_object *msm_obj)
        if (is_unevictable(msm_obj))
                return false;
 
+       if (msm_gem_active(&msm_obj->base))
+               return false;
+
        msm_gem_evict(&msm_obj->base);
 
        return true;