diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 27fe5a9315f0..1051fdf37d20 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -2719,7 +2719,16 @@ int i915_gem_reset_prepare(struct drm_i915_private *dev_priv) | |||
2719 | for_each_engine(engine, dev_priv, id) { | 2719 | for_each_engine(engine, dev_priv, id) { |
2720 | struct drm_i915_gem_request *request; | 2720 | struct drm_i915_gem_request *request; |
2721 | 2721 | ||
2722 | /* Prevent request submission to the hardware until we have | ||
2723 | * completed the reset in i915_gem_reset_finish(). If a request | ||
2724 | * is completed by one engine, it may then queue a request | ||
2725 | * to a second via its engine->irq_tasklet *just* as we are | ||
2726 | * calling engine->init_hw() and also writing the ELSP. | ||
2727 | * Turning off the engine->irq_tasklet until the reset is over | ||
2728 | * prevents the race. | ||
2729 | */ | ||
2722 | tasklet_kill(&engine->irq_tasklet); | 2730 | tasklet_kill(&engine->irq_tasklet); |
2731 | tasklet_disable(&engine->irq_tasklet); | ||
2723 | 2732 | ||
2724 | if (engine_stalled(engine)) { | 2733 | if (engine_stalled(engine)) { |
2725 | request = i915_gem_find_active_request(engine); | 2734 | request = i915_gem_find_active_request(engine); |
@@ -2858,7 +2867,13 @@ void i915_gem_reset(struct drm_i915_private *dev_priv) | |||
2858 | 2867 | ||
2859 | void i915_gem_reset_finish(struct drm_i915_private *dev_priv) | 2868 | void i915_gem_reset_finish(struct drm_i915_private *dev_priv) |
2860 | { | 2869 | { |
2870 | struct intel_engine_cs *engine; | ||
2871 | enum intel_engine_id id; | ||
2872 | |||
2861 | lockdep_assert_held(&dev_priv->drm.struct_mutex); | 2873 | lockdep_assert_held(&dev_priv->drm.struct_mutex); |
2874 | |||
2875 | for_each_engine(engine, dev_priv, id) | ||
2876 | tasklet_enable(&engine->irq_tasklet); | ||
2862 | } | 2877 | } |
2863 | 2878 | ||
2864 | static void nop_submit_request(struct drm_i915_gem_request *request) | 2879 | static void nop_submit_request(struct drm_i915_gem_request *request) |