diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_evict.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_evict.c | 18 | 
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index b5e9e669f50f..bd08814b015c 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -33,14 +33,17 @@  #include "intel_drv.h"  #include "i915_trace.h" -static bool -gpu_is_idle(struct drm_i915_private *dev_priv) +static bool ggtt_is_idle(struct drm_i915_private *dev_priv)  { +	struct i915_ggtt *ggtt = &dev_priv->ggtt;  	struct intel_engine_cs *engine;  	enum intel_engine_id id;  	for_each_engine(engine, dev_priv, id) { -		if (intel_engine_is_active(engine)) +		struct intel_timeline *tl; + +		tl = &ggtt->base.timeline.engine[engine->id]; +		if (i915_gem_active_isset(&tl->last_request))  			return false;  	} @@ -56,7 +59,7 @@ mark_free(struct i915_vma *vma, unsigned int flags, struct list_head *unwind)  	if (WARN_ON(!list_empty(&vma->exec_list)))  		return false; -	if (flags & PIN_NONFAULT && vma->obj->fault_mappable) +	if (flags & PIN_NONFAULT && !list_empty(&vma->obj->userfault_link))  		return false;  	list_add(&vma->exec_list, unwind); @@ -103,6 +106,7 @@ i915_gem_evict_something(struct i915_address_space *vm,  	struct i915_vma *vma, *next;  	int ret; +	lockdep_assert_held(&vm->dev->struct_mutex);  	trace_i915_gem_evict(vm, min_size, alignment, flags);  	/* @@ -153,7 +157,7 @@ search_again:  	if (!i915_is_ggtt(vm) || flags & PIN_NONBLOCK)  		return -ENOSPC; -	if (gpu_is_idle(dev_priv)) { +	if (ggtt_is_idle(dev_priv)) {  		/* If we still have pending pageflip completions, drop  		 * back to userspace to give our workqueues time to  		 * acquire our locks and unpin the old scanouts. @@ -213,6 +217,8 @@ i915_gem_evict_for_vma(struct i915_vma *target)  {  	struct drm_mm_node *node, *next; +	lockdep_assert_held(&target->vm->dev->struct_mutex); +  	list_for_each_entry_safe(node, next,  			&target->vm->mm.head_node.node_list,  			node_list) { @@ -266,7 +272,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)  	struct i915_vma *vma, *next;  	int ret; -	WARN_ON(!mutex_is_locked(&vm->dev->struct_mutex)); +	lockdep_assert_held(&vm->dev->struct_mutex);  	trace_i915_gem_evict_vm(vm);  	if (do_idle) {  | 

