[PATCH 47/53] smoke

Chris Wilson chris at chris-wilson.co.uk
Sun Mar 31 17:25:13 UTC 2019


---
 drivers/gpu/drm/i915/gem/i915_gem_context.c   | 30 ++++++++++++++++---
 .../gpu/drm/i915/gem/i915_gem_context_types.h |  3 +-
 .../gpu/drm/i915/gem/i915_gem_execbuffer.c    |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_object.c    | 25 +++++-----------
 4 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index 3442323d3d8c..e1ac27404cbb 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -106,9 +106,32 @@ static void lut_close(struct i915_gem_context *ctx)
 	rcu_read_lock();
 	radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) {
 		struct i915_vma *vma = rcu_dereference_raw(*slot);
+		struct drm_i915_gem_object *obj = vma->obj;
+		struct i915_lut_handle *lut;
+		bool found = false;
+
+		rcu_read_unlock();
+		i915_gem_object_lock(obj);
+		list_for_each_entry(lut, &obj->lut_list, obj_link) {
+			if (lut->ctx != ctx)
+				continue;
+
+			if (lut->handle != iter.index)
+				continue;
 
-		radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
-		vma->open_count--;
+			list_del(&lut->obj_link);
+			found = true;
+			break;
+		}
+		i915_gem_object_unlock(obj);
+		rcu_read_lock();
+
+		if (found) {
+			radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
+			if (!--vma->open_count && !i915_vma_is_ggtt(vma))
+				i915_vma_close(vma);
+			i915_gem_object_put(obj);
+		}
 	}
 	rcu_read_unlock();
 }
@@ -343,6 +366,7 @@ static void context_close(struct i915_gem_context *ctx)
 	mutex_lock(&ctx->mutex);
 
 	i915_gem_context_set_closed(ctx);
+	ctx->file_priv = ERR_PTR(-EBADF);
 
 	/*
 	 * This context will never again be assinged to HW, so we can
@@ -357,8 +381,6 @@ static void context_close(struct i915_gem_context *ctx)
 	 */
 	lut_close(ctx);
 
-	ctx->file_priv = ERR_PTR(-EBADF);
-
 	mutex_unlock(&ctx->mutex);
 	i915_gem_context_put(ctx);
 }
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
index 7eea82d2a09a..8fc153f367fa 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h
@@ -183,7 +183,8 @@ struct i915_gem_context {
 	/** remap_slice: Bitmask of cache lines that need remapping */
 	u8 remap_slice;
 
-	/** handles_vma: rbtree to look up our context specific obj/vma for
+	/**
+	 * handles_vma: rbtree to look up our context specific obj/vma for
 	 * the user handle. (user handles are per fd, but the binding is
 	 * per vm, which may be one per context or shared with the global GTT)
 	 */
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
index 4d028198c36b..f78c037d8bc2 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
@@ -851,7 +851,7 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb)
 		if (!vma->open_count++)
 			i915_vma_reopen(vma);
 		lut->handle = handle;
-		lut->ctx = i915_gem_context_get(eb->gem_context);
+		lut->ctx = eb->gem_context;
 
 		i915_gem_object_lock(obj);
 		list_add(&lut->obj_link, &obj->lut_list);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index 0fd9b822b73b..4e8438555f01 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -125,12 +125,6 @@ void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj,
 		!(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_WRITE);
 }
 
-static void lut_handle_release(struct i915_lut_handle *lut)
-{
-	i915_gem_context_put(lut->ctx);
-	i915_lut_handle_free(lut);
-}
-
 void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
 {
 	struct drm_i915_gem_object *obj = to_intel_bo(gem);
@@ -139,20 +133,14 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
 	LIST_HEAD(close);
 
 	i915_gem_object_lock(obj);
-
 	list_for_each_entry_safe(lut, ln, &obj->lut_list, obj_link) {
 		struct i915_gem_context *ctx = lut->ctx;
 
-		/* prune any stale entries */
-		if (i915_gem_context_is_closed(ctx)) {
-			list_del(&lut->obj_link);
-			lut_handle_release(lut);
-			i915_gem_object_put(obj);
+		if (ctx->file_priv != fpriv)
 			continue;
-		}
 
-		if (ctx->file_priv == fpriv)
-			list_move(&lut->obj_link, &close);
+		i915_gem_context_get(ctx);
+		list_move(&lut->obj_link, &close);
 	}
 	i915_gem_object_unlock(obj);
 
@@ -160,20 +148,23 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
 		struct i915_gem_context *ctx = lut->ctx;
 		struct i915_vma *vma;
 
-		mutex_lock(&ctx->mutex);
 		/*
 		 * We allow the process to have multiple handles to the same
 		 * vma, in the same fd namespace, by virtue of flink/open.
 		 */
+
+		mutex_lock(&ctx->mutex);
 		vma = radix_tree_delete(&ctx->handles_vma, lut->handle);
 		if (vma) {
+			GEM_BUG_ON(vma->obj != obj);
 			GEM_BUG_ON(!vma->open_count);
 			if (!--vma->open_count && !i915_vma_is_ggtt(vma))
 				i915_vma_close(vma);
 		}
 		mutex_unlock(&ctx->mutex);
 
-		lut_handle_release(lut);
+		i915_gem_context_put(lut->ctx);
+		i915_lut_handle_free(lut);
 		i915_gem_object_put(obj);
 	}
 }
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list