diff mbox series

[1/3] drm/i915: Allow for different modes of interruptible i915_active_wait

Message ID 20200327112212.16046-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [1/3] drm/i915: Allow for different modes of interruptible i915_active_wait | expand

Commit Message

Chris Wilson March 27, 2020, 11:22 a.m. UTC
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>
---
 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(-)

Comments

Mika Kuoppala March 30, 2020, 4:07 p.m. UTC | #1
Chris Wilson <chris@chris-wilson.co.uk> 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 <chris@chris-wilson.co.uk>
> ---
>  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 <mika.kuoppala@linux.intel.com>

>  
> @@ -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
Chris Wilson March 30, 2020, 5:20 p.m. UTC | #2
Quoting Mika Kuoppala (2020-03-30 17:07:34)
> Chris Wilson <chris@chris-wilson.co.uk> 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 <chris@chris-wilson.co.uk>
> > ---
> >  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

set_current_state()
signal_pending_state()

All locals refer to it as state :)
-Chris
diff mbox series

Patch

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;
 
@@ -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;
 	}