summaryrefslogtreecommitdiff
path: root/tests/gem_eio.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-05-12 09:48:27 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2018-05-14 14:42:24 +0100
commitb871b10f2a6250d6dbe31665b267820fee829c84 (patch)
tree0bebc4dcef9d38b76e0b19054968d4a5aec7bcbb /tests/gem_eio.c
parent395c23946b44b071cc376f488a3205bedb02b382 (diff)
igt/gem_eio: Exercise banning
If we trigger "too many" resets, the context and even the file, will be banned and subsequent execbufs should fail with -EIO. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Katarzyna Dec <katarzyna.dec@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'tests/gem_eio.c')
-rw-r--r--tests/gem_eio.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/gem_eio.c b/tests/gem_eio.c
index 6455c6ac..4720b47b 100644
--- a/tests/gem_eio.c
+++ b/tests/gem_eio.c
@@ -250,6 +250,52 @@ static int __check_wait(int fd, uint32_t bo, unsigned int wait)
return ret;
}
+static void __test_banned(int fd)
+{
+ struct drm_i915_gem_exec_object2 obj = {
+ .handle = gem_create(fd, 4096),
+ };
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&obj),
+ .buffer_count = 1,
+ };
+ const uint32_t bbe = MI_BATCH_BUFFER_END;
+ unsigned long count = 0;
+
+ gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
+
+ gem_quiescent_gpu(fd);
+ igt_require(i915_reset_control(true));
+
+ igt_until_timeout(5) {
+ igt_spin_t *hang;
+
+ if (__gem_execbuf(fd, &execbuf) == -EIO) {
+ igt_info("Banned after causing %lu hangs\n", count);
+ igt_assert(count > 1);
+ return;
+ }
+
+ /* Trigger a reset, making sure we are detected as guilty */
+ hang = spin_sync(fd, 0, 0);
+ trigger_reset(fd);
+ igt_spin_batch_free(fd, hang);
+
+ count++;
+ }
+
+ igt_assert_f(false,
+ "Ran for 5s, %lu hangs without being banned\n",
+ count);
+}
+
+static void test_banned(int fd)
+{
+ fd = gem_reopen_driver(fd);
+ __test_banned(fd);
+ close(fd);
+}
+
#define TEST_WEDGE (1)
static void test_wait(int fd, unsigned int flags, unsigned int wait)
@@ -693,6 +739,9 @@ igt_main
igt_subtest("execbuf")
test_execbuf(fd);
+ igt_subtest("banned")
+ test_banned(fd);
+
igt_subtest("suspend")
test_suspend(fd, SUSPEND_STATE_MEM);