[PATCH] fini
Chris Wilson
chris at chris-wilson.co.uk
Thu Apr 4 11:12:45 UTC 2019
---
drivers/gpu/drm/i915/i915_drv.c | 9 +++++----
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/i915_gem.c | 21 +++++++++++++--------
drivers/gpu/drm/i915/i915_pci.c | 1 -
4 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 0bbf3f5db5fc..cc64e4d855f5 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -719,7 +719,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
return 0;
cleanup_gem:
- i915_gem_suspend(dev_priv);
+ i915_gem_remove(dev_priv);
i915_gem_fini(dev_priv);
cleanup_modeset:
intel_modeset_cleanup(dev);
@@ -1910,7 +1910,8 @@ void i915_driver_unload(struct drm_device *dev)
/* Flush any external code that still may be under the RCU lock */
synchronize_rcu();
- i915_gem_suspend(dev_priv);
+ /* Cancel all inflight GPU operations */
+ i915_gem_remove(dev_priv);
drm_atomic_helper_shutdown(dev);
@@ -1929,8 +1930,6 @@ void i915_driver_unload(struct drm_device *dev)
cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
i915_reset_error_state(dev_priv);
- i915_gem_fini(dev_priv);
-
intel_power_domains_fini_hw(dev_priv);
i915_driver_cleanup_hw(dev_priv);
@@ -1944,6 +1943,8 @@ static void i915_driver_release(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = to_i915(dev);
+ i915_gem_fini(dev_priv);
+
i915_driver_cleanup_early(dev_priv);
i915_driver_destroy(dev_priv);
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8f38d03b1c4e..99ea3247aae8 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3136,6 +3136,7 @@ int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
unsigned int flags, long timeout);
void i915_gem_suspend(struct drm_i915_private *dev_priv);
void i915_gem_suspend_late(struct drm_i915_private *dev_priv);
+void i915_gem_remove(struct drm_i915_private *i915);
void i915_gem_resume(struct drm_i915_private *dev_priv);
vm_fault_t i915_gem_fault(struct vm_fault *vmf);
int i915_gem_object_wait(struct drm_i915_gem_object *obj,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index bf594a5e88bc..92503f3b449e 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4454,6 +4454,18 @@ void i915_gem_suspend(struct drm_i915_private *i915)
intel_runtime_pm_put(i915, wakeref);
}
+void i915_gem_remove(struct drm_i915_private *i915)
+{
+ /* Time for a quick exit. Simply kill anything still in flight. */
+ i915_gem_set_wedged(i915);
+
+ /* Flush any residual requests and mop up. */
+ i915_gem_suspend(i915);
+ i915_gem_suspend_late(i915);
+
+ i915_gem_drain_workqueue(i915);
+}
+
void i915_gem_suspend_late(struct drm_i915_private *i915)
{
struct drm_i915_gem_object *obj;
@@ -4956,10 +4968,7 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
err_init_hw:
mutex_unlock(&dev_priv->drm.struct_mutex);
- i915_gem_suspend(dev_priv);
- i915_gem_suspend_late(dev_priv);
-
- i915_gem_drain_workqueue(dev_priv);
+ i915_gem_remove(dev_priv);
mutex_lock(&dev_priv->drm.struct_mutex);
intel_uc_fini_hw(dev_priv);
@@ -5017,12 +5026,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
void i915_gem_fini(struct drm_i915_private *dev_priv)
{
- i915_gem_suspend_late(dev_priv);
intel_disable_gt_powersave(dev_priv);
- /* Flush any outstanding unpin_work. */
- i915_gem_drain_workqueue(dev_priv);
-
mutex_lock(&dev_priv->drm.struct_mutex);
intel_uc_fini_hw(dev_priv);
intel_uc_fini(dev_priv);
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
index 6ffb85ddac53..e7f9acb1bfe1 100644
--- a/drivers/gpu/drm/i915/i915_pci.c
+++ b/drivers/gpu/drm/i915/i915_pci.c
@@ -843,7 +843,6 @@ static void i915_pci_remove(struct pci_dev *pdev)
if (!dev) /* driver load aborted, nothing to cleanup */
return;
- i915_driver_unload(dev);
drm_dev_put(dev);
pci_set_drvdata(pdev, NULL);
--
2.20.1
More information about the Intel-gfx-trybot
mailing list