summaryrefslogtreecommitdiff
path: root/libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch')
-rw-r--r--libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch b/libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch
new file mode 100644
index 000000000..fe79b6953
--- /dev/null
+++ b/libre/linux-libre/0007-drm-i915-gem-Avoid-parking-the-vma-as-we-unbind.patch
@@ -0,0 +1,63 @@
+From d9f4e03a3469b8c1fce1fd5ef59708a504e5ba02 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Tue, 3 Dec 2019 15:50:32 +0000
+Subject: [PATCH 07/11] drm/i915/gem: Avoid parking the vma as we unbind
+
+In order to avoid keeping a reference on the i915_vma (which is long
+overdue!) we have to coordinate all the possible lifetimes and only use
+the vma while we know it is alive. In this episode, we are reminded that
+while idle, the closed vma are destroyed. So if the GT idles while we are
+working with the vma, the vma itself becomes invalid.
+
+First class i915_vma here we come, but in the meantime keep piling on
+the straw.
+
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Reviewed-by: Matthew Auld <matthew.auld@intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20191203155032.3137263-1-chris@chris-wilson.co.uk
+---
+ drivers/gpu/drm/i915/i915_gem.c | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index ed2436db5dd2..739543812422 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -141,18 +141,33 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj,
+ struct i915_vma,
+ obj_link))) {
+ struct i915_address_space *vm = vma->vm;
++ bool awake = false;
+
+- ret = -EBUSY;
++ ret = -EAGAIN;
+ if (!i915_vm_tryopen(vm))
+ break;
+
++ /* Prevent vma being freed by i915_vma_parked as we unbind */
++ if (intel_gt_pm_get_if_awake(vm->gt)) {
++ awake = true;
++ } else {
++ if (i915_vma_is_closed(vma)) {
++ spin_unlock(&obj->vma.lock);
++ goto err_vm;
++ }
++ }
++
+ list_move_tail(&vma->obj_link, &still_in_list);
+ spin_unlock(&obj->vma.lock);
+
++ ret = -EBUSY;
+ if (flags & I915_GEM_OBJECT_UNBIND_ACTIVE ||
+ !i915_vma_is_active(vma))
+ ret = i915_vma_unbind(vma);
+
++ if (awake)
++ intel_gt_pm_put(vm->gt);
++err_vm:
+ i915_vm_close(vm);
+ spin_lock(&obj->vma.lock);
+ }
+--
+2.25.1
+