drm/i915: unload: fix error_work races
[pandora-kernel.git] / drivers / gpu / drm / i915 / i915_dma.c
index 9d67b48..736cca8 100644 (file)
@@ -2256,9 +2256,6 @@ int i915_driver_unload(struct drm_device *dev)
        i915_mch_dev = NULL;
        spin_unlock(&mchdev_lock);
 
-       destroy_workqueue(dev_priv->wq);
-       del_timer_sync(&dev_priv->hangcheck_timer);
-
        io_mapping_free(dev_priv->mm.gtt_mapping);
        if (dev_priv->mm.gtt_mtrr >= 0) {
                mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
@@ -2283,6 +2280,9 @@ int i915_driver_unload(struct drm_device *dev)
                vga_client_register(dev->pdev, NULL, NULL, NULL);
        }
 
+       del_timer_sync(&dev_priv->hangcheck_timer);
+       cancel_work_sync(&dev_priv->error_work);
+
        if (dev->pdev->msi_enabled)
                pci_disable_msi(dev->pdev);
 
@@ -2307,6 +2307,8 @@ int i915_driver_unload(struct drm_device *dev)
 
        intel_teardown_mchbar(dev);
 
+       destroy_workqueue(dev_priv->wq);
+
        pci_dev_put(dev_priv->bridge_dev);
        kfree(dev->dev_private);