[PATCH 2/2] intel: Use I915_EXEC_NO_RELOC when available

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The I915_EXEC_NO_RELOC flag lets us tell the kernel that the offset we
provide in the validate list entry is what we've used in all relocations
to the bo in question.  If the bo hasn't moved, the kernel can skip
relocations completely.

Signed-off-by: Kristian Høgsberg <krh@xxxxxxxxxxxxx>
---
 intel/intel_bufmgr_gem.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index 8a51cea..a657a4d 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -131,6 +131,7 @@ typedef struct _drm_intel_bufmgr_gem {
 	unsigned int no_exec : 1;
 	unsigned int has_vebox : 1;
 	unsigned int has_handle_lut : 1;
+	unsigned int has_no_reloc : 1;
 	bool fenced_relocs;
 
 	char *aub_filename;
@@ -504,7 +505,15 @@ drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence)
 	bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count;
 	bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs;
 	bufmgr_gem->exec2_objects[index].alignment = 0;
-	bufmgr_gem->exec2_objects[index].offset = 0;
+
+	/* If the kernel supports I915_EXEC_NO_RELOC, it will compare
+	 * offset in struct drm_i915_gem_exec_object2 against the bos
+	 * current offset and if all bos haven't moved it will skip
+	 * relocation processing alltogether.  If I915_EXEC_NO_RELOC
+	 * is not supported, the kernel ignores the incoming value of
+	 * offset so we can set it either way.
+	 */
+	bufmgr_gem->exec2_objects[index].offset = bo->offset64;
 	bufmgr_gem->exec_bos[index] = bo;
 	bufmgr_gem->exec2_objects[index].flags = 0;
 	bufmgr_gem->exec2_objects[index].rsvd1 = 0;
@@ -2471,6 +2480,8 @@ do_exec2(drm_intel_bo *bo, int used, drm_intel_context *ctx,
 
 	if (bufmgr_gem->has_handle_lut)
 		execbuf.flags |= I915_EXEC_HANDLE_LUT;
+	if (bufmgr_gem->has_no_reloc)
+		execbuf.flags |= I915_EXEC_NO_RELOC;
 
 	ret = drmIoctl(bufmgr_gem->fd,
 		       DRM_IOCTL_I915_GEM_EXECBUFFER2,
@@ -3598,6 +3609,10 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)
 	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
 	bufmgr_gem->has_handle_lut = ret == 0;
 
+	gp.param = I915_PARAM_HAS_EXEC_NO_RELOC;
+	ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
+	bufmgr_gem->has_no_reloc = ret == 0;
+
 	/* Let's go with one relocation per every 2 dwords (but round down a bit
 	 * since a power of two will mean an extra page allocation for the reloc
 	 * buffer).
-- 
2.2.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux