aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/gem
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-10-16 23:57:30 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2019-10-25 13:38:08 +0100
commit2728200f48d315748b4fb2b2525e1ac211e97ecf (patch)
treeb5168d06d48d9d35c3d9afda386af7329c548114 /drivers/gpu/drm/i915/gem
parentdrm/i915: Move intel_engine_context_in/out into intel_lrc.c (diff)
downloadlinux-dev-2728200f48d315748b4fb2b2525e1ac211e97ecf.tar.xz
linux-dev-2728200f48d315748b4fb2b2525e1ac211e97ecf.zip
drm/i915/selftests: Force ordering of context switches
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
Diffstat (limited to 'drivers/gpu/drm/i915/gem')
-rw-r--r--drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
index 8f72f173db03..2c65c9e95cc5 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
@@ -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);
@@ -197,6 +203,7 @@ 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;
@@ -204,17 +211,31 @@ static int __live_parallel_switchN(void *data)
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;