[Intel-gfx] [PATCH 29/40] drm/i915: Differentiate between ggtt->mutex and ppgtt->mutex
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Sep 24 13:04:42 UTC 2018
On 19/09/2018 20:55, Chris Wilson wrote:
> We have two classes of VM, global GTT and per-process GTT. In order to
> allow ourselves the freedom to mix both along call chains, distinguish
> the two classes with regards to their mutex and lockdep maps.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 10 +++++-----
> drivers/gpu/drm/i915/i915_gem_gtt.h | 2 ++
> drivers/gpu/drm/i915/selftests/mock_gtt.c | 6 +++---
> 3 files changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index ef38d09b6ce0..719e1ac212c1 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -523,8 +523,7 @@ static void vm_free_page(struct i915_address_space *vm, struct page *page)
> spin_unlock(&vm->free_pages.lock);
> }
>
> -static void i915_address_space_init(struct i915_address_space *vm,
> - struct drm_i915_private *dev_priv)
> +static void i915_address_space_init(struct i915_address_space *vm, int subclass)
> {
> /*
> * The vm->mutex must be reclaim safe (for use in the shrinker).
> @@ -532,6 +531,7 @@ static void i915_address_space_init(struct i915_address_space *vm,
> * attempt holding the lock is immediately reported by lockdep.
> */
> mutex_init(&vm->mutex);
> + lockdep_set_subclass(&vm->mutex, subclass);
> i915_gem_shrinker_taints_mutex(&vm->mutex);
>
> GEM_BUG_ON(!vm->total);
> @@ -1658,7 +1658,7 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
> */
> ppgtt->vm.has_read_only = !intel_vgpu_active(i915);
>
> - i915_address_space_init(&ppgtt->vm, i915);
> + i915_address_space_init(&ppgtt->vm, VM_CLASS_PPGTT);
>
> /* There are only few exceptions for gen >=6. chv and bxt.
> * And we are not sure about the latter so play safe for now.
> @@ -2165,7 +2165,7 @@ static struct i915_hw_ppgtt *gen6_ppgtt_create(struct drm_i915_private *i915)
>
> ppgtt->base.vm.total = I915_PDES * GEN6_PTES * I915_GTT_PAGE_SIZE;
>
> - i915_address_space_init(&ppgtt->base.vm, i915);
> + i915_address_space_init(&ppgtt->base.vm, VM_CLASS_PPGTT);
>
> ppgtt->base.vm.allocate_va_range = gen6_alloc_va_range;
> ppgtt->base.vm.clear_range = gen6_ppgtt_clear_range;
> @@ -3607,7 +3607,7 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv)
> * and beyond the end of the GTT if we do not provide a guard.
> */
> mutex_lock(&dev_priv->drm.struct_mutex);
> - i915_address_space_init(&ggtt->vm, dev_priv);
> + i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT);
>
> ggtt->vm.is_ggtt = true;
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 7e2af5f4f39b..849a1f67b037 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -286,6 +286,8 @@ struct i915_address_space {
> bool closed;
>
> struct mutex mutex; /* protects vma and our lists */
> +#define VM_CLASS_GGTT 0
> +#define VM_CLASS_PPGTT 1
>
> struct i915_page_dma scratch_page;
> struct i915_page_table *scratch_pt;
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gtt.c b/drivers/gpu/drm/i915/selftests/mock_gtt.c
> index 6ae418c76015..976c862b3842 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gtt.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gtt.c
> @@ -70,7 +70,7 @@ mock_ppgtt(struct drm_i915_private *i915,
> ppgtt->vm.total = round_down(U64_MAX, PAGE_SIZE);
> ppgtt->vm.file = ERR_PTR(-ENODEV);
>
> - i915_address_space_init(&ppgtt->vm, i915);
> + i915_address_space_init(&ppgtt->vm, VM_CLASS_PPGTT);
>
> ppgtt->vm.clear_range = nop_clear_range;
> ppgtt->vm.insert_page = mock_insert_page;
> @@ -102,6 +102,7 @@ void mock_init_ggtt(struct drm_i915_private *i915)
> struct i915_ggtt *ggtt = &i915->ggtt;
>
> ggtt->vm.i915 = i915;
> + ggtt->vm.is_ggtt = true;
>
> ggtt->gmadr = (struct resource) DEFINE_RES_MEM(0, 2048 * PAGE_SIZE);
> ggtt->mappable_end = resource_size(&ggtt->gmadr);
> @@ -117,9 +118,8 @@ void mock_init_ggtt(struct drm_i915_private *i915)
> ggtt->vm.vma_ops.set_pages = ggtt_set_pages;
> ggtt->vm.vma_ops.clear_pages = clear_pages;
>
> - i915_address_space_init(&ggtt->vm, i915);
>
> - ggtt->vm.is_ggtt = true;
> + i915_address_space_init(&ggtt->vm, VM_CLASS_GGTT);
> }
>
> void mock_fini_ggtt(struct drm_i915_private *i915)
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list