summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/msm_gem.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-10-23 19:51:07 +0300
committerRob Clark <robdclark@chromium.org>2020-11-05 03:00:55 +0300
commit599089c6af68300207ee1823230d31eda1f15959 (patch)
treed23eefdfc8d03d5430b2b8b9d3c4bdeeae5c7f40 /drivers/gpu/drm/msm/msm_gem.c
parente4b87d227f9e826c2b2db6b662906550a70a089a (diff)
downloadlinux-599089c6af68300207ee1823230d31eda1f15959.tar.xz
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.c')
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c24
1 files changed, 5 insertions, 19 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 2daa696ec41d..59d7c1a7d502 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -18,8 +18,6 @@
#include "msm_gpu.h"
#include "msm_mmu.h"
-static void msm_gem_vunmap_locked(struct drm_gem_object *obj);
-
static dma_addr_t physaddr(struct drm_gem_object *obj)
{
@@ -692,20 +690,19 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
return (madv != __MSM_MADV_PURGED);
}
-void msm_gem_purge(struct drm_gem_object *obj, enum msm_gem_lock subclass)
+void msm_gem_purge(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
struct msm_gem_object *msm_obj = to_msm_bo(obj);
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+ WARN_ON(!msm_gem_is_locked(obj));
WARN_ON(!is_purgeable(msm_obj));
WARN_ON(obj->import_attach);
- mutex_lock_nested(&msm_obj->lock, subclass);
-
put_iova(obj);
- msm_gem_vunmap_locked(obj);
+ msm_gem_vunmap(obj);
put_pages(obj);
@@ -723,11 +720,9 @@ void msm_gem_purge(struct drm_gem_object *obj, enum msm_gem_lock subclass)
invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
0, (loff_t)-1);
-
- msm_gem_unlock(obj);
}
-static void msm_gem_vunmap_locked(struct drm_gem_object *obj)
+void msm_gem_vunmap(struct drm_gem_object *obj)
{
struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@ -740,15 +735,6 @@ static void msm_gem_vunmap_locked(struct drm_gem_object *obj)
msm_obj->vaddr = NULL;
}
-void msm_gem_vunmap(struct drm_gem_object *obj, enum msm_gem_lock subclass)
-{
- struct msm_gem_object *msm_obj = to_msm_bo(obj);
-
- mutex_lock_nested(&msm_obj->lock, subclass);
- msm_gem_vunmap_locked(obj);
- msm_gem_unlock(obj);
-}
-
/* must be called before _move_to_active().. */
int msm_gem_sync_object(struct drm_gem_object *obj,
struct msm_fence_context *fctx, bool exclusive)
@@ -985,7 +971,7 @@ static void free_object(struct msm_gem_object *msm_obj)
drm_prime_gem_destroy(obj, msm_obj->sgt);
} else {
- msm_gem_vunmap_locked(obj);
+ msm_gem_vunmap(obj);
put_pages(obj);
}