[PATCH 55/55] mm-resvlock-vma

Chris Wilson chris at chris-wilson.co.uk
Sun Jun 21 11:51:44 UTC 2020


---
 drivers/gpu/drm/i915/gt/gen6_ppgtt.c  |  7 ++++++-
 drivers/gpu/drm/i915/gt/gen6_ppgtt.h  |  2 ++
 drivers/gpu/drm/i915/i915_vma.c       | 11 +++++------
 drivers/gpu/drm/i915/i915_vma_types.h |  2 --
 4 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/gen6_ppgtt.c b/drivers/gpu/drm/i915/gt/gen6_ppgtt.c
index 2c5ac598ade2..8858906242d8 100644
--- a/drivers/gpu/drm/i915/gt/gen6_ppgtt.c
+++ b/drivers/gpu/drm/i915/gt/gen6_ppgtt.c
@@ -281,6 +281,8 @@ static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
 	gen6_ppgtt_free_pd(ppgtt);
 	free_scratch(vm);
 
+	dma_resv_fini(&ppgtt->resv);
+
 	mutex_destroy(&ppgtt->flush);
 	mutex_destroy(&ppgtt->pin_mutex);
 	kfree(ppgtt->base.pd);
@@ -360,7 +362,6 @@ static struct i915_vma *pd_vma_create(struct gen6_ppgtt *ppgtt, int size)
 	i915_active_init(&vma->active, NULL, NULL);
 
 	kref_init(&vma->ref);
-	mutex_init(&vma->pages_mutex);
 	vma->vm = i915_vm_get(&ggtt->vm);
 	vma->ops = &pd_vma_ops;
 	vma->private = ppgtt;
@@ -444,6 +445,8 @@ struct i915_ppgtt *gen6_ppgtt_create(struct intel_gt *gt)
 	mutex_init(&ppgtt->flush);
 	mutex_init(&ppgtt->pin_mutex);
 
+	dma_resv_init(&ppgtt->resv);
+
 	ppgtt_init(&ppgtt->base, gt);
 	ppgtt->base.vm.top = 1;
 
@@ -471,6 +474,8 @@ struct i915_ppgtt *gen6_ppgtt_create(struct intel_gt *gt)
 		goto err_scratch;
 	}
 
+	ppgtt->vma->resv = &ppgtt->resv;
+
 	return &ppgtt->base;
 
 err_scratch:
diff --git a/drivers/gpu/drm/i915/gt/gen6_ppgtt.h b/drivers/gpu/drm/i915/gt/gen6_ppgtt.h
index 72e481806c96..6232940a9f76 100644
--- a/drivers/gpu/drm/i915/gt/gen6_ppgtt.h
+++ b/drivers/gpu/drm/i915/gt/gen6_ppgtt.h
@@ -15,6 +15,8 @@ struct gen6_ppgtt {
 	struct i915_vma *vma;
 	gen6_pte_t __iomem *pd_addr;
 
+	struct dma_resv resv;
+
 	atomic_t pin_count;
 	struct mutex pin_mutex;
 
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index efb9eacf59b9..2340992c3f79 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -115,7 +115,6 @@ vma_create(struct drm_i915_gem_object *obj,
 		return ERR_PTR(-ENOMEM);
 
 	kref_init(&vma->ref);
-	mutex_init(&vma->pages_mutex);
 	vma->vm = i915_vm_get(vm);
 	vma->ops = &vm->vma_ops;
 	vma->obj = obj;
@@ -806,12 +805,12 @@ int i915_vma_get_pages(struct i915_vma *vma)
 		return 0;
 
 	/* Allocations ahoy! */
-	if (mutex_lock_interruptible(&vma->pages_mutex))
+	if (dma_resv_lock_interruptible(vma->resv, NULL))
 		return -EINTR;
 
 	if (!atomic_read(&vma->pages_count)) {
 		if (vma->obj) {
-			err = i915_gem_object_pin_pages(vma->obj);
+			err = __i915_gem_object_get_pages_locked(vma->obj);
 			if (err)
 				goto unlock;
 		}
@@ -826,7 +825,7 @@ int i915_vma_get_pages(struct i915_vma *vma)
 	atomic_inc(&vma->pages_count);
 
 unlock:
-	mutex_unlock(&vma->pages_mutex);
+	dma_resv_unlock(vma->resv);
 
 	return err;
 }
@@ -834,7 +833,7 @@ int i915_vma_get_pages(struct i915_vma *vma)
 static void __vma_put_pages(struct i915_vma *vma, unsigned int count)
 {
 	/* We allocate under vma_get_pages, so beware the shrinker */
-	mutex_lock_nested(&vma->pages_mutex, SINGLE_DEPTH_NESTING);
+	dma_resv_lock(vma->resv, NULL);
 	GEM_BUG_ON(atomic_read(&vma->pages_count) < count);
 	if (atomic_sub_return(count, &vma->pages_count) == 0) {
 		vma->ops->clear_pages(vma);
@@ -842,7 +841,7 @@ static void __vma_put_pages(struct i915_vma *vma, unsigned int count)
 		if (vma->obj)
 			i915_gem_object_unpin_pages(vma->obj);
 	}
-	mutex_unlock(&vma->pages_mutex);
+	dma_resv_unlock(vma->resv);
 }
 
 void i915_vma_put_pages(struct i915_vma *vma)
diff --git a/drivers/gpu/drm/i915/i915_vma_types.h b/drivers/gpu/drm/i915/i915_vma_types.h
index 63831cdb7402..227ba1a031e9 100644
--- a/drivers/gpu/drm/i915/i915_vma_types.h
+++ b/drivers/gpu/drm/i915/i915_vma_types.h
@@ -255,7 +255,6 @@ struct i915_vma {
 #define I915_VMA_PAGES_BIAS 24
 #define I915_VMA_PAGES_ACTIVE (BIT(24) | 1)
 	atomic_t pages_count; /* number of active binds to the pages */
-	struct mutex pages_mutex; /* protect acquire/release of backing pages */
 
 	/**
 	 * Support different GGTT views into the same object.
@@ -280,4 +279,3 @@ struct i915_vma {
 };
 
 #endif
-
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list