summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/msm_gem_shrinker.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-10-23 09:51:07 -0700
committerRob Clark <robdclark@chromium.org>2020-11-04 16:00:55 -0800
commit599089c6af68300207ee1823230d31eda1f15959 (patch)
treed23eefdfc8d03d5430b2b8b9d3c4bdeeae5c7f40 /drivers/gpu/drm/msm/msm_gem_shrinker.c
parente4b87d227f9e826c2b2db6b662906550a70a089a (diff)
drm/msm/gem: Move locking in shrinker path
Move grabbing the bo lock into shrinker, with a msm_gem_trylock() to skip over bo's that are already locked. This gets rid of the nested lock classes. Signed-off-by: Rob Clark <robdclark@chromium.org> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Signed-off-by: Rob Clark <robdclark@chromium.org>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_shrinker.c')
-rw-r--r--drivers/gpu/drm/msm/msm_gem_shrinker.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/msm_gem_shrinker.c
index 482576d7a39a..2dc0ffa925b4 100644
--- a/drivers/gpu/drm/msm/msm_gem_shrinker.c
+++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c
@@ -52,8 +52,11 @@ msm_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
return 0;
list_for_each_entry(msm_obj, &priv->inactive_list, mm_list) {
+ if (!msm_gem_trylock(&msm_obj->base))
+ continue;
if (is_purgeable(msm_obj))
count += msm_obj->base.size >> PAGE_SHIFT;
+ msm_gem_unlock(&msm_obj->base);
}
if (unlock)
@@ -78,10 +81,13 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
list_for_each_entry(msm_obj, &priv->inactive_list, mm_list) {
if (freed >= sc->nr_to_scan)
break;
+ if (!msm_gem_trylock(&msm_obj->base))
+ continue;
if (is_purgeable(msm_obj)) {
- msm_gem_purge(&msm_obj->base, OBJ_LOCK_SHRINKER);
+ msm_gem_purge(&msm_obj->base);
freed += msm_obj->base.size >> PAGE_SHIFT;
}
+ msm_gem_unlock(&msm_obj->base);
}
if (unlock)
@@ -107,15 +113,20 @@ msm_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr)
return NOTIFY_DONE;
list_for_each_entry(msm_obj, &priv->inactive_list, mm_list) {
+ if (!msm_gem_trylock(&msm_obj->base))
+ continue;
if (is_vunmapable(msm_obj)) {
- msm_gem_vunmap(&msm_obj->base, OBJ_LOCK_SHRINKER);
- /* since we don't know any better, lets bail after a few
- * and if necessary the shrinker will be invoked again.
- * Seems better than unmapping *everything*
- */
- if (++unmapped >= 15)
- break;
+ msm_gem_vunmap(&msm_obj->base);
+ unmapped++;
}
+ msm_gem_unlock(&msm_obj->base);
+
+ /* since we don't know any better, lets bail after a few
+ * and if necessary the shrinker will be invoked again.
+ * Seems better than unmapping *everything*
+ */
+ if (++unmapped >= 15)
+ break;
}
if (unlock)