[PATCH 33/33] hhmm

Chris Wilson chris at chris-wilson.co.uk
Sun Jul 23 18:12:19 UTC 2017


---
 drivers/gpu/drm/i915/i915_gem.c         | 26 ++++++++++----------------
 drivers/gpu/drm/i915/i915_gem_context.c |  9 ++++++++-
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 1cf31a6425cd..80fd4fc1e8d4 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3380,36 +3380,30 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
 	struct drm_i915_private *i915 = to_i915(gem->dev);
 	struct drm_i915_gem_object *obj = to_intel_bo(gem);
 	struct drm_i915_file_private *fpriv = file->driver_priv;
-	struct i915_vma *vma, *vn;
 	struct i915_lut_handle *lut, *ln;
 
-	mutex_lock(&obj->base.dev->struct_mutex);
+	mutex_lock(&i915->drm.struct_mutex);
 
 	list_for_each_entry_safe(lut, ln, &obj->lut_list, obj_link) {
 		struct i915_gem_context *ctx = lut->ctx;
+		struct i915_vma *vma;
 
 		if (ctx->file_priv != fpriv)
 			continue;
 
-		radix_tree_delete(&ctx->handles_vma, lut->handle);
-		i915_gem_object_put(obj);
+		vma = radix_tree_delete(&ctx->handles_vma, lut->handle);
+
+		if (!i915_vma_is_ggtt(vma))
+			i915_vma_close(vma);
 
 		list_del(&lut->obj_link);
 		list_del(&lut->ctx_link);
 
 		kmem_cache_free(i915->luts, lut);
+		__i915_gem_object_release_unless_active(obj);
 	}
 
-	list_for_each_entry_safe(vma, vn, &obj->vma_list, obj_link)
-		if (vma->vm->file == fpriv)
-			i915_vma_close(vma);
-
-	if (i915_gem_object_is_active(obj) &&
-	    !i915_gem_object_has_active_reference(obj)) {
-		i915_gem_object_set_active_reference(obj);
-		i915_gem_object_get(obj);
-	}
-	mutex_unlock(&obj->base.dev->struct_mutex);
+	mutex_unlock(&i915->drm.struct_mutex);
 }
 
 static unsigned long to_wait_timeout(s64 timeout_ns)
@@ -4662,8 +4656,8 @@ void __i915_gem_object_release_unless_active(struct drm_i915_gem_object *obj)
 {
 	lockdep_assert_held(&obj->base.dev->struct_mutex);
 
-	GEM_BUG_ON(i915_gem_object_has_active_reference(obj));
-	if (i915_gem_object_is_active(obj))
+	if (!i915_gem_object_has_active_reference(obj) &&
+	    i915_gem_object_is_active(obj))
 		i915_gem_object_set_active_reference(obj);
 	else
 		i915_gem_object_put(obj);
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 74f2b1c58ce1..358aadef09af 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -105,8 +105,15 @@ static void lut_close(struct i915_gem_context *ctx)
 	}
 
 	radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) {
-		i915_vma_put(rcu_dereference_raw(*slot));
+		struct i915_vma *vma = rcu_dereference_raw(*slot);
+		struct drm_i915_gem_object *obj = vma->obj;
+
 		radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
+
+		if (!i915_vma_is_ggtt(vma))
+			i915_vma_close(vma);
+
+		__i915_gem_object_release_unless_active(obj);
 	}
 }
 
-- 
2.13.3



More information about the Intel-gfx-trybot mailing list