Message ID | 20180919195544.1511-29-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/40] drm: Use default dma_fence hooks where possible for null syncobj | expand |
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@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@intel.com> Regards, Tvrtko
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)
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@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(-)