[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