diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_vma.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_vma.c | 37 | 
1 files changed, 20 insertions, 17 deletions
| diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c index 74dc3ba59ce5..08699fa069aa 100644 --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c @@ -641,7 +641,6 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)  	u64 start, end;  	int ret; -	GEM_BUG_ON(i915_vma_is_closed(vma));  	GEM_BUG_ON(i915_vma_is_bound(vma, I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND));  	GEM_BUG_ON(drm_mm_node_allocated(&vma->node)); @@ -919,6 +918,11 @@ int i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)  	if (err)  		goto err_fence; +	if (unlikely(i915_vma_is_closed(vma))) { +		err = -ENOENT; +		goto err_unlock; +	} +  	bound = atomic_read(&vma->flags);  	if (unlikely(bound & I915_VMA_ERROR)) {  		err = -ENOMEM; @@ -1093,6 +1097,7 @@ void i915_vma_release(struct kref *ref)  void i915_vma_parked(struct intel_gt *gt)  {  	struct i915_vma *vma, *next; +	LIST_HEAD(closed);  	spin_lock_irq(>->closed_lock);  	list_for_each_entry_safe(vma, next, >->closed_vma, closed_link) { @@ -1104,28 +1109,26 @@ void i915_vma_parked(struct intel_gt *gt)  		if (!kref_get_unless_zero(&obj->base.refcount))  			continue; -		if (i915_vm_tryopen(vm)) { -			list_del_init(&vma->closed_link); -		} else { +		if (!i915_vm_tryopen(vm)) {  			i915_gem_object_put(obj); -			obj = NULL; +			continue;  		} -		spin_unlock_irq(>->closed_lock); +		list_move(&vma->closed_link, &closed); +	} +	spin_unlock_irq(>->closed_lock); + +	/* As the GT is held idle, no vma can be reopened as we destroy them */ +	list_for_each_entry_safe(vma, next, &closed, closed_link) { +		struct drm_i915_gem_object *obj = vma->obj; +		struct i915_address_space *vm = vma->vm; -		if (obj) { -			__i915_vma_put(vma); -			i915_gem_object_put(obj); -		} +		INIT_LIST_HEAD(&vma->closed_link); +		__i915_vma_put(vma); +		i915_gem_object_put(obj);  		i915_vm_close(vm); - -		/* Restart after dropping lock */ -		spin_lock_irq(>->closed_lock); -		next = list_first_entry(>->closed_vma, -					typeof(*next), closed_link);  	} -	spin_unlock_irq(>->closed_lock);  }  static void __i915_vma_iounmap(struct i915_vma *vma) @@ -1169,7 +1172,7 @@ int __i915_vma_move_to_active(struct i915_vma *vma, struct i915_request *rq)  	GEM_BUG_ON(!i915_vma_is_pinned(vma));  	/* Wait for the vma to be bound before we start! */ -	err = i915_request_await_active(rq, &vma->active); +	err = i915_request_await_active(rq, &vma->active, 0);  	if (err)  		return err; |