Commit ba02f4c2 authored by Chris Wilson's avatar Chris Wilson

drm/i915/selftests: Wait for the dma-fence timeout

When testing that the timeout fired, we need to be sure we have waited
just long enough for the timeout to have occurred and for the softirq
(on another cpu) to have completed. Sleeping for an arbitrary amount is
prone to error, so wait for the timeout instead and complain if it was
too late.

v2: Use wait_event_timeout to provide an upper bound
v3: Fix inverted check for wait_event_timeout timing out
v4: Restore the check that the fences aren't signalled too early, by
inspecting them before the expected timeout.

References: https://bugs.freedesktop.org/show_bug.cgi?id=104670Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180117135713.2324-1-chris@chris-wilson.co.uk
parent 3f5b933e
...@@ -693,7 +693,8 @@ static int test_dma_fence(void *arg) ...@@ -693,7 +693,8 @@ static int test_dma_fence(void *arg)
sleep = jiffies_to_usecs(delay) / 3; sleep = jiffies_to_usecs(delay) / 3;
usleep_range(sleep, 2 * sleep); usleep_range(sleep, 2 * sleep);
if (time_after(jiffies, end)) { if (time_after(jiffies, end)) {
pr_debug("Slept too long, delay=%lu, skipping!\n", delay); pr_debug("Slept too long, delay=%lu, (target=%lu, now=%lu) skipping\n",
delay, end, jiffies);
goto skip; goto skip;
} }
...@@ -702,18 +703,15 @@ static int test_dma_fence(void *arg) ...@@ -702,18 +703,15 @@ static int test_dma_fence(void *arg)
goto err; goto err;
} }
do { if (!wait_event_timeout(timeout->wait,
sleep = jiffies_to_usecs(end - jiffies + 1); i915_sw_fence_done(timeout),
usleep_range(sleep, 2 * sleep); 2 * (end - jiffies) + 1)) {
} while (!time_after(jiffies, end)); pr_err("Timeout fence unsignaled!\n");
if (i915_sw_fence_done(not)) {
pr_err("No timeout fence signaled!\n");
goto err; goto err;
} }
if (!i915_sw_fence_done(timeout)) { if (i915_sw_fence_done(not)) {
pr_err("Timeout fence unsignaled!\n"); pr_err("No timeout fence signaled!\n");
goto err; goto err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment