drm/i915: Be defensive when starting vma activity
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 20 Aug 2019 10:05:31 +0000 (11:05 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 20 Aug 2019 13:23:45 +0000 (14:23 +0100)
Before we acquire the vma for GPU activity, ensure that the underlying
object is not already in the process of being freed.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190820100531.8430-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_vma.c
drivers/gpu/drm/i915/i915_vma.h

index 68260b4..252edef 100644 (file)
@@ -87,8 +87,7 @@ static inline struct i915_vma *active_to_vma(struct i915_active *ref)
 
 static int __i915_vma_active(struct i915_active *ref)
 {
-       i915_vma_get(active_to_vma(ref));
-       return 0;
+       return i915_vma_tryget(active_to_vma(ref)) ? 0 : -ENOENT;
 }
 
 static void __i915_vma_retire(struct i915_active *ref)
index b3d2121..59dfe52 100644 (file)
@@ -231,6 +231,14 @@ static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)
        return vma;
 }
 
+static inline struct i915_vma *i915_vma_tryget(struct i915_vma *vma)
+{
+       if (likely(kref_get_unless_zero(&vma->obj->base.refcount)))
+               return vma;
+
+       return NULL;
+}
+
 static inline void i915_vma_put(struct i915_vma *vma)
 {
        i915_gem_object_put(vma->obj);