diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2020-01-29 08:26:33 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-02-04 21:45:36 +0000 |
commit | c6560f44258943cd8bf104a970d4e9fd1cf9b678 (patch) | |
tree | 3faa7fe3847b82ca082115f13e270532ca0d0a8c /tests/i915/gem_ctx_exec.c | |
parent | 33cc93c8ba5daa0b7498f297a4f626844d895d06 (diff) |
i915/gem_ctx_exec: Cover all engines for nohangcheck
No engine can be missed when verifying that a rogue user cannot cause a
denial-of-service with nohangcheck.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'tests/i915/gem_ctx_exec.c')
-rw-r--r-- | tests/i915/gem_ctx_exec.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/tests/i915/gem_ctx_exec.c b/tests/i915/gem_ctx_exec.c index b1ae6577..aeb8d297 100644 --- a/tests/i915/gem_ctx_exec.c +++ b/tests/i915/gem_ctx_exec.c @@ -42,6 +42,7 @@ #include "igt_dummyload.h" #include "igt_sysfs.h" +#include "sw_sync.h" IGT_TEST_DESCRIPTION("Test context batch buffer execution."); @@ -203,9 +204,9 @@ static bool __enable_hangcheck(int dir, bool state) static void nohangcheck_hostile(int i915) { - int64_t timeout = NSEC_PER_SEC / 2; - igt_spin_t *spin; + const struct intel_execution_engine2 *e; igt_hang_t hang; + int fence = -1; uint32_t ctx; int err = 0; int dir; @@ -215,6 +216,8 @@ static void nohangcheck_hostile(int i915) * we forcibly terminate that context. */ + i915 = gem_reopen_driver(i915); + dir = igt_sysfs_open_parameters(i915); igt_require(dir != -1); @@ -223,16 +226,35 @@ static void nohangcheck_hostile(int i915) igt_require(__enable_hangcheck(dir, false)); - spin = igt_spin_new(i915, ctx, .flags = IGT_SPIN_NO_PREEMPTION); + __for_each_physical_engine(i915, e) { + igt_spin_t *spin; + + spin = igt_spin_new(i915, ctx, + .engine = e->flags, + .flags = (IGT_SPIN_NO_PREEMPTION | + IGT_SPIN_FENCE_OUT)); + + igt_assert(spin->out_fence != -1); + if (fence < 0) { + fence = spin->out_fence; + spin->out_fence = -1; + } else { + int new; + + new = sync_fence_merge(fence, spin->out_fence); + close(fence); + + fence = new; + } + } gem_context_destroy(i915, ctx); + igt_assert(fence != -1); - if (gem_wait(i915, spin->handle, &timeout)) { + if (sync_fence_wait(fence, MSEC_PER_SEC / 2)) { igt_debugfs_dump(i915, "i915_engine_info"); err = -ETIME; } - igt_spin_free(i915, spin); - __enable_hangcheck(dir, true); gem_quiescent_gpu(i915); igt_disallow_hang(i915, hang); @@ -240,7 +262,11 @@ static void nohangcheck_hostile(int i915) igt_assert_f(err == 0, "Hostile unpreemptable context was not cancelled immediately upon closure\n"); + igt_assert_eq(sync_fence_status(fence), -EIO); + close(fence); + close(dir); + close(i915); } igt_main |