diff options
| author | David S. Miller <davem@davemloft.net> | 2013-01-29 15:32:13 -0500 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-01-29 15:32:13 -0500 | 
| commit | f1e7b73acc26e8908af783bcd3a9900fd80688f5 (patch) | |
| tree | 9a9382fb7f12f1889020efb4bffa3f4a88589fc5 /drivers/gpu/drm/i915/i915_gem_execbuffer.c | |
| parent | 218774dc341f219bfcf940304a081b121a0e8099 (diff) | |
| parent | fc16e884a2320198b8cb7bc2fdcf6b4485e79709 (diff) | |
| download | olio-linux-3.10-f1e7b73acc26e8908af783bcd3a9900fd80688f5.tar.xz olio-linux-3.10-f1e7b73acc26e8908af783bcd3a9900fd80688f5.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Bring in the 'net' tree so that we can get some ipv4/ipv6 bug
fixes that some net-next work will build upon.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d6a994a0739..26d08bb5821 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -539,6 +539,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,  	total = 0;  	for (i = 0; i < count; i++) {  		struct drm_i915_gem_relocation_entry __user *user_relocs; +		u64 invalid_offset = (u64)-1; +		int j;  		user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; @@ -549,6 +551,25 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,  			goto err;  		} +		/* As we do not update the known relocation offsets after +		 * relocating (due to the complexities in lock handling), +		 * we need to mark them as invalid now so that we force the +		 * relocation processing next time. Just in case the target +		 * object is evicted and then rebound into its old +		 * presumed_offset before the next execbuffer - if that +		 * happened we would make the mistake of assuming that the +		 * relocations were valid. +		 */ +		for (j = 0; j < exec[i].relocation_count; j++) { +			if (copy_to_user(&user_relocs[j].presumed_offset, +					 &invalid_offset, +					 sizeof(invalid_offset))) { +				ret = -EFAULT; +				mutex_lock(&dev->struct_mutex); +				goto err; +			} +		} +  		reloc_offset[i] = total;  		total += exec[i].relocation_count;  	}  |