diff options
author | Ben Widawsky | 2013-12-06 23:10:51 +0100 |
---|---|---|
committer | Daniel Vetter | 2013-12-18 15:27:46 +0100 |
commit | feb822cfc2540c2d2df7827f40991aa2f86f1130 (patch) | |
tree | 74f62ba3906c4774ae06133b4930fc719622aca1 /drivers/gpu/drm/i915/i915_gem.c | |
parent | drm/i915: Takedown drm_mm on failed gtt setup (diff) | |
download | kernel-qcow2-linux-feb822cfc2540c2d2df7827f40991aa2f86f1130.tar.gz kernel-qcow2-linux-feb822cfc2540c2d2df7827f40991aa2f86f1130.tar.xz kernel-qcow2-linux-feb822cfc2540c2d2df7827f40991aa2f86f1130.zip |
drm/i915: Handle inactivating objects for all VMAs
This came from a patch called, "drm/i915: Move active to vma"
When moving an object to the inactive list, we do it for all VMs for
which the object is bound.
The primary difference from that patch is this time around we don't not
track 'active' per vma, but rather by object. Therefore, we only need
one unref.
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 11141590eda0..d8981ec9fd3b 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2008,13 +2008,17 @@ static void i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj) { struct drm_i915_private *dev_priv = obj->base.dev->dev_private; - struct i915_address_space *ggtt_vm = &dev_priv->gtt.base; - struct i915_vma *vma = i915_gem_obj_to_vma(obj, ggtt_vm); + struct i915_address_space *vm; + struct i915_vma *vma; BUG_ON(obj->base.write_domain & ~I915_GEM_GPU_DOMAINS); BUG_ON(!obj->active); - list_move_tail(&vma->mm_list, &ggtt_vm->inactive_list); + list_for_each_entry(vm, &dev_priv->vm_list, global_link) { + vma = i915_gem_obj_to_vma(obj, vm); + if (vma && !list_empty(&vma->mm_list)) + list_move_tail(&vma->mm_list, &vm->inactive_list); + } list_del_init(&obj->ring_list); obj->ring = NULL; |