All of lore.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.