Chris Wilson <[email protected]> writes:

> 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 <[email protected]>
> ---
>  drivers/gpu/drm/i915/i915_active.c           |  6 ++++--
>  drivers/gpu/drm/i915/i915_active.h           |  6 +++++-
>  drivers/gpu/drm/i915/selftests/i915_active.c | 10 +++++-----
>  3 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_active.c 
> b/drivers/gpu/drm/i915/i915_active.c
> index a0d31f7bfb42..7b685032cc1e 100644
> --- a/drivers/gpu/drm/i915/i915_active.c
> +++ b/drivers/gpu/drm/i915/i915_active.c
> @@ -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;

minor gripe: s/state/task_state

Reviewed-by: Mika Kuoppala <[email protected]>

>  
> @@ -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);
> diff --git a/drivers/gpu/drm/i915/i915_active.h 
> b/drivers/gpu/drm/i915/i915_active.h
> index b3282ae7913c..4f9aa7bab514 100644
> --- a/drivers/gpu/drm/i915/i915_active.h
> +++ b/drivers/gpu/drm/i915/i915_active.h
> @@ -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,
> diff --git a/drivers/gpu/drm/i915/selftests/i915_active.c 
> b/drivers/gpu/drm/i915/selftests/i915_active.c
> index 54080fb4af4b..4002c984c2e0 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_active.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_active.c
> @@ -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;
>       }
> -- 
> 2.20.1
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to