* [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged
@ 2016-11-07 12:35 Mika Kuoppala
2016-11-07 12:47 ` Chris Wilson
2016-11-07 14:45 ` ✓ Fi.CI.BAT: success for series starting with [1/1] " Patchwork
0 siblings, 2 replies; 4+ messages in thread
From: Mika Kuoppala @ 2016-11-07 12:35 UTC (permalink / raw)
To: intel-gfx
We do take execlist spinlock on thread context when
we declare gpu to be wedged. Avoid the need to change
the spinlock type just for the sake of wedging by
removing the spinlock. Keep irqs disabled during reset
phase and only enable on success path. Also add explicit
disable to setting wedged so that we leave irqs off
if we fail init.
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
drivers/gpu/drm/i915/i915_drv.c | 20 ++------------------
drivers/gpu/drm/i915/i915_drv.h | 18 ++++++++++++++++++
drivers/gpu/drm/i915/i915_gem.c | 6 ++++--
3 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 0213a30..2ed81f1 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1725,22 +1725,6 @@ int i915_resume_switcheroo(struct drm_device *dev)
return i915_drm_resume(dev);
}
-static void disable_engines_irq(struct drm_i915_private *dev_priv)
-{
- struct intel_engine_cs *engine;
- enum intel_engine_id id;
-
- /* Ensure irq handler finishes, and not run again. */
- disable_irq(dev_priv->drm.irq);
- for_each_engine(engine, dev_priv, id)
- tasklet_kill(&engine->irq_tasklet);
-}
-
-static void enable_engines_irq(struct drm_i915_private *dev_priv)
-{
- enable_irq(dev_priv->drm.irq);
-}
-
/**
* i915_reset - reset chip after a hang
* @dev: drm device to reset
@@ -1775,9 +1759,8 @@ void i915_reset(struct drm_i915_private *dev_priv)
pr_notice("drm/i915: Resetting chip after gpu hang\n");
- disable_engines_irq(dev_priv);
+ i915_disable_engine_irqs(dev_priv);
ret = intel_gpu_reset(dev_priv, ALL_ENGINES);
- enable_engines_irq(dev_priv);
if (ret) {
if (ret != -ENODEV)
@@ -1812,6 +1795,7 @@ void i915_reset(struct drm_i915_private *dev_priv)
wakeup:
wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS);
+ i915_enable_engine_irqs(dev_priv);
return;
error:
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 4735b417..76ca14c 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -4147,6 +4147,24 @@ __i915_request_irq_complete(struct drm_i915_gem_request *req)
return false;
}
+static inline void
+i915_disable_engine_irqs(struct drm_i915_private *dev_priv)
+{
+ struct intel_engine_cs *engine;
+ enum intel_engine_id id;
+
+ /* Ensure irq handler finishes, and not run again. */
+ disable_irq(dev_priv->drm.irq);
+ for_each_engine(engine, dev_priv, id)
+ tasklet_kill(&engine->irq_tasklet);
+}
+
+static inline void
+i915_enable_engine_irqs(struct drm_i915_private *dev_priv)
+{
+ enable_irq(dev_priv->drm.irq);
+}
+
void i915_memcpy_init_early(struct drm_i915_private *dev_priv);
bool i915_memcpy_from_wc(void *dst, const void *src, unsigned long len);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 490fd30..51bf03b 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2689,12 +2689,11 @@ static void i915_gem_cleanup_engine(struct intel_engine_cs *engine)
*/
if (i915.enable_execlists) {
- spin_lock(&engine->execlist_lock);
+ /* Irqs are disabled so no need to get lock */
INIT_LIST_HEAD(&engine->execlist_queue);
i915_gem_request_put(engine->execlist_port[0].request);
i915_gem_request_put(engine->execlist_port[1].request);
memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
- spin_unlock(&engine->execlist_lock);
}
}
@@ -2704,6 +2703,9 @@ void i915_gem_set_wedged(struct drm_i915_private *dev_priv)
enum intel_engine_id id;
lockdep_assert_held(&dev_priv->drm.struct_mutex);
+
+ i915_disable_engine_irqs(dev_priv);
+
set_bit(I915_WEDGED, &dev_priv->gpu_error.flags);
i915_gem_context_lost(dev_priv);
--
2.7.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged
2016-11-07 12:35 [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged Mika Kuoppala
@ 2016-11-07 12:47 ` Chris Wilson
2016-11-07 13:01 ` Mika Kuoppala
2016-11-07 14:45 ` ✓ Fi.CI.BAT: success for series starting with [1/1] " Patchwork
1 sibling, 1 reply; 4+ messages in thread
From: Chris Wilson @ 2016-11-07 12:47 UTC (permalink / raw)
To: Mika Kuoppala; +Cc: intel-gfx
On Mon, Nov 07, 2016 at 02:35:38PM +0200, Mika Kuoppala wrote:
> We do take execlist spinlock on thread context when
> we declare gpu to be wedged. Avoid the need to change
> the spinlock type just for the sake of wedging by
> removing the spinlock. Keep irqs disabled during reset
> phase and only enable on success path. Also add explicit
> disable to setting wedged so that we leave irqs off
> if we fail init.
Technically that spinlock already needs irqsafe.
>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.c | 20 ++------------------
> drivers/gpu/drm/i915/i915_drv.h | 18 ++++++++++++++++++
> drivers/gpu/drm/i915/i915_gem.c | 6 ++++--
> 3 files changed, 24 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 0213a30..2ed81f1 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -1725,22 +1725,6 @@ int i915_resume_switcheroo(struct drm_device *dev)
> return i915_drm_resume(dev);
> }
>
> -static void disable_engines_irq(struct drm_i915_private *dev_priv)
> -{
> - struct intel_engine_cs *engine;
> - enum intel_engine_id id;
> -
> - /* Ensure irq handler finishes, and not run again. */
> - disable_irq(dev_priv->drm.irq);
> - for_each_engine(engine, dev_priv, id)
> - tasklet_kill(&engine->irq_tasklet);
> -}
> -
> -static void enable_engines_irq(struct drm_i915_private *dev_priv)
> -{
> - enable_irq(dev_priv->drm.irq);
> -}
> -
> /**
> * i915_reset - reset chip after a hang
> * @dev: drm device to reset
> @@ -1775,9 +1759,8 @@ void i915_reset(struct drm_i915_private *dev_priv)
>
> pr_notice("drm/i915: Resetting chip after gpu hang\n");
>
> - disable_engines_irq(dev_priv);
> + i915_disable_engine_irqs(dev_priv);
> ret = intel_gpu_reset(dev_priv, ALL_ENGINES);
> - enable_engines_irq(dev_priv);
>
> if (ret) {
> if (ret != -ENODEV)
> @@ -1812,6 +1795,7 @@ void i915_reset(struct drm_i915_private *dev_priv)
>
> wakeup:
> wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS);
> + i915_enable_engine_irqs(dev_priv);
To make this symmetric with set-wedged from init, it needs to be before
the wakeup:
Except that would be bad...
i915_disable_engine_irqs() doesn't just disable the GT interrupt, but
GMBUS, HPD, etc.
Since we already are planning to change this to use irqsafe spinlock
here, I think we just go forward with that plan. I thought there was
merit to having disable_engines_irq() for set-wedged, but it is
dangerously named!
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged
2016-11-07 12:47 ` Chris Wilson
@ 2016-11-07 13:01 ` Mika Kuoppala
0 siblings, 0 replies; 4+ messages in thread
From: Mika Kuoppala @ 2016-11-07 13:01 UTC (permalink / raw)
To: Chris Wilson; +Cc: intel-gfx
Chris Wilson <chris@chris-wilson.co.uk> writes:
> On Mon, Nov 07, 2016 at 02:35:38PM +0200, Mika Kuoppala wrote:
>> We do take execlist spinlock on thread context when
>> we declare gpu to be wedged. Avoid the need to change
>> the spinlock type just for the sake of wedging by
>> removing the spinlock. Keep irqs disabled during reset
>> phase and only enable on success path. Also add explicit
>> disable to setting wedged so that we leave irqs off
>> if we fail init.
>
> Technically that spinlock already needs irqsafe.
>>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_drv.c | 20 ++------------------
>> drivers/gpu/drm/i915/i915_drv.h | 18 ++++++++++++++++++
>> drivers/gpu/drm/i915/i915_gem.c | 6 ++++--
>> 3 files changed, 24 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
>> index 0213a30..2ed81f1 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -1725,22 +1725,6 @@ int i915_resume_switcheroo(struct drm_device *dev)
>> return i915_drm_resume(dev);
>> }
>>
>> -static void disable_engines_irq(struct drm_i915_private *dev_priv)
>> -{
>> - struct intel_engine_cs *engine;
>> - enum intel_engine_id id;
>> -
>> - /* Ensure irq handler finishes, and not run again. */
>> - disable_irq(dev_priv->drm.irq);
>> - for_each_engine(engine, dev_priv, id)
>> - tasklet_kill(&engine->irq_tasklet);
>> -}
>> -
>> -static void enable_engines_irq(struct drm_i915_private *dev_priv)
>> -{
>> - enable_irq(dev_priv->drm.irq);
>> -}
>> -
>> /**
>> * i915_reset - reset chip after a hang
>> * @dev: drm device to reset
>> @@ -1775,9 +1759,8 @@ void i915_reset(struct drm_i915_private *dev_priv)
>>
>> pr_notice("drm/i915: Resetting chip after gpu hang\n");
>>
>> - disable_engines_irq(dev_priv);
>> + i915_disable_engine_irqs(dev_priv);
>> ret = intel_gpu_reset(dev_priv, ALL_ENGINES);
>> - enable_engines_irq(dev_priv);
>>
>> if (ret) {
>> if (ret != -ENODEV)
>> @@ -1812,6 +1795,7 @@ void i915_reset(struct drm_i915_private *dev_priv)
>>
>> wakeup:
>> wake_up_bit(&error->flags, I915_RESET_IN_PROGRESS);
>> + i915_enable_engine_irqs(dev_priv);
>
> To make this symmetric with set-wedged from init, it needs to be before
> the wakeup:
>
> Except that would be bad...
>
> i915_disable_engine_irqs() doesn't just disable the GT interrupt, but
> GMBUS, HPD, etc.
>
> Since we already are planning to change this to use irqsafe spinlock
> here, I think we just go forward with that plan. I thought there was
> merit to having disable_engines_irq() for set-wedged, but it is
> dangerously named!
Yeah it disables more than engines. Lets wait for irqsave flavour to land
and rethink. This patch can be ignored.
-Mika
> -Chris
>
> --
> Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 4+ messages in thread
* ✓ Fi.CI.BAT: success for series starting with [1/1] drm/i915: Don't take execlist spinlock when setting wedged
2016-11-07 12:35 [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged Mika Kuoppala
2016-11-07 12:47 ` Chris Wilson
@ 2016-11-07 14:45 ` Patchwork
1 sibling, 0 replies; 4+ messages in thread
From: Patchwork @ 2016-11-07 14:45 UTC (permalink / raw)
To: Mika Kuoppala; +Cc: intel-gfx
== Series Details ==
Series: series starting with [1/1] drm/i915: Don't take execlist spinlock when setting wedged
URL : https://patchwork.freedesktop.org/series/14925/
State : success
== Summary ==
Series 14925v1 Series without cover letter
https://patchwork.freedesktop.org/api/1.0/series/14925/revisions/1/mbox/
fi-bdw-5557u total:241 pass:226 dwarn:0 dfail:0 fail:0 skip:15
fi-bsw-n3050 total:241 pass:201 dwarn:0 dfail:0 fail:0 skip:40
fi-bxt-t5700 total:241 pass:213 dwarn:0 dfail:0 fail:0 skip:28
fi-byt-j1900 total:241 pass:213 dwarn:0 dfail:0 fail:0 skip:28
fi-byt-n2820 total:241 pass:209 dwarn:0 dfail:0 fail:0 skip:32
fi-hsw-4770 total:241 pass:221 dwarn:0 dfail:0 fail:0 skip:20
fi-hsw-4770r total:241 pass:221 dwarn:0 dfail:0 fail:0 skip:20
fi-ilk-650 total:241 pass:188 dwarn:0 dfail:0 fail:0 skip:53
fi-ivb-3520m total:241 pass:219 dwarn:0 dfail:0 fail:0 skip:22
fi-ivb-3770 total:241 pass:219 dwarn:0 dfail:0 fail:0 skip:22
fi-kbl-7200u total:241 pass:219 dwarn:0 dfail:0 fail:0 skip:22
fi-skl-6260u total:241 pass:227 dwarn:0 dfail:0 fail:0 skip:14
fi-skl-6700hq total:241 pass:220 dwarn:0 dfail:0 fail:0 skip:21
fi-skl-6700k total:241 pass:219 dwarn:1 dfail:0 fail:0 skip:21
fi-skl-6770hq total:241 pass:227 dwarn:0 dfail:0 fail:0 skip:14
fi-snb-2520m total:241 pass:209 dwarn:0 dfail:0 fail:0 skip:32
fi-snb-2600 total:241 pass:208 dwarn:0 dfail:0 fail:0 skip:33
44f80301cde325b9a33e594f8bec88f84e02fffa drm-intel-nightly: 2016y-11m-07d-12h-48m-36s UTC integration manifest
2775697 drm/i915: Don't take execlist spinlock when setting wedged
== Logs ==
For more details see: https://intel-gfx-ci.01.org/CI/Patchwork_2920/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-11-07 14:45 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-07 12:35 [PATCH 1/1] drm/i915: Don't take execlist spinlock when setting wedged Mika Kuoppala
2016-11-07 12:47 ` Chris Wilson
2016-11-07 13:01 ` Mika Kuoppala
2016-11-07 14:45 ` ✓ Fi.CI.BAT: success for series starting with [1/1] " 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.