return err;
 }
 
-int i915_active_wait(struct i915_active *ref)
+int __i915_active_wait(struct i915_active *ref, int state)
 {
        int err;
 
        if (err)
                return err;
 
-       if (wait_var_event_interruptible(ref, i915_active_is_idle(ref)))
+       if (!i915_active_is_idle(ref) &&
+           ___wait_var_event(ref, i915_active_is_idle(ref),
+                             state, 0, 0, schedule()))
                return -EINTR;
 
        flush_work(&ref->work);
 
        return rcu_access_pointer(ref->excl.fence);
 }
 
-int i915_active_wait(struct i915_active *ref);
+int __i915_active_wait(struct i915_active *ref, int state);
+static inline int i915_active_wait(struct i915_active *ref)
+{
+       return __i915_active_wait(ref, TASK_INTERRUPTIBLE);
+}
 
 int i915_sw_fence_await_active(struct i915_sw_fence *fence,
                               struct i915_active *ref,
 
        if (IS_ERR(active))
                return PTR_ERR(active);
 
-       i915_active_wait(&active->base);
+       __i915_active_wait(&active->base, TASK_UNINTERRUPTIBLE);
        if (!READ_ONCE(active->retired)) {
                struct drm_printer p = drm_err_printer(__func__);
 
        }
 
        i915_active_release(&active->base);
+       if (err)
+               goto out;
 
-       if (err == 0)
-               err = i915_active_wait(&active->base);
-
-       if (err == 0 && !READ_ONCE(active->retired)) {
+       __i915_active_wait(&active->base, TASK_UNINTERRUPTIBLE);
+       if (!READ_ONCE(active->retired)) {
                pr_err("i915_active not retired after flushing barriers!\n");
                err = -EINVAL;
        }