drm/i915: Only refcount ppgtt if it actually is one
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 6 Aug 2014 13:04:48 +0000 (15:04 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 13 Aug 2014 12:23:29 +0000 (14:23 +0200)
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: Michel Thierry <michel.thierry@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c

index 101fc637eb4677f082311b608957572230c989c9..454badf31dfd74b391f46338ad5981b88fcabd90 100644 (file)
@@ -2512,6 +2512,15 @@ static inline bool i915_is_ggtt(struct i915_address_space *vm)
        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)
 {
        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);
 
 /* i915_gem_context.c */
 #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);
 void i915_gem_context_fini(struct drm_device *dev);
 void i915_gem_context_reset(struct drm_device *dev);
index 8061d45eaa8017f44b58b59be5ab637554d5226a..e3e30cd474be70a430adc28ef99f9423d0dcb341 100644 (file)
@@ -4485,7 +4485,8 @@ void i915_gem_vma_destroy(struct i915_vma *vma)
 
        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);
 
index a5715faba65fa34d556ea510d6640e78f863f062..48d8f4a21c3f840f7b5aa780558df435237cbba6 100644 (file)
@@ -2187,7 +2187,8 @@ i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
        if (!vma)
                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;
 }