Commit 01780d02 authored by Rob Clark's avatar Rob Clark

drm/msm/gem: Check for active in shrinker path

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: default avatarRob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/496117/
Link: https://lore.kernel.org/r/20220802155152.1727594-5-robdclark@gmail.com
parent 05ba44b3
...@@ -870,6 +870,16 @@ static void update_inactive(struct msm_gem_object *msm_obj) ...@@ -870,6 +870,16 @@ static void update_inactive(struct msm_gem_object *msm_obj)
mutex_unlock(&priv->mm_lock); 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) int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
{ {
bool write = !!(op & MSM_PREP_WRITE); bool write = !!(op & MSM_PREP_WRITE);
......
...@@ -173,6 +173,7 @@ void msm_gem_put_vaddr(struct drm_gem_object *obj); ...@@ -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); 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_get(struct drm_gem_object *obj, struct msm_gpu *gpu);
void msm_gem_active_put(struct drm_gem_object *obj); 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_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_cpu_fini(struct drm_gem_object *obj);
int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file, int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
......
...@@ -43,6 +43,9 @@ purge(struct msm_gem_object *msm_obj) ...@@ -43,6 +43,9 @@ purge(struct msm_gem_object *msm_obj)
if (!is_purgeable(msm_obj)) if (!is_purgeable(msm_obj))
return false; return false;
if (msm_gem_active(&msm_obj->base))
return false;
/* /*
* This will move the obj out of still_in_list to * This will move the obj out of still_in_list to
* the purged list * the purged list
...@@ -58,6 +61,9 @@ evict(struct msm_gem_object *msm_obj) ...@@ -58,6 +61,9 @@ evict(struct msm_gem_object *msm_obj)
if (is_unevictable(msm_obj)) if (is_unevictable(msm_obj))
return false; return false;
if (msm_gem_active(&msm_obj->base))
return false;
msm_gem_evict(&msm_obj->base); msm_gem_evict(&msm_obj->base);
return true; return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment