Skip to content

Commit

Permalink
drm/i915/selftests: Force ordering of context switches
Browse files Browse the repository at this point in the history
The parallel switch test has an underlying assumption that its requests
are executed in order of submission, which is only true if the backend
manages to keep up. Ensure the order of execution matches the submission
order by explicit dependencies and so when we wait on the last request,
we know we wait on completion of the entire queue.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191016225730.29447-1-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Oct 25, 2019
1 parent 5932925 commit 2728200
Showing 1 changed file with 28 additions and 7 deletions.
35 changes: 28 additions & 7 deletions drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,18 +169,24 @@ static int __live_parallel_switch1(void *data)
struct i915_request *rq = NULL;
int err, n;

for (n = 0; n < ARRAY_SIZE(arg->ce); n++) {
i915_request_put(rq);
err = 0;
for (n = 0; !err && n < ARRAY_SIZE(arg->ce); n++) {
struct i915_request *prev = rq;

rq = i915_request_create(arg->ce[n]);
if (IS_ERR(rq))
if (IS_ERR(rq)) {
i915_request_put(prev);
return PTR_ERR(rq);
}

i915_request_get(rq);
if (prev) {
err = i915_request_await_dma_fence(rq, &prev->fence);
i915_request_put(prev);
}

i915_request_add(rq);
}

err = 0;
if (i915_request_wait(rq, 0, HZ / 5) < 0)
err = -ETIME;
i915_request_put(rq);
Expand All @@ -197,24 +203,39 @@ static int __live_parallel_switch1(void *data)
static int __live_parallel_switchN(void *data)
{
struct parallel_switch *arg = data;
struct i915_request *rq = NULL;
IGT_TIMEOUT(end_time);
unsigned long count;
int n;

count = 0;
do {
for (n = 0; n < ARRAY_SIZE(arg->ce); n++) {
struct i915_request *rq;
struct i915_request *prev = rq;
int err = 0;

rq = i915_request_create(arg->ce[n]);
if (IS_ERR(rq))
if (IS_ERR(rq)) {
i915_request_put(prev);
return PTR_ERR(rq);
}

i915_request_get(rq);
if (prev) {
err = i915_request_await_dma_fence(rq, &prev->fence);
i915_request_put(prev);
}

i915_request_add(rq);
if (err) {
i915_request_put(rq);
return err;
}
}

count++;
} while (!__igt_timeout(end_time, NULL));
i915_request_put(rq);

pr_info("%s: %lu switches (many)\n", arg->ce[0]->engine->name, count);
return 0;
Expand Down

0 comments on commit 2728200

Please sign in to comment.