[PATCH 47/47] smoke
Chris Wilson
chris at chris-wilson.co.uk
Sun Mar 31 16:01:13 UTC 2019
---
drivers/gpu/drm/i915/gem/i915_gem_context.c | 26 ++++++++++++++++---
.../gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +-
drivers/gpu/drm/i915/gem/i915_gem_object.c | 24 +++++------------
3 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index 73113e7930ca..64bc60e060c6 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -106,9 +106,28 @@ 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;
+
+ list_del(&lut->obj_link);
+ found = true;
+ break;
+ }
+ i915_gem_object_unlock(obj);
+ rcu_read_lock();
- radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
- vma->open_count--;
+ if (found) {
+ radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
+ if (!--vma->open_count && !i915_vma_is_ggtt(vma))
+ i915_vma_close(vma);
+ }
}
rcu_read_unlock();
}
@@ -344,6 +363,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
@@ -358,8 +378,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_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..ca1ac5e917ea 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,11 +148,12 @@ 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->open_count);
@@ -173,7 +162,8 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
}
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