Commit 10f76165 authored by Rob Clark's avatar Rob Clark

drm/msm: Do not unpin/evict exported dma-buf's

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: 63f17ef8 drm/msm: Support evicting GEM objects to swap
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20210426235326.1230125-1-robdclark@gmail.comSigned-off-by: default avatarRob Clark <robdclark@chromium.org>
parent a29c8c02
...@@ -190,13 +190,25 @@ struct page **msm_gem_get_pages(struct drm_gem_object *obj) ...@@ -190,13 +190,25 @@ struct page **msm_gem_get_pages(struct drm_gem_object *obj)
} }
p = get_pages(obj); p = get_pages(obj);
if (!IS_ERR(p)) {
msm_obj->pin_count++;
update_inactive(msm_obj);
}
msm_gem_unlock(obj); msm_gem_unlock(obj);
return p; return p;
} }
void msm_gem_put_pages(struct drm_gem_object *obj) 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, int msm_gem_mmap_obj(struct drm_gem_object *obj,
...@@ -646,6 +658,8 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv) ...@@ -646,6 +658,8 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
ret = -ENOMEM; ret = -ENOMEM;
goto fail; goto fail;
} }
update_inactive(msm_obj);
} }
return msm_obj->vaddr; return msm_obj->vaddr;
......
...@@ -221,7 +221,7 @@ static inline bool is_active(struct msm_gem_object *msm_obj) ...@@ -221,7 +221,7 @@ static inline bool is_active(struct msm_gem_object *msm_obj)
/* imported/exported objects are not purgeable: */ /* imported/exported objects are not purgeable: */
static inline bool is_unpurgeable(struct msm_gem_object *msm_obj) 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_purgeable(struct msm_gem_object *msm_obj)
...@@ -271,7 +271,7 @@ static inline void mark_unpurgeable(struct msm_gem_object *msm_obj) ...@@ -271,7 +271,7 @@ static inline void mark_unpurgeable(struct msm_gem_object *msm_obj)
static inline bool is_unevictable(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) static inline void mark_evictable(struct msm_gem_object *msm_obj)
......
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