[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