]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Split off pci_driver.remove() tail to drm_driver.release()
authorJanusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Thu, 30 May 2019 13:31:05 +0000 (15:31 +0200)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 31 May 2019 07:43:18 +0000 (08:43 +0100)
In order to support driver hot unbind, some cleanup operations, now
performed on PCI driver remove, must be called later, after all device
file descriptors are closed.

Split out those operations from the tail of pci_driver.remove()
callback and put them into drm_driver.release() which is called as soon
as all references to the driver are put.  As a result, those cleanups
will be now run on last drm_dev_put(), either still called from
pci_driver.remove() if all device file descriptors are already closed,
or on last drm_release() file operation.

Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190530133105.30467-1-janusz.krzysztofik@linux.intel.com
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c

index 6a8b31f631ac8874daee7ca5302a470d2ae509f1..1af6751e1b362ce741d173b6a4813438caed00fa 100644 (file)
@@ -742,6 +742,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
 
 cleanup_gem:
        i915_gem_suspend(dev_priv);
+       i915_gem_fini_hw(dev_priv);
        i915_gem_fini(dev_priv);
 cleanup_modeset:
        intel_modeset_cleanup(dev);
@@ -1690,7 +1691,6 @@ static void i915_driver_cleanup_hw(struct drm_i915_private *dev_priv)
                pci_disable_msi(pdev);
 
        pm_qos_remove_request(&dev_priv->pm_qos);
-       i915_ggtt_cleanup_hw(dev_priv);
 }
 
 /**
@@ -1914,6 +1914,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 out_cleanup_hw:
        i915_driver_cleanup_hw(dev_priv);
+       i915_ggtt_cleanup_hw(dev_priv);
 out_cleanup_mmio:
        i915_driver_cleanup_mmio(dev_priv);
 out_runtime_pm_put:
@@ -1965,21 +1966,29 @@ 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);
+       i915_gem_fini_hw(dev_priv);
 
        intel_power_domains_fini_hw(dev_priv);
 
        i915_driver_cleanup_hw(dev_priv);
-       i915_driver_cleanup_mmio(dev_priv);
 
        enable_rpm_wakeref_asserts(dev_priv);
-       intel_runtime_pm_cleanup(dev_priv);
 }
 
 static void i915_driver_release(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
 
+       disable_rpm_wakeref_asserts(dev_priv);
+
+       i915_gem_fini(dev_priv);
+
+       i915_ggtt_cleanup_hw(dev_priv);
+       i915_driver_cleanup_mmio(dev_priv);
+
+       enable_rpm_wakeref_asserts(dev_priv);
+       intel_runtime_pm_cleanup(dev_priv);
+
        i915_driver_cleanup_early(dev_priv);
        i915_driver_destroy(dev_priv);
 }
index 4eb8f6a181c1f533d5e89fcdd794217bfd5d0427..0dee503a5b68b2c8c9be1ff29a97390e108a24d8 100644 (file)
@@ -2745,6 +2745,7 @@ void i915_gem_init_mmio(struct drm_i915_private *i915);
 int __must_check i915_gem_init(struct drm_i915_private *dev_priv);
 int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv);
 void i915_gem_init_swizzling(struct drm_i915_private *dev_priv);
+void i915_gem_fini_hw(struct drm_i915_private *dev_priv);
 void i915_gem_fini(struct drm_i915_private *dev_priv);
 int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
                           unsigned int flags, long timeout);
index e5aafbeb1d194b5dfd82a74a437b4ffe5a3927bb..5c6d94fe1ca2f6892b1381f1799b0c20d1670711 100644 (file)
@@ -1664,7 +1664,7 @@ err_uc_misc:
        return ret;
 }
 
-void i915_gem_fini(struct drm_i915_private *dev_priv)
+void i915_gem_fini_hw(struct drm_i915_private *dev_priv)
 {
        GEM_BUG_ON(dev_priv->gt.awake);
 
@@ -1679,6 +1679,14 @@ void i915_gem_fini(struct drm_i915_private *dev_priv)
        mutex_lock(&dev_priv->drm.struct_mutex);
        intel_uc_fini_hw(dev_priv);
        intel_uc_fini(dev_priv);
+       mutex_unlock(&dev_priv->drm.struct_mutex);
+
+       i915_gem_drain_freed_objects(dev_priv);
+}
+
+void i915_gem_fini(struct drm_i915_private *dev_priv)
+{
+       mutex_lock(&dev_priv->drm.struct_mutex);
        intel_engines_cleanup(dev_priv);
        i915_gem_contexts_fini(dev_priv);
        i915_gem_fini_scratch(dev_priv);