drm/i915: Unbind any residual objects/vma from the Global GTT on shutdown
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Feb 2017 16:35:22 +0000 (16:35 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Feb 2017 19:10:05 +0000 (19:10 +0000)
We may unload the PCI device before all users (such as dma-buf) are
completely shutdown. This may leave VMA in the global GTT which we want
to revoke, whilst keeping the objects themselves around to service the
dma-buf.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170210163523.17533-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c

index 3c83f2b91af0e116bc6eb83480aa4ffd09da6c7d..d580e2b4081be2e434d56e6d6e2387367dd2de7f 100644 (file)
@@ -2818,6 +2818,15 @@ err:
 void i915_ggtt_cleanup_hw(struct drm_i915_private *dev_priv)
 {
        struct i915_ggtt *ggtt = &dev_priv->ggtt;
+       struct i915_vma *vma, *vn;
+
+       ggtt->base.closed = true;
+
+       mutex_lock(&dev_priv->drm.struct_mutex);
+       WARN_ON(!list_empty(&ggtt->base.active_list));
+       list_for_each_entry_safe(vma, vn, &ggtt->base.inactive_list, vm_link)
+               WARN_ON(i915_vma_unbind(vma));
+       mutex_unlock(&dev_priv->drm.struct_mutex);
 
        if (dev_priv->mm.aliasing_ppgtt) {
                struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;