Commit 841cd773 authored by Daniel Vetter's avatar Daniel Vetter

drm/i915: Only refcount ppgtt if it actually is one

This essentially unbreaks non-ppgtt operation where we'd scribble over
random memory.

While at it give the vm_to_ppgtt function a proper prefix and make it
a bit more paranoid.
Reviewed-by: default avatarMichel Thierry <michel.thierry@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 4d884705
...@@ -2512,6 +2512,15 @@ static inline bool i915_is_ggtt(struct i915_address_space *vm) ...@@ -2512,6 +2512,15 @@ static inline bool i915_is_ggtt(struct i915_address_space *vm)
return vm == ggtt; return vm == ggtt;
} }
static inline struct i915_hw_ppgtt *
i915_vm_to_ppgtt(struct i915_address_space *vm)
{
WARN_ON(i915_is_ggtt(vm));
return container_of(vm, struct i915_hw_ppgtt, base);
}
static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj) static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
{ {
return i915_gem_obj_bound(obj, obj_to_ggtt(obj)); return i915_gem_obj_bound(obj, obj_to_ggtt(obj));
...@@ -2547,7 +2556,6 @@ void i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj); ...@@ -2547,7 +2556,6 @@ void i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj);
/* i915_gem_context.c */ /* i915_gem_context.c */
#define ctx_to_ppgtt(ctx) container_of((ctx)->vm, struct i915_hw_ppgtt, base) #define ctx_to_ppgtt(ctx) container_of((ctx)->vm, struct i915_hw_ppgtt, base)
#define vm_to_ppgtt(vm) container_of(vm, struct i915_hw_ppgtt, base)
int __must_check i915_gem_context_init(struct drm_device *dev); int __must_check i915_gem_context_init(struct drm_device *dev);
void i915_gem_context_fini(struct drm_device *dev); void i915_gem_context_fini(struct drm_device *dev);
void i915_gem_context_reset(struct drm_device *dev); void i915_gem_context_reset(struct drm_device *dev);
......
...@@ -4485,7 +4485,8 @@ void i915_gem_vma_destroy(struct i915_vma *vma) ...@@ -4485,7 +4485,8 @@ void i915_gem_vma_destroy(struct i915_vma *vma)
vm = vma->vm; vm = vma->vm;
i915_ppgtt_put(vm_to_ppgtt(vm)); if (!i915_is_ggtt(vm))
i915_ppgtt_put(i915_vm_to_ppgtt(vm));
list_del(&vma->vma_link); list_del(&vma->vma_link);
......
...@@ -2187,7 +2187,8 @@ i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj, ...@@ -2187,7 +2187,8 @@ i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
if (!vma) if (!vma)
vma = __i915_gem_vma_create(obj, vm); vma = __i915_gem_vma_create(obj, vm);
i915_ppgtt_get(vm_to_ppgtt(vm)); if (!i915_is_ggtt(vm))
i915_ppgtt_get(i915_vm_to_ppgtt(vm));
return vma; return vma;
} }
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