public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs
@ 2019-02-01 10:22 Chris Wilson
  2019-02-01 10:28 ` Chris Wilson
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Chris Wilson @ 2019-02-01 10:22 UTC (permalink / raw)
  To: intel-gfx

If we get caught in a kernel bug, we may never idle. Let the user regain
control of their system^Wterminal by responding to SIGINT!

Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index f3fa31d840f5..baf8b548621c 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3947,6 +3947,10 @@ i915_drop_caches_set(void *data, u64 val)
 
 	if (val & DROP_IDLE) {
 		do {
+			if (signal_pending(current)) {
+				ret = -EINTR;
+				goto out;
+			}
 			if (READ_ONCE(i915->gt.active_requests))
 				flush_delayed_work(&i915->gt.retire_work);
 			drain_delayed_work(&i915->gt.idle_work);
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs
  2019-02-01 10:22 [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs Chris Wilson
@ 2019-02-01 10:28 ` Chris Wilson
  2019-02-01 10:52 ` Chris Wilson
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Chris Wilson @ 2019-02-01 10:28 UTC (permalink / raw)
  To: intel-gfx

Quoting Chris Wilson (2019-02-01 10:22:48)
> If we get caught in a kernel bug, we may never idle. Let the user regain
> control of their system^Wterminal by responding to SIGINT!
> 
> Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_debugfs.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index f3fa31d840f5..baf8b548621c 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -3947,6 +3947,10 @@ i915_drop_caches_set(void *data, u64 val)
>  
>         if (val & DROP_IDLE) {
>                 do {
> +                       if (signal_pending(current)) {
> +                               ret = -EINTR;
> +                               goto out;
> +                       }
>                         if (READ_ONCE(i915->gt.active_requests))
>                                 flush_delayed_work(&i915->gt.retire_work);
>                         drain_delayed_work(&i915->gt.idle_work);

Drain delayed work will want similar treatment.
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs
  2019-02-01 10:22 [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs Chris Wilson
  2019-02-01 10:28 ` Chris Wilson
@ 2019-02-01 10:52 ` Chris Wilson
  2019-02-01 17:29   ` Tvrtko Ursulin
  2019-02-01 10:58 ` ✗ Fi.CI.BAT: failure for drm/i915: Avoid uninterruptible spinning in debugfs (rev2) Patchwork
  2019-02-01 11:01 ` ✓ Fi.CI.BAT: success for drm/i915: Avoid uninterruptible spinning in debugfs Patchwork
  3 siblings, 1 reply; 7+ messages in thread
From: Chris Wilson @ 2019-02-01 10:52 UTC (permalink / raw)
  To: intel-gfx

If we get caught in a kernel bug, we may never idle. Let the user regain
control of their system^Wterminal by responding to SIGINT!

v2: Push the signal checking into the loop around flush_work.

Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c            | 14 ++++++++------
 drivers/gpu/drm/i915/i915_gem.c                | 10 +++++++---
 drivers/gpu/drm/i915/i915_utils.h              | 18 +++++++++++++++---
 .../gpu/drm/i915/selftests/i915_gem_context.c  |  5 ++++-
 4 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index f3fa31d840f5..44fa34f4ebbc 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3945,12 +3945,14 @@ i915_drop_caches_set(void *data, u64 val)
 		i915_gem_shrink_all(i915);
 	fs_reclaim_release(GFP_KERNEL);
 
