drm/i915: Context objects can never be active when freed
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 25 Jun 2018 10:06:04 +0000 (11:06 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 25 Jun 2018 15:28:23 +0000 (16:28 +0100)
Due to how we only release the pining on the context state on
retirement and never track activity on the context vma itself, the
object can never be active at the point of release. Replace the
conditional transfer of ownership onto an active-reference with an
assert that the object is idle.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180625100604.22598-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.c

index 8f020537a34b75a6fa158744a817555621afaa5d..46572976c9420ffc52419bb74aca167f489c3fb5 100644 (file)
@@ -1344,7 +1344,9 @@ static void execlists_context_destroy(struct intel_context *ce)
                return;
 
        intel_ring_free(ce->ring);
-       __i915_gem_object_release_unless_active(ce->state->obj);
+
+       GEM_BUG_ON(i915_gem_object_is_active(ce->state->obj));
+       i915_gem_object_put(ce->state->obj);
 }
 
 static void execlists_context_unpin(struct intel_context *ce)
index 4dae23885006b3c7e0dec7d09850bd6080f9955d..d248742b147399a8c1a155f48e3060b2b4c28126 100644 (file)
@@ -1167,8 +1167,11 @@ static void intel_ring_context_destroy(struct intel_context *ce)
 {
        GEM_BUG_ON(ce->pin_count);
 
-       if (ce->state)
-               __i915_gem_object_release_unless_active(ce->state->obj);
+       if (!ce->state)
+               return;
+
+       GEM_BUG_ON(i915_gem_object_is_active(ce->state->obj));
+       i915_gem_object_put(ce->state->obj);
 }
 
 static int __context_pin_ppgtt(struct i915_gem_context *ctx)