diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 054b2e54cdaf..e9503f6d1100 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -560,9 +560,6 @@ static int eb_reserve_vma(const struct i915_execbuffer *eb,  		eb->args->flags |= __EXEC_HAS_RELOC;  	} -	entry->flags |= __EXEC_OBJECT_HAS_PIN; -	GEM_BUG_ON(eb_vma_misplaced(entry, vma)); -  	if (unlikely(entry->flags & EXEC_OBJECT_NEEDS_FENCE)) {  		err = i915_vma_get_fence(vma);  		if (unlikely(err)) { @@ -574,6 +571,9 @@ static int eb_reserve_vma(const struct i915_execbuffer *eb,  			entry->flags |= __EXEC_OBJECT_HAS_FENCE;  	} +	entry->flags |= __EXEC_OBJECT_HAS_PIN; +	GEM_BUG_ON(eb_vma_misplaced(entry, vma)); +  	return 0;  } @@ -1458,7 +1458,7 @@ static int eb_relocate_vma(struct i915_execbuffer *eb, struct i915_vma *vma)  	 * to read. However, if the array is not writable the user loses  	 * the updated relocation values.  	 */ -	if (unlikely(!access_ok(VERIFY_READ, urelocs, remain*sizeof(urelocs)))) +	if (unlikely(!access_ok(VERIFY_READ, urelocs, remain*sizeof(*urelocs))))  		return -EFAULT;  	do { @@ -1775,7 +1775,7 @@ out:  		}  	} -	return err ?: have_copy; +	return err;  }  static int eb_relocate(struct i915_execbuffer *eb) @@ -1825,7 +1825,7 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)  	int err;  	for (i = 0; i < count; i++) { -		const struct drm_i915_gem_exec_object2 *entry = &eb->exec[i]; +		struct drm_i915_gem_exec_object2 *entry = &eb->exec[i];  		struct i915_vma *vma = exec_to_vma(entry);  		struct drm_i915_gem_object *obj = vma->obj; @@ -1841,12 +1841,14 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)  			eb->request->capture_list = capture;  		} +		if (unlikely(obj->cache_dirty && !obj->cache_coherent)) { +			if (i915_gem_clflush_object(obj, 0)) +				entry->flags &= ~EXEC_OBJECT_ASYNC; +		} +  		if (entry->flags & EXEC_OBJECT_ASYNC)  			goto skip_flushes; -		if (unlikely(obj->cache_dirty && !obj->cache_coherent)) -			i915_gem_clflush_object(obj, 0); -  		err = i915_gem_request_await_object  			(eb->request, obj, entry->flags & EXEC_OBJECT_WRITE);  		if (err) @@ -2209,7 +2211,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,  		goto err_unlock;  	err = eb_relocate(&eb); -	if (err) +	if (err) {  		/*  		 * If the user expects the execobject.offset and  		 * reloc.presumed_offset to be an exact match, @@ -2218,8 +2220,8 @@ i915_gem_do_execbuffer(struct drm_device *dev,  		 * relocation.  		 */  		args->flags &= ~__EXEC_HAS_RELOC; -	if (err < 0)  		goto err_vma; +	}  	if (unlikely(eb.batch->exec_entry->flags & EXEC_OBJECT_WRITE)) {  		DRM_DEBUG("Attempting to use self-modifying batch buffer\n");  | 
