drm/i915: Allow for different modes of interruptible i915_active_wait
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 27 Mar 2020 11:22:10 +0000 (11:22 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 30 Mar 2020 17:20:33 +0000 (18:20 +0100)
Allow some users the discretion to not immediately return on a normal
signal. Hopefully, they will opt to use TASK_KILLABLE instead.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200327112212.16046-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_active.c
drivers/gpu/drm/i915/i915_active.h
drivers/gpu/drm/i915/selftests/i915_active.c

index a0d31f7bfb42fe020b3e6bd7267381e1601d0e88..7b685032cc1e2c78e4ab78b32b4a48dd1352f26e 100644 (file)
@@ -496,7 +496,7 @@ static int flush_lazy_signals(struct i915_active *ref)
        return err;
 }
 
-int i915_active_wait(struct i915_active *ref)
+int __i915_active_wait(struct i915_active *ref, int state)
 {
        int err;
 
@@ -511,7 +511,9 @@ int i915_active_wait(struct i915_active *ref)
        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);
index b3282ae7913c1db60c0941a000bdef0b756715f1..4f9aa7bab5147ccd8f5aa58bcbb85b001f4c55de 100644 (file)
@@ -181,7 +181,11 @@ static inline bool i915_active_has_exclusive(struct i915_active *ref)
        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,
index 54080fb4af4bedd083c52290b77c58e12c842a19..4002c984c2e0c261f54d46e362b8b3f7caf40cad 100644 (file)
@@ -153,7 +153,7 @@ static int live_active_wait(void *arg)
        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__);
 
@@ -228,11 +228,11 @@ static int live_active_barrier(void *arg)
        }
 
        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;
        }