intel_runtime_pm_put(gt->uncore->rpm, wakeref);
 }
 
-int intel_gt_reset_trylock(struct intel_gt *gt, int *srcu)
+static int _intel_gt_reset_lock(struct intel_gt *gt, int *srcu, bool retry)
 {
        might_lock(>->reset.backoff_srcu);
-       might_sleep();
+       if (retry)
+               might_sleep();
 
        rcu_read_lock();
        while (test_bit(I915_RESET_BACKOFF, >->reset.flags)) {
                rcu_read_unlock();
 
+               if (!retry)
+                       return -EBUSY;
+
                if (wait_event_interruptible(gt->reset.queue,
                                             !test_bit(I915_RESET_BACKOFF,
                                                       >->reset.flags)))
        return 0;
 }
 
+int intel_gt_reset_trylock(struct intel_gt *gt, int *srcu)
+{
+       return _intel_gt_reset_lock(gt, srcu, false);
+}
+
+int intel_gt_reset_lock_interruptible(struct intel_gt *gt, int *srcu)
+{
+       return _intel_gt_reset_lock(gt, srcu, true);
+}
+
 void intel_gt_reset_unlock(struct intel_gt *gt, int tag)
 __releases(>->reset.backoff_srcu)
 {
 
 void __i915_request_reset(struct i915_request *rq, bool guilty);
 
 int __must_check intel_gt_reset_trylock(struct intel_gt *gt, int *srcu);
+int __must_check intel_gt_reset_lock_interruptible(struct intel_gt *gt, int *srcu);
 void intel_gt_reset_unlock(struct intel_gt *gt, int tag);
 
 void intel_gt_set_wedged(struct intel_gt *gt);
 
 
        /*
         * Synchronize with gt reset to make sure the worker does not
-        * corrupt the engine/guc stats.
+        * corrupt the engine/guc stats. NB: can't actually block waiting
+        * for a reset to complete as the reset requires flushing out
+        * this worker thread if started. So waiting would deadlock.
         */
        ret = intel_gt_reset_trylock(gt, &srcu);
        if (ret)