diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2020-11-13 13:31:21 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-11-13 13:33:37 +0000 |
commit | 9748a4a0f93d108955d374a866e60cb962da9b5d (patch) | |
tree | 5b486e8e63900740a25686a9f06f9a8d46bb1b36 /tests/i915/gem_mmap_gtt.c | |
parent | 6d774f081e55632ff4b2f61f56e6b3ff2198ce03 (diff) |
i915/gem_mmap_gtt: Mix a busy hang with GTT and userptr
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Diffstat (limited to 'tests/i915/gem_mmap_gtt.c')
-rw-r--r-- | tests/i915/gem_mmap_gtt.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/i915/gem_mmap_gtt.c b/tests/i915/gem_mmap_gtt.c index d2c45e52..0b1d5ce9 100644 --- a/tests/i915/gem_mmap_gtt.c +++ b/tests/i915/gem_mmap_gtt.c @@ -774,6 +774,7 @@ test_hang_busy(int i915) igt_debug("Refault and verify\n"); igt_assert_eq_u32(READ_ONCE(*tile), 0xdeadbeef); + gem_close(i915, handle); munmap(tile, 2 << 20); igt_assert_eq_u32(READ_ONCE(*x), spin->cmd_precondition); @@ -783,6 +784,56 @@ test_hang_busy(int i915) igt_disallow_hang(i915, hang); } +static void +test_hang_user(int i915) +{ + uint32_t *ptr, *mem, *x; + igt_spin_t *spin; + igt_hang_t hang; + uint32_t handle; + + hang = igt_allow_hang(i915, 0, 0); + igt_require(igt_params_set(i915, "reset", "1")); /* global */ + + spin = igt_spin_new(i915, .flags = IGT_SPIN_POLL_RUN | IGT_SPIN_FENCE_OUT | IGT_SPIN_NO_PREEMPTION); + igt_spin_busywait_until_started(spin); + igt_assert(spin->execbuf.buffer_count == 2); + + igt_assert(posix_memalign((void **)&mem, 4096, 2 << 20) == 0); + gem_userptr(i915, mem, 2 << 20, false, 0, &handle); + + spin->obj[0].handle = handle; + spin->obj[0].flags = EXEC_OBJECT_WRITE; + gem_execbuf(i915, &spin->execbuf); + + /* Fault in the busy objects */ + igt_debug("Faulting in busy batch\n"); + ptr = gem_mmap__gtt(i915, spin->handle, 4096, PROT_READ); + x = ptr + ((uintptr_t)spin->condition & 4095) / sizeof(*ptr); + igt_assert_eq_u32(READ_ONCE(*x), spin->cmd_precondition); + + igt_debug("Faulting in busy userptr\n"); + *mem = 0xdeadbeef; + + igt_debug("Resetting GPU\n"); + igt_assert(gem_bo_busy(i915, spin->handle)); + igt_assert(gem_bo_busy(i915, handle)); + igt_force_gpu_reset(i915); + + /* Check we reset the busy mmap */ + igt_debug("Cancelling busy userptr\n"); + munmap(mem, 2 << 20); + gem_close(i915, handle); + + gem_sync(i915, spin->handle); + igt_assert_eq(sync_fence_status(spin->out_fence), -5); + igt_assert_eq_u32(READ_ONCE(*x), spin->cmd_precondition); + munmap(ptr, 4096); + + igt_spin_free(i915, spin); + igt_disallow_hang(i915, hang); +} + static int min_tile_width(uint32_t devid, int tiling) { if (tiling < 0) { @@ -1239,6 +1290,8 @@ igt_main test_hang(fd); igt_subtest("hang-busy") test_hang_busy(fd); + igt_subtest("hang-user") + test_hang_user(fd); igt_subtest("basic-read-write") test_read_write(fd, READ_BEFORE_WRITE); igt_subtest("basic-write-read") |