Commit 305dc3f9 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Differentiate between ggtt->mutex and ppgtt->mutex

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190114215956.32266-1-chris@chris-wilson.co.uk
parent d8af3270
...@@ -473,8 +473,7 @@ static void vm_free_page(struct i915_address_space *vm, struct page *page) ...@@ -473,8 +473,7 @@ static void vm_free_page(struct i915_address_space *vm, struct page *page)
spin_unlock(&vm->free_pages.lock); spin_unlock(&vm->free_pages.lock);
} }
static void i915_address_space_init(struct i915_address_space *vm, static void i915_address_space_init(struct i915_address_space *vm, int subclass)
struct drm_i915_private *dev_priv)
{ {
/* /*
* The vm->mutex must be reclaim safe (for use in the shrinker). * The vm->mutex must be reclaim safe (for use in the shrinker).
...@@ -482,6 +481,7 @@ static void i915_address_space_init(struct i915_address_space *vm, ...@@ -482,6 +481,7 @@ static void i915_address_space_init(struct i915_address_space *vm,
* attempt holding the lock is immediately reported by lockdep. * attempt holding the lock is immediately reported by lockdep.
*/ */
mutex_init(&vm->mutex); mutex_init(&vm->mutex);
lockdep_set_subclass(&vm->mutex, subclass);
i915_gem_shrinker_taints_mutex(vm->i915, &vm->mutex); i915_gem_shrinker_taints_mutex(vm->i915, &vm->mutex);
GEM_BUG_ON(!vm->total); GEM_BUG_ON(!vm->total);
...@@ -1547,7 +1547,7 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915) ...@@ -1547,7 +1547,7 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
/* From bdw, there is support for read-only pages in the PPGTT. */ /* From bdw, there is support for read-only pages in the PPGTT. */
ppgtt->vm.has_read_only = true; ppgtt->vm.has_read_only = true;
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. /* There are only few exceptions for gen >=6. chv and bxt.
* And we are not sure about the latter so play safe for now. * And we are not sure about the latter so play safe for now.
...@@ -1996,7 +1996,7 @@ static struct i915_hw_ppgtt *gen6_ppgtt_create(struct drm_i915_private *i915) ...@@ -1996,7 +1996,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; 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.allocate_va_range = gen6_alloc_va_range;
ppgtt->base.vm.clear_range = gen6_ppgtt_clear_range; ppgtt->base.vm.clear_range = gen6_ppgtt_clear_range;
...@@ -3433,7 +3433,7 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv) ...@@ -3433,7 +3433,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. * and beyond the end of the GTT if we do not provide a guard.
*/ */
mutex_lock(&dev_priv->drm.struct_mutex); 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; ggtt->vm.is_ggtt = true;
......
...@@ -288,6 +288,8 @@ struct i915_address_space { ...@@ -288,6 +288,8 @@ struct i915_address_space {
bool closed; bool closed;
struct mutex mutex; /* protects vma and our lists */ struct mutex mutex; /* protects vma and our lists */
#define VM_CLASS_GGTT 0
#define VM_CLASS_PPGTT 1
u64 scratch_pte; u64 scratch_pte;
struct i915_page_dma scratch_page; struct i915_page_dma scratch_page;
......
...@@ -70,7 +70,7 @@ mock_ppgtt(struct drm_i915_private *i915, ...@@ -70,7 +70,7 @@ mock_ppgtt(struct drm_i915_private *i915,
ppgtt->vm.total = round_down(U64_MAX, PAGE_SIZE); ppgtt->vm.total = round_down(U64_MAX, PAGE_SIZE);
ppgtt->vm.file = ERR_PTR(-ENODEV); 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.clear_range = nop_clear_range;
ppgtt->vm.insert_page = mock_insert_page; ppgtt->vm.insert_page = mock_insert_page;
...@@ -102,6 +102,7 @@ void mock_init_ggtt(struct drm_i915_private *i915) ...@@ -102,6 +102,7 @@ void mock_init_ggtt(struct drm_i915_private *i915)
struct i915_ggtt *ggtt = &i915->ggtt; struct i915_ggtt *ggtt = &i915->ggtt;
ggtt->vm.i915 = i915; ggtt->vm.i915 = i915;
ggtt->vm.is_ggtt = true;
ggtt->gmadr = (struct resource) DEFINE_RES_MEM(0, 2048 * PAGE_SIZE); ggtt->gmadr = (struct resource) DEFINE_RES_MEM(0, 2048 * PAGE_SIZE);
ggtt->mappable_end = resource_size(&ggtt->gmadr); ggtt->mappable_end = resource_size(&ggtt->gmadr);
...@@ -117,9 +118,8 @@ void mock_init_ggtt(struct drm_i915_private *i915) ...@@ -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.set_pages = ggtt_set_pages;
ggtt->vm.vma_ops.clear_pages = clear_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) void mock_fini_ggtt(struct drm_i915_private *i915)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment