diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2020-05-18 09:47:02 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2020-05-18 17:29:23 +0100 |
commit | 66ab5e42811fee3dea8c21ab29e70e323a0650de (patch) | |
tree | f510adca109d2c25a21c6fefcb7fc8b7e316d1c3 /tests | |
parent | 32498f12ab0496ad18d7055d42be02a15c978b3b (diff) |
i915/gem_exec_schedule: Check we can reprioritise ctx->engines[]
A quick test to ensure that ctx->engines[] are independent and can be
reprioritised and shuffled amongst themselves.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/i915/gem_exec_schedule.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/i915/gem_exec_schedule.c b/tests/i915/gem_exec_schedule.c index 8a76b733..62e387cc 100644 --- a/tests/i915/gem_exec_schedule.c +++ b/tests/i915/gem_exec_schedule.c @@ -1370,6 +1370,68 @@ static void preempt_queue(int fd, unsigned ring, unsigned int flags) } } +static bool has_context_engines(int i915) +{ + struct drm_i915_gem_context_param param = { + .ctx_id = 0, + .param = I915_CONTEXT_PARAM_ENGINES, + }; + return __gem_context_set_param(i915, ¶m) == 0; +} + +static void preempt_engines(int i915, + const struct intel_execution_engine2 *e, + unsigned int flags) +{ + I915_DEFINE_CONTEXT_PARAM_ENGINES(engines , I915_EXEC_RING_MASK + 1); + struct drm_i915_gem_context_param param = { + .ctx_id = gem_context_create(i915), + .param = I915_CONTEXT_PARAM_ENGINES, + .value = to_user_pointer(&engines), + .size = sizeof(engines), + }; + struct pnode { + struct igt_list_head spinners; + struct igt_list_head link; + } pnode[I915_EXEC_RING_MASK + 1], *p; + IGT_LIST_HEAD(plist); + igt_spin_t *spin, *sn; + + /* + * A quick test that each engine within a context is an independent + * timeline that we can reprioritise and shuffle amongst themselves. + */ + + igt_require(has_context_engines(i915)); + + for (int n = 0; n <= I915_EXEC_RING_MASK; n++) { + engines.engines[n].engine_class = e->class; + engines.engines[n].engine_instance = e->instance; + IGT_INIT_LIST_HEAD(&pnode[n].spinners); + igt_list_add(&pnode[n].link, &plist); + } + gem_context_set_param(i915, ¶m); + + for (int n = MIN_PRIO; n <= MAX_PRIO; n++) { + unsigned int engine = n & I915_EXEC_RING_MASK; + + gem_context_set_priority(i915, param.ctx_id, n); + spin = igt_spin_new(i915, param.ctx_id, .engine = engine); + + igt_list_move_tail(&spin->link, &pnode[engine].spinners); + igt_list_move(&pnode[engine].link, &plist); + } + + igt_list_for_each_entry(p, &plist, link) { + igt_list_for_each_entry_safe(spin, sn, &p->spinners, link) { + igt_spin_end(spin); + gem_sync(i915, spin->handle); + igt_spin_free(i915, spin); + } + } + gem_context_destroy(i915, param.ctx_id); +} + static void preempt_self(int fd, unsigned ring) { const struct intel_execution_engine2 *e; @@ -2444,6 +2506,9 @@ igt_main test_each_engine_store("preempt-queue-contexts-chain", fd, e) preempt_queue(fd, e->flags, CONTEXTS | CHAIN); + test_each_engine_store("preempt-engines", fd, e) + preempt_engines(fd, e, 0); + igt_subtest_group { igt_hang_t hang; |