summaryrefslogtreecommitdiff
path: root/lib/igt_gt.c
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@intel.com>2016-06-08 15:50:50 +0300
committerMika Kuoppala <mika.kuoppala@intel.com>2016-06-09 15:14:16 +0300
commitb5ef40e6e580c2f2f342f2334d694d4c84e6c9c4 (patch)
treeaf9c17bcb5aa219dbbfddfcfc625bcd1df1ac68a /lib/igt_gt.c
parentede48704bac49d3175731b2a041135a510fe98b9 (diff)
lib/gt: Omit illegal instruction on hang injection with gen 8+
0xffffffff as an illegal command confuses the command execution on gen9 so that the next BB start will get ignored, causing a runaway head past the bb end. This delays the hang detection substantially as hangcheck then observes only a non progressing seqno. Omit the bad instruction on gen8+ and rely on the chained batch loop to cause a deterministic hang. Make the chained bb start to jump straight into bb start, omitting the MI_NOOP or the bad instruction on subsequent passes. This makes the acthd sampling to hit more reliably to the same value, as the loop is smaller, making the head appear to be 'more stuck'. References: https://bugs.freedesktop.org/show_bug.cgi?id=92715 Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
Diffstat (limited to 'lib/igt_gt.c')
-rw-r--r--lib/igt_gt.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/igt_gt.c b/lib/igt_gt.c
index 95d74a0c..a3d6a731 100644
--- a/lib/igt_gt.c
+++ b/lib/igt_gt.c
@@ -181,16 +181,31 @@ igt_hang_ring_t igt_hang_ctx(int fd,
exec.relocs_ptr = (uintptr_t)&reloc;
memset(b, 0xc5, sizeof(b));
- b[0] = 0xffffffff;
+
+ /*
+ * We emit invalid command to provoke a gpu hang.
+ * If that doesn't work, we do bb start loop.
+ * Note that the bb start aligment is illegal due this.
+ * But hey, we are here to hang the gpu so whatever works.
+ * We skip 0xfffffff on gen9 as it confuses hw in an such a way that
+ * it will skip over the bb start, causing runaway head and
+ * thus much slower hang detection.
+ */
len = 2;
- if (intel_gen(intel_get_drm_devid(fd)) >= 8)
+ if (intel_gen(intel_get_drm_devid(fd)) >= 8) {
+ b[0] = MI_NOOP;
len++;
+ } else {
+ b[0] = 0xffffffff;
+ }
+
b[1] = MI_BATCH_BUFFER_START | (len - 2);
b[1+len] = MI_BATCH_BUFFER_END;
b[2+len] = MI_NOOP;
gem_write(fd, exec.handle, 0, b, sizeof(b));
reloc.offset = 8;
+ reloc.delta = 4;
reloc.target_handle = exec.handle;
reloc.read_domains = I915_GEM_DOMAIN_COMMAND;