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

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
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -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);
+1 −0
Original line number Original line Diff line number Diff line
@@ -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,
+6 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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;