On 13/04/18 07:14, Chris Wilson wrote:
Set up a unpreemptible spinner such that the only way we can inject a
high priority request onto the GPU is by resetting the spinner. The test
fails if we trigger hangcheck rather than the fast timeout mechanism.
Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
---
lib/i915/gem_context.c | 72 +++++++++++++++++++++++++++++++--------
lib/i915/gem_context.h | 3 ++
lib/igt_dummyload.c | 12 +++++--
lib/igt_dummyload.h | 3 ++
tests/gem_exec_schedule.c | 34 ++++++++++++++++++
5 files changed, 106 insertions(+), 18 deletions(-)
...
@@ -449,8 +457,6 @@ void igt_spin_batch_end(igt_spin_t *spin)
if (!spin)
return;
- igt_assert(*spin->batch == MI_ARB_CHK ||
- *spin->batch == MI_BATCH_BUFFER_END);
I am not sure why we needed this, but it seems safe to remove.
*spin->batch = MI_BATCH_BUFFER_END;
__sync_synchronize();
}
diff --git a/tests/gem_exec_schedule.c b/tests/gem_exec_schedule.c
index 6ff15b6ef..93254945b 100644
--- a/tests/gem_exec_schedule.c
+++ b/tests/gem_exec_schedule.c
@@ -656,6 +656,37 @@ static void preemptive_hang(int fd, unsigned ring)
gem_context_destroy(fd, ctx[HI]);
}
+static void preempt_timeout(int fd, unsigned ring)
+{
+ igt_spin_t *spin[3];
+ uint32_t ctx;
+
+ igt_require(__gem_context_set_preempt_timeout(fd, 0, 0));
+
+ ctx = gem_context_create(fd);
+ gem_context_set_priority(fd, ctx, MIN_PRIO);
+ spin[0] = __igt_spin_batch_new_hang(fd, ctx, ring);
+ spin[1] = __igt_spin_batch_new_hang(fd, ctx, ring);
+ gem_context_destroy(fd, ctx);
+
+ ctx = gem_context_create(fd);
+ gem_context_set_priority(fd, ctx, MAX_PRIO);
+ gem_context_set_preempt_timeout(fd, ctx, 1000 * 1000);
+ spin[2] = __igt_spin_batch_new(fd, ctx, ring, 0);
+ gem_context_destroy(fd, ctx);
+
+ igt_spin_batch_end(spin[2]);
+ gem_sync(fd, spin[2]->handle);
Does this guarantee that spin[1] did not overtake spin[2]?
Thanks,
Antonio
+
+ /* spin[0] is kicked, leaving spin[1] running */
+
+ igt_assert(gem_bo_busy(fd, spin[1]->handle));
+
+ igt_spin_batch_free(fd, spin[2]);
+ igt_spin_batch_free(fd, spin[1]);
+ igt_spin_batch_free(fd, spin[0]);
+}
+
static void deep(int fd, unsigned ring)
{
#define XS 8
@@ -1120,6 +1151,9 @@ igt_main
igt_subtest_f("preempt-self-%s", e->name)
preempt_self(fd, e->exec_id | e->flags);
+ igt_subtest_f("preempt-timeout-%s", e->name)
+ preempt_timeout(fd, e->exec_id | e->flags);
+
igt_subtest_f("preempt-other-%s", e->name)
preempt_other(fd, e->exec_id | e->flags, 0);
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx