aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/selftests/igt_flush_test.c55
1 files changed, 9 insertions, 46 deletions
diff --git a/drivers/gpu/drm/i915/selftests/igt_flush_test.c b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
index 09ab037ce803..af66e3d4e23a 100644
--- a/drivers/gpu/drm/i915/selftests/igt_flush_test.c
+++ b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
@@ -9,52 +9,8 @@
9#include "../i915_selftest.h" 9#include "../i915_selftest.h"
10#include "igt_flush_test.h" 10#include "igt_flush_test.h"
11 11
12struct wedge_me {
13 struct delayed_work work;
14 struct drm_i915_private *i915;
15 const void *symbol;
16};
17
18static void wedge_me(struct work_struct *work)
19{
20 struct wedge_me *w = container_of(work, typeof(*w), work.work);
21
22 pr_err("%pS timed out, cancelling all further testing.\n", w->symbol);
23
24 GEM_TRACE("%pS timed out.\n", w->symbol);
25 GEM_TRACE_DUMP();
26
27 i915_gem_set_wedged(w->i915);
28}
29
30static void __init_wedge(struct wedge_me *w,
31 struct drm_i915_private *i915,
32 long timeout,
33 const void *symbol)
34{
35 w->i915 = i915;
36 w->symbol = symbol;
37
38 INIT_DELAYED_WORK_ONSTACK(&w->work, wedge_me);
39 schedule_delayed_work(&w->work, timeout);
40}
41
42static void __fini_wedge(struct wedge_me *w)
43{
44 cancel_delayed_work_sync(&w->work);
45 destroy_delayed_work_on_stack(&w->work);
46 w->i915 = NULL;
47}
48
49#define wedge_on_timeout(W, DEV, TIMEOUT) \
50 for (__init_wedge((W), (DEV), (TIMEOUT), __builtin_return_address(0)); \
51 (W)->i915; \
52 __fini_wedge((W)))
53
54int igt_flush_test(struct drm_i915_private *i915, unsigned int flags) 12int igt_flush_test(struct drm_i915_private *i915, unsigned int flags)
55{ 13{
56 struct wedge_me w;
57
58 cond_resched(); 14 cond_resched();
59 15
60 if (flags & I915_WAIT_LOCKED && 16 if (flags & I915_WAIT_LOCKED &&
@@ -63,8 +19,15 @@ int igt_flush_test(struct drm_i915_private *i915, unsigned int flags)
63 i915_gem_set_wedged(i915); 19 i915_gem_set_wedged(i915);
64 } 20 }
65 21
66 wedge_on_timeout(&w, i915, HZ) 22 if (i915_gem_wait_for_idle(i915, flags, HZ / 5) == -ETIME) {
67 i915_gem_wait_for_idle(i915, flags, MAX_SCHEDULE_TIMEOUT); 23 pr_err("%pS timed out, cancelling all further testing.\n",
24 __builtin_return_address(0));
25
26 GEM_TRACE("%pS timed out.\n", __builtin_return_address(0));
27 GEM_TRACE_DUMP();
28
29 i915_gem_set_wedged(i915);
30 }
68 31
69 return i915_terminally_wedged(&i915->gpu_error) ? -EIO : 0; 32 return i915_terminally_wedged(&i915->gpu_error) ? -EIO : 0;
70} 33}