drm/i915/selftest: Always cancel semaphore on error
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 13 Sep 2022 15:21:50 +0000 (17:21 +0200)
committerAndi Shyti <andi.shyti@linux.intel.com>
Wed, 14 Sep 2022 11:21:14 +0000 (13:21 +0200)
Ensure that we always signal the semaphore when timing out, so that if it
happens to be stuck waiting for the semaphore we will quickly recover
without having to wait for a reset.

Reported-by: CQ Tang <cq.tang@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: CQ Tang <cq.tang@intel.com>
cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
Signed-off-by: Karolina Drobnik <karolina.drobnik@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/8b7781f7dbaf2791156491b76d5faa7852e5cbbb.1663081418.git.karolina.drobnik@intel.com
drivers/gpu/drm/i915/gt/selftest_lrc.c

index 8320eab7ac3690310084486b989eea2313be9c6e..71e664fc87e9d217cd2bbfe12ee04533f8323309 100644 (file)
@@ -1460,18 +1460,17 @@ static int __lrc_isolation(struct intel_engine_cs *engine, u32 poison)
        }
 
        err = poison_registers(B, poison, sema);
-       if (err) {
-               WRITE_ONCE(*sema, -1);
-               i915_request_put(rq);
-               goto err_result1;
-       }
-
-       if (i915_request_wait(rq, 0, HZ / 2) < 0) {
-               i915_request_put(rq);
+       if (err == 0 && i915_request_wait(rq, 0, HZ / 2) < 0) {
+               pr_err("%s(%s): wait for results timed out\n",
+                      __func__, engine->name);
                err = -ETIME;
-               goto err_result1;
        }
+
+       /* Always cancel the semaphore wait, just in case the GPU gets stuck */
+       WRITE_ONCE(*sema, -1);
        i915_request_put(rq);
+       if (err)
+               goto err_result1;
 
        err = compare_isolation(engine, ref, result, A, poison);