aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-10-20 15:59:57 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-10-20 16:06:34 -0400
commitb5dc608c98d929abbf2fe932ed07b3c868d83342 (patch)
tree856fe6ba9133fe9b3019ff578fb808aa79027a9f
parent69dc4987cbe5fe70ae1c2a08906d431d53cdd242 (diff)
drm/i915: Copy the updated reloc->presumed_offset back to the user
If the userspace driver is using a constant relocation array with a static buffer, they will pass the same relocation array back to the kernel. So we *do* need to update the presumed offset value in those relocations to reflect the current object so that they remain correct with future batchbuffers and we avoid the necessity of having to suspend execution and perform redundant relocations. Fixes the regression introduced by 12f889c for applications using absolute addressing on trees of buffer (i.e. the current consumers of libdrm_intel.so). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=30996 Reported-by: Wang, Jinjin <jinjin.wang@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 6e85496f9164..5041ebe3fdf9 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3399,6 +3399,15 @@ i915_gem_execbuffer_relocate(struct drm_i915_gem_object *obj,
3399 iowrite32(reloc.delta, reloc_entry); 3399 iowrite32(reloc.delta, reloc_entry);
3400 io_mapping_unmap_atomic(reloc_page, KM_USER0); 3400 io_mapping_unmap_atomic(reloc_page, KM_USER0);
3401 } 3401 }
3402
3403 /* and update the user's relocation entry */
3404 reloc.presumed_offset = target_offset;
3405 if (__copy_to_user_inatomic(&user_relocs[i].presumed_offset,
3406 &reloc.presumed_offset,
3407 sizeof(reloc.presumed_offset))) {
3408 ret = -EFAULT;
3409 break;
3410 }
3402 } 3411 }
3403 3412
3404 drm_gem_object_unreference(target_obj); 3413 drm_gem_object_unreference(target_obj);
@@ -3560,6 +3569,10 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
3560 if (!access_ok(VERIFY_READ, ptr, length)) 3569 if (!access_ok(VERIFY_READ, ptr, length))
3561 return -EFAULT; 3570 return -EFAULT;
3562 3571
3572 /* we may also need to update the presumed offsets */
3573 if (!access_ok(VERIFY_WRITE, ptr, length))
3574 return -EFAULT;
3575
3563 if (fault_in_pages_readable(ptr, length)) 3576 if (fault_in_pages_readable(ptr, length))
3564 return -EFAULT; 3577 return -EFAULT;
3565 } 3578 }