-	if (val & DROP_IDLE) {
-		do {
-			if (READ_ONCE(i915->gt.active_requests))
-				flush_delayed_work(&i915->gt.retire_work);
-			drain_delayed_work(&i915->gt.idle_work);
-		} while (READ_ONCE(i915->gt.awake));
+	if (val & DROP_IDLE && READ_ONCE(i915->gt.awake)) {
+		if (drain_delayed_work_state(&i915->gt.retire_work,
+					     TASK_INTERRUPTIBLE) ||
+		    drain_delayed_work_state(&i915->gt.idle_work,
+					     TASK_INTERRUPTIBLE)) {
+			ret = -EINTR;
+			goto out;
+		}
 	}
 
 	if (val & DROP_FREED)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4067eeaee78a..e47d53e9b634 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4499,13 +4499,17 @@ int i915_gem_suspend(struct drm_i915_private *i915)
 	mutex_unlock(&i915->drm.struct_mutex);
 	i915_reset_flush(i915);
 
-	drain_delayed_work(&i915->gt.retire_work);
-
 	/*
 	 * As the idle_work is rearming if it detects a race, play safe and
 	 * repeat the flush until it is definitely idle.
 	 */
-	drain_delayed_work(&i915->gt.idle_work);
+	if (drain_delayed_work_state(&i915->gt.retire_work,
+				     TASK_INTERRUPTIBLE) ||
+	    drain_delayed_work_state(&i915->gt.idle_work,
+				     TASK_INTERRUPTIBLE)) {
+		ret = -EINTR;
+		goto err_unlock;
+	}
 
 	/*
 	 * Assert that we successfully flushed all the work and
diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
index fcc751aa1ea8..6866b85e4239 100644
--- a/drivers/gpu/drm/i915/i915_utils.h
+++ b/drivers/gpu/drm/i915/i915_utils.h
@@ -25,6 +25,8 @@
 #ifndef __I915_UTILS_H
 #define __I915_UTILS_H
 
+#include <linux/sched/signal.h>
+
 #undef WARN_ON
 /* Many gcc seem to no see through this and fall over :( */
 #if 0
@@ -148,12 +150,22 @@ static inline void __list_del_many(struct list_head *head,
  * by requeueing itself. Note, that if the worker never cancels itself,
  * we will spin forever.
  */
-static inline void drain_delayed_work(struct delayed_work *dw)
+
+static inline int drain_delayed_work_state(struct delayed_work *dw, int state)
 {
 	do {
-		while (flush_delayed_work(dw))
-			;
+		do {
+			if (signal_pending_state(state, current))
+				return -EINTR;
+		} while (flush_delayed_work(dw));
 	} while (delayed_work_pending(dw));
+
+	return 0;
+}
+
+static inline void drain_delayed_work(struct delayed_work *dw)
+{
+	drain_delayed_work_state(dw, 0);
 }
 
 static inline const char *yesno(bool v)
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index 2b423128002c..a87998b90bf6 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -1686,8 +1686,11 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
 		/* XXX Bonus points for proving we are the kernel context! */
 
 		mutex_unlock(&i915->drm.struct_mutex);
-		drain_delayed_work(&i915->gt.idle_work);
+		err = drain_delayed_work_state(&i915->gt.idle_work,
+					       TASK_KILLABLE);
 		mutex_lock(&i915->drm.struct_mutex);
+		if (err)
+			return -EINTR;
 	}
 
 	if (igt_flush_test(i915, I915_WAIT_LOCKED))
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* ✗ Fi.CI.BAT: failure for drm/i915: Avoid uninterruptible spinning in debugfs (rev2)
  2019-02-01 10:22 [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs Chris Wilson
  2019-02-01 10:28 ` Chris Wilson
  2019-02-01 10:52 ` Chris Wilson
@ 2019-02-01 10:58 ` Patchwork
  2019-02-01 11:01 ` ✓ Fi.CI.BAT: success for drm/i915: Avoid uninterruptible spinning in debugfs Patchwork
  3 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-02-01 10:58 UTC (permalink / raw)
  To: Chris Wilson; +Cc: intel-gfx

== Series Details ==

Series: drm/i915: Avoid uninterruptible spinning in debugfs (rev2)
URL   : https://patchwork.freedesktop.org/series/56079/
State : failure

== Summary ==

Applying: drm/i915: Avoid uninterruptible spinning in debugfs
error: sha1 information is lacking or useless (drivers/gpu/drm/i915/i915_debugfs.c).
error: could not build fake ancestor
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 drm/i915: Avoid uninterruptible spinning in debugfs
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* ✓ Fi.CI.BAT: success for drm/i915: Avoid uninterruptible spinning in debugfs
  2019-02-01 10:22 [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs Chris Wilson
                   ` (2 preceding siblings ...)
  2019-02-01 10:58 ` ✗ Fi.CI.BAT: failure for drm/i915: Avoid uninterruptible spinning in debugfs (rev2) Patchwork
@ 2019-02-01 11:01 ` Patchwork
  3 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2019-02-01 11:01 UTC (permalink / raw)
  To: Chris Wilson; +Cc: intel-gfx

== Series Details ==

Series: drm/i915: Avoid uninterruptible spinning in debugfs
URL   : https://patchwork.freedesktop.org/series/56079/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_5524 -> Patchwork_12117
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://patchwork.freedesktop.org/api/1.0/series/56079/revisions/1/mbox/

Known issues
------------

  Here are the changes found in Patchwork_12117 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@amdgpu/amd_basic@userptr:
    - fi-kbl-8809g:       PASS -> DMESG-WARN [fdo#108965]

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       PASS -> FAIL [fdo#109485]

  * igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a-frame-sequence:
    - fi-byt-clapper:     PASS -> FAIL [fdo#103191] / [fdo#107362]

  
#### Possible fixes ####

  * igt@pm_rpm@basic-pci-d3-state:
    - fi-bsw-kefka:       {SKIP} [fdo#109271] -> PASS

  * igt@pm_rpm@basic-rte:
    - fi-bsw-kefka:       FAIL [fdo#108800] -> PASS

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103191]: https://bugs.freedesktop.org/show_bug.cgi?id=103191
  [fdo#107362]: https://bugs.freedesktop.org/show_bug.cgi?id=107362
  [fdo#108622]: https://bugs.freedesktop.org/show_bug.cgi?id=108622
  [fdo#108800]: https://bugs.freedesktop.org/show_bug.cgi?id=108800
  [fdo#108965]: https://bugs.freedesktop.org/show_bug.cgi?id=108965
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109485]: https://bugs.freedesktop.org/show_bug.cgi?id=109485


Participating hosts (49 -> 45)
------------------------------

  Additional (2): fi-hsw-4770r fi-ivb-3770 
  Missing    (6): fi-kbl-soraka fi-ilk-m540 fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-icl-y 


Build changes
-------------

    * Linux: CI_DRM_5524 -> Patchwork_12117

  CI_DRM_5524: 94a739eee19da904a40e612464dfa9f1326accfb @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_4802: 4049adf01014af077df2174def4fadf7cecb066e @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_12117: 4bf798b7ee1a9d54d571dc9c0470be480b209c9c @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

4bf798b7ee1a drm/i915: Avoid uninterruptible spinning in debugfs

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_12117/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs
  2019-02-01 10:52 ` Chris Wilson
@ 2019-02-01 17:29   ` Tvrtko Ursulin
  2019-02-01 17:32     ` Chris Wilson
  0 siblings, 1 reply; 7+ messages in thread
From: Tvrtko Ursulin @ 2019-02-01 17:29 UTC (permalink / raw)
  To: Chris Wilson, intel-gfx


On 01/02/2019 10:52, Chris Wilson wrote:
> If we get caught in a kernel bug, we may never idle. Let the user regain
> control of their system^Wterminal by responding to SIGINT!
> 
> v2: Push the signal checking into the loop around flush_work.
> 
> Reported-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_debugfs.c            | 14 ++++++++------
>   drivers/gpu/drm/i915/i915_gem.c                | 10 +++++++---
>   drivers/gpu/drm/i915/i915_utils.h              | 18 +++++++++++++++---
>   .../gpu/drm/i915/selftests/i915_gem_context.c  |  5 ++++-
>   4 files changed, 34 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index f3fa31d840f5..44fa34f4ebbc 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -3945,12 +3945,14 @@ i915_drop_caches_set(void *data, u64 val)
>   		i915_gem_shrink_all(i915);
>   	fs_reclaim_release(GFP_KERNEL);
>   
> -	if (val & DROP_IDLE) {
> -		do {
> -			if (READ_ONCE(i915->gt.active_requests))
> -				flush_delayed_work(&i915->gt.retire_work);
> -			drain_delayed_work(&i915->gt.idle_work);
> -		} while (READ_ONCE(i915->gt.awake));
> +	if (val & DROP_IDLE && READ_ONCE(i915->gt.awake)) {
> +		if (drain_delayed_work_state(&i915->gt.retire_work,
> +					     TASK_INTERRUPTIBLE) ||
> +		    drain_delayed_work_state(&i915->gt.idle_work,
> +					     TASK_INTERRUPTIBLE)) {
> +			ret = -EINTR;
> +			goto out;
> +		}

Shrinker remains only killable so still not Ctrl-C in all cases here. 
Don't know, not hot not cold. Will re-think it next week.

>   	}
>   
>   	if (val & DROP_FREED)
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 4067eeaee78a..e47d53e9b634 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4499,13 +4499,17 @@ int i915_gem_suspend(struct drm_i915_private *i915)
>   	mutex_unlock(&i915->drm.struct_mutex);
>   	i915_reset_flush(i915);
>   
> -	drain_delayed_work(&i915->gt.retire_work);
> -
>   	/*
>   	 * As the idle_work is rearming if it detects a race, play safe and
>   	 * repeat the flush until it is definitely idle.
>   	 */
> -	drain_delayed_work(&i915->gt.idle_work);
> +	if (drain_delayed_work_state(&i915->gt.retire_work,
> +				     TASK_INTERRUPTIBLE) ||
> +	    drain_delayed_work_state(&i915->gt.idle_work,
> +				     TASK_INTERRUPTIBLE)) {
> +		ret = -EINTR;
> +		goto err_unlock;
> +	}

I'm no suspend expert but it sounds unexpected there would be signals 
involved in the process. Does it have an userspace component? We don't 
bother with interruptible mutex on this path either.

>   
>   	/*
>   	 * Assert that we successfully flushed all the work and
> diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
> index fcc751aa1ea8..6866b85e4239 100644
> --- a/drivers/gpu/drm/i915/i915_utils.h
> +++ b/drivers/gpu/drm/i915/i915_utils.h
> @@ -25,6 +25,8 @@
>   #ifndef __I915_UTILS_H
>   #define __I915_UTILS_H
>   
> +#include <linux/sched/signal.h>
> +
>   #undef WARN_ON
>   /* Many gcc seem to no see through this and fall over :( */
>   #if 0
> @@ -148,12 +150,22 @@ static inline void __list_del_many(struct list_head *head,
>    * by requeueing itself. Note, that if the worker never cancels itself,
>    * we will spin forever.
>    */
> -static inline void drain_delayed_work(struct delayed_work *dw)
> +
> +static inline int drain_delayed_work_state(struct delayed_work *dw, int state)
>   {
>   	do {
> -		while (flush_delayed_work(dw))
> -			;
> +		do {
> +			if (signal_pending_state(state, current))
> +				return -EINTR;
> +		} while (flush_delayed_work(dw));
>   	} while (delayed_work_pending(dw));
> +
> +	return 0;
> +}
> +
> +static inline void drain_delayed_work(struct delayed_work *dw)
> +{
> +	drain_delayed_work_state(dw, 0);

0 would be TASK_RUNNING. signal_pending_state bails out in this case so 
that's good.

>   }
>   
>   static inline const char *yesno(bool v)
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> index 2b423128002c..a87998b90bf6 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -1686,8 +1686,11 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
>   		/* XXX Bonus points for proving we are the kernel context! */
>   
>   		mutex_unlock(&i915->drm.struct_mutex);
> -		drain_delayed_work(&i915->gt.idle_work);
> +		err = drain_delayed_work_state(&i915->gt.idle_work,
> +					       TASK_KILLABLE);
>   		mutex_lock(&i915->drm.struct_mutex);
> +		if (err)
> +			return -EINTR;
>   	}
>   
>   	if (igt_flush_test(i915, I915_WAIT_LOCKED))
> 

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs
  2019-02-01 17:29   ` Tvrtko Ursulin
@ 2019-02-01 17:32     ` Chris Wilson
  0 siblings, 0 replies; 7+ messages in thread
From: Chris Wilson @ 2019-02-01 17:32 UTC (permalink / raw)
  To: Tvrtko Ursulin, intel-gfx

Quoting Tvrtko Ursulin (2019-02-01 17:29:45)
> 
> On 01/02/2019 10:52, Chris Wilson wrote:
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> > index 4067eeaee78a..e47d53e9b634 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -4499,13 +4499,17 @@ int i915_gem_suspend(struct drm_i915_private *i915)
> >       mutex_unlock(&i915->drm.struct_mutex);
> >       i915_reset_flush(i915);
> >   
> > -     drain_delayed_work(&i915->gt.retire_work);
> > -
> >       /*
> >        * As the idle_work is rearming if it detects a race, play safe and
> >        * repeat the flush until it is definitely idle.
> >        */
> > -     drain_delayed_work(&i915->gt.idle_work);
> > +     if (drain_delayed_work_state(&i915->gt.retire_work,
> > +                                  TASK_INTERRUPTIBLE) ||
> > +         drain_delayed_work_state(&i915->gt.idle_work,
> > +                                  TASK_INTERRUPTIBLE)) {
> > +             ret = -EINTR;
> > +             goto err_unlock;
> > +     }
> 
> I'm no suspend expert but it sounds unexpected there would be signals 
> involved in the process. Does it have an userspace component? We don't 
> bother with interruptible mutex on this path either.

You wouldn't believe what users get up to! And they then file a bug
report that they interrupted suspend and it said EINTR...

> > diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
> > index fcc751aa1ea8..6866b85e4239 100644
> > --- a/drivers/gpu/drm/i915/i915_utils.h
> > +++ b/drivers/gpu/drm/i915/i915_utils.h
> > @@ -25,6 +25,8 @@
> >   #ifndef __I915_UTILS_H
> >   #define __I915_UTILS_H
> >   
> > +#include <linux/sched/signal.h>
> > +
> >   #undef WARN_ON
> >   /* Many gcc seem to no see through this and fall over :( */
> >   #if 0
> > @@ -148,12 +150,22 @@ static inline void __list_del_many(struct list_head *head,
> >    * by requeueing itself. Note, that if the worker never cancels itself,
> >    * we will spin forever.
> >    */
> > -static inline void drain_delayed_work(struct delayed_work *dw)
> > +
> > +static inline int drain_delayed_work_state(struct delayed_work *dw, int state)
> >   {
> >       do {
> > -             while (flush_delayed_work(dw))
> > -                     ;
> > +             do {
> > +                     if (signal_pending_state(state, current))
> > +                             return -EINTR;
> > +             } while (flush_delayed_work(dw));
> >       } while (delayed_work_pending(dw));
> > +
> > +     return 0;
> > +}
> > +
> > +static inline void drain_delayed_work(struct delayed_work *dw)
> > +{
> > +     drain_delayed_work_state(dw, 0);
> 
> 0 would be TASK_RUNNING. signal_pending_state bails out in this case so 
> that's good.

The same trick is used in mutex_lock_(interruptible|killable) to map
onto a common handler for mutex_lock, so I don't think its unintentional
;)
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-02-01 17:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-02-01 10:22 [PATCH] drm/i915: Avoid uninterruptible spinning in debugfs Chris Wilson
2019-02-01 10:28 ` Chris Wilson
2019-02-01 10:52 ` Chris Wilson
2019-02-01 17:29   ` Tvrtko Ursulin
2019-02-01 17:32     ` Chris Wilson
2019-02-01 10:58 ` ✗ Fi.CI.BAT: failure for drm/i915: Avoid uninterruptible spinning in debugfs (rev2) Patchwork
2019-02-01 11:01 ` ✓ Fi.CI.BAT: success for drm/i915: Avoid uninterruptible spinning in debugfs Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox