[PATCH 2/2] reset2
Chris Wilson
chris at chris-wilson.co.uk
Wed Jan 30 01:31:38 UTC 2019
---
drivers/gpu/drm/i915/i915_gem.c | 1 -
drivers/gpu/drm/i915/i915_gpu_error.h | 12 ------------
drivers/gpu/drm/i915/intel_display.c | 18 ++++++------------
drivers/gpu/drm/i915/intel_overlay.c | 7 ++++---
.../gpu/drm/i915/selftests/mock_gem_device.c | 1 -
5 files changed, 10 insertions(+), 29 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index caccff87a2a1..33d3ff48a44f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -5288,7 +5288,6 @@ int i915_gem_init_early(struct drm_i915_private *dev_priv)
i915_gem_retire_work_handler);
INIT_DELAYED_WORK(&dev_priv->gt.idle_work,
i915_gem_idle_work_handler);
- init_waitqueue_head(&dev_priv->gpu_error.wait_queue);
init_waitqueue_head(&dev_priv->gpu_error.reset_queue);
mutex_init(&dev_priv->gpu_error.wedge_mutex);
init_srcu_struct(&dev_priv->gpu_error.srcu);
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h
index 4e797c552b96..d1ac9193f7fe 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.h
+++ b/drivers/gpu/drm/i915/i915_gpu_error.h
@@ -202,8 +202,6 @@ struct i915_gpu_error {
/* Protected by the above dev->gpu_error.lock. */
struct i915_gpu_state *first_error;
- atomic_t pending_fb_pin;
-
/**
* State variable controlling the reset flow and count
*
@@ -258,16 +256,6 @@ struct i915_gpu_error {
struct mutex wedge_mutex; /* serialises wedging/unwedging */
- /**
- * Waitqueue to signal when a hang is detected. Used to for waiters
- * to release the struct_mutex for the reset to procede.
- */
- wait_queue_head_t wait_queue;
-
- /**
- * Waitqueue to signal when the reset has completed. Used by clients
- * that wait for dev_priv->mm.wedged to settle.
- */
wait_queue_head_t reset_queue;
struct srcu_struct srcu;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 539d8915b55f..90144da46723 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2061,6 +2061,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
struct i915_vma *vma;
unsigned int pinctl;
u32 alignment;
+ int srcu;
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
@@ -2082,8 +2083,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
* pin/unpin/fence and not more.
*/
wakeref = intel_runtime_pm_get(dev_priv);
-
- atomic_inc(&dev_priv->gpu_error.pending_fb_pin);
+ srcu = i915_reset_lock(dev_priv);
pinctl = 0;
@@ -2134,8 +2134,7 @@ intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
i915_vma_get(vma);
err:
- atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
-
+ i915_reset_unlock(dev_priv, srcu);
intel_runtime_pm_put(dev_priv, wakeref);
return vma;
}
@@ -3800,12 +3799,7 @@ void intel_prepare_reset(struct drm_i915_private *dev_priv)
/* We have a modeset vs reset deadlock, defensively unbreak it. */
set_bit(I915_RESET_MODESET, &dev_priv->gpu_error.flags);
- wake_up_all(&dev_priv->gpu_error.wait_queue);
-
- if (atomic_read(&dev_priv->gpu_error.pending_fb_pin)) {
- DRM_DEBUG_KMS("Modeset potentially stuck, unbreaking through wedging\n");
- i915_gem_set_wedged(dev_priv);
- }
+ wake_up_all(&dev_priv->gpu_error.reset_queue);
/*
* Need mode_config.mutex so that we don't
@@ -12990,7 +12984,7 @@ static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_stat
for (;;) {
prepare_to_wait(&intel_state->commit_ready.wait,
&wait_fence, TASK_UNINTERRUPTIBLE);
- prepare_to_wait(&dev_priv->gpu_error.wait_queue,
+ prepare_to_wait(&dev_priv->gpu_error.reset_queue,
&wait_reset, TASK_UNINTERRUPTIBLE);
@@ -13001,7 +12995,7 @@ static void intel_atomic_commit_fence_wait(struct intel_atomic_state *intel_stat
schedule();
}
finish_wait(&intel_state->commit_ready.wait, &wait_fence);
- finish_wait(&dev_priv->gpu_error.wait_queue, &wait_reset);
+ finish_wait(&dev_priv->gpu_error.reset_queue, &wait_reset);
}
static void intel_atomic_cleanup_work(struct work_struct *work)
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index a9238fd07e30..80d40934ff54 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -751,6 +751,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
bool scale_changed = false;
struct i915_vma *vma;
int ret, tmp_width;
+ int srcu;
lockdep_assert_held(&dev_priv->drm.struct_mutex);
WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
@@ -759,7 +760,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
if (ret != 0)
return ret;
- atomic_inc(&dev_priv->gpu_error.pending_fb_pin);
+ srcu = i915_reset_lock(dev_priv);
vma = i915_gem_object_pin_to_display_plane(new_bo,
0, NULL, PIN_MAPPABLE);
@@ -840,13 +841,13 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
if (ret)
goto out_unpin;
+ i915_reset_unlock(dev_priv, srcu);
return 0;
out_unpin:
i915_gem_object_unpin_from_display_plane(vma);
out_pin_section:
- atomic_dec(&dev_priv->gpu_error.pending_fb_pin);
-
+ i915_reset_unlock(dev_priv, srcu);
return ret;
}
diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
index 074a0d9cbf26..6cf1361f829f 100644
--- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
+++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
@@ -187,7 +187,6 @@ struct drm_i915_private *mock_gem_device(void)
mock_uncore_init(i915);
i915_gem_init__mm(i915);
- init_waitqueue_head(&i915->gpu_error.wait_queue);
init_waitqueue_head(&i915->gpu_error.reset_queue);
init_srcu_struct(&i915->gpu_error.srcu);
mutex_init(&i915->gpu_error.wedge_mutex);
--
2.20.1
More information about the Intel-gfx-trybot
mailing list