aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c15
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
2859void i915_gem_reset_finish(struct drm_i915_private *dev_priv) 2868void 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
2864static void nop_submit_request(struct drm_i915_gem_request *request) 2879static void nop_submit_request(struct drm_i915_gem_request *request)