drm/i915/selftests: Wait for the dma-fence timeout
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 17 Jan 2018 13:57:13 +0000 (13:57 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 17 Jan 2018 17:09:59 +0000 (17:09 +0000)
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=104670
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180117135713.2324-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/selftests/i915_sw_fence.c

index 4fb51deb81a1d0d45e58e29a97c28520a447f95c..570e325af93ea23305d8975fdf627a0d94474d95 100644 (file)
@@ -693,7 +693,8 @@ static int test_dma_fence(void *arg)
        sleep = jiffies_to_usecs(delay) / 3;
        usleep_range(sleep, 2 * sleep);
        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;
        }
 
@@ -702,18 +703,15 @@ static int test_dma_fence(void *arg)
                goto err;
        }
 
-       do {
-               sleep = jiffies_to_usecs(end - jiffies + 1);
-               usleep_range(sleep, 2 * sleep);
-       } while (!time_after(jiffies, end));
-
-       if (i915_sw_fence_done(not)) {
-               pr_err("No timeout fence signaled!\n");
+       if (!wait_event_timeout(timeout->wait,
+                               i915_sw_fence_done(timeout),
+                               2 * (end - jiffies) + 1)) {
+               pr_err("Timeout fence unsignaled!\n");
                goto err;
        }
 
-       if (!i915_sw_fence_done(timeout)) {
-               pr_err("Timeout fence unsignaled!\n");
+       if (i915_sw_fence_done(not)) {
+               pr_err("No timeout fence signaled!\n");
                goto err;
        }