diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-03-29 17:14:10 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-09-03 13:52:05 +0100 |
commit | 4097a503e35ff77f01eb2a254e456cbf2390cee1 (patch) | |
tree | 43d7e52fa65f5ac10588ce768fc57f5cd7673cbf | |
parent | 90a97fc98645313865ba8c80e6bd99486f170bb4 (diff) |
igt/gem_wait: Exercise waiting on only write hazards
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | tests/i915/gem_wait.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/i915/gem_wait.c b/tests/i915/gem_wait.c index 7b2b1c2b..bd427b3a 100644 --- a/tests/i915/gem_wait.c +++ b/tests/i915/gem_wait.c @@ -31,6 +31,8 @@ #include "igt.h" #include "igt_vgem.h" +#define LOCAL_WAIT_READ_ONLY 0x1 + static int __gem_wait(int fd, struct drm_i915_gem_wait *w) { int err; @@ -146,6 +148,48 @@ static void basic(int fd, unsigned engine, unsigned flags) igt_spin_free(fd, spin); } +static bool wait_has_readonly(int fd) +{ + struct drm_i915_gem_wait arg = { .flags = LOCAL_WAIT_READ_ONLY }; + int err = 0; + if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_WAIT, &arg)) + err = -errno; + errno = 0; + return err == -ENOENT; +} + +static void readonly(int fd) +{ + uint32_t scratch = gem_create(fd, 4096); + igt_spin_t *spin = igt_spin_batch_new(fd, 0, 0, scratch); + struct drm_i915_gem_wait wait = { spin->handle }; + + /* Test read-only batch */ + wait.flags = LOCAL_WAIT_READ_ONLY; + igt_assert_eq(__gem_wait(fd, &wait), 0); + wait.timeout_ns = -1; + igt_assert_eq(__gem_wait(fd, &wait), 0); + + wait.flags = 0; + wait.timeout_ns = 0; + igt_assert_eq(__gem_wait(fd, &wait), -ETIME); + + /* Test write hazard to scratch */ + wait.bo_handle = scratch; + igt_assert_eq(__gem_wait(fd, &wait), -ETIME); + + wait.flags = LOCAL_WAIT_READ_ONLY; + igt_assert_eq(__gem_wait(fd, &wait), -ETIME); + + igt_spin_batch_free(fd, spin); + + wait.timeout_ns = -1; + wait.flags = LOCAL_WAIT_READ_ONLY; + igt_assert_eq(__gem_wait(fd, &wait), 0); + + gem_close(fd, scratch); +} + static void test_all_engines(const char *name, int i915, unsigned int test) { const struct intel_execution_engine2 *e; @@ -210,6 +254,15 @@ igt_main } igt_subtest_group { + igt_fixture { + igt_require(wait_has_readonly(fd)); + } + + igt_subtest("read-only") + readonly(fd); + } + + igt_subtest_group { static const struct { const char *name; unsigned int flags; |