[RFC PATCH 076/162] drm/i915: Untangle the vma pages_mutex
Matthew Auld
matthew.auld at intel.com
Fri Nov 27 12:05:52 UTC 2020
From: Thomas Hellström <thomas.hellstrom at intel.com>
Move the vma pages_mutex out of the way from the object ww locks.
Signed-off-by: Thomas Hellström <thomas.hellstrom at intel.com>
Cc: Matthew Auld <matthew.auld at intel.com>
---
drivers/gpu/drm/i915/i915_vma.c | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 0c7e4191811a..7243ab593aec 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -792,28 +792,30 @@ static int vma_get_pages(struct i915_vma *vma)
if (atomic_add_unless(&vma->pages_count, 1, 0))
return 0;
+ if (vma->obj) {
+ err = i915_gem_object_pin_pages(vma->obj);
+ if (err)
+ return err;
+ }
+
/* Allocations ahoy! */
- if (mutex_lock_interruptible(&vma->pages_mutex))
- return -EINTR;
+ if (mutex_lock_interruptible(&vma->pages_mutex)) {
+ err = -EINTR;
+ goto unpin;
+ }
if (!atomic_read(&vma->pages_count)) {
- if (vma->obj) {
- err = i915_gem_object_pin_pages(vma->obj);
- if (err)
- goto unlock;
- }
-
err = vma->ops->set_pages(vma);
- if (err) {
- if (vma->obj)
- i915_gem_object_unpin_pages(vma->obj);
+ if (err)
goto unlock;
- }
}
atomic_inc(&vma->pages_count);
unlock:
mutex_unlock(&vma->pages_mutex);
+unpin:
+ if (err && vma->obj)
+ __i915_gem_object_unpin_pages(vma->obj);
return err;
}
@@ -826,10 +828,10 @@ static void __vma_put_pages(struct i915_vma *vma, unsigned int count)
if (atomic_sub_return(count, &vma->pages_count) == 0) {
vma->ops->clear_pages(vma);
GEM_BUG_ON(vma->pages);
- if (vma->obj)
- i915_gem_object_unpin_pages(vma->obj);
}
mutex_unlock(&vma->pages_mutex);
+ if (vma->obj)
+ i915_gem_object_unpin_pages(vma->obj);
}
static void vma_put_pages(struct i915_vma *vma)
--
2.26.2
More information about the dri-devel
mailing list