[Intel-gfx] [PATCH 07/15] drm/i915: Move object close under its own lock
Matthew Auld
matthew.william.auld at gmail.com
Wed Jun 5 11:54:59 UTC 2019
On Mon, 3 Jun 2019 at 15:00, Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Use i915_gem_object_lock() to guard the LUT and active reference to
> allow us to break free of struct_mutex for handling GEM_CLOSE.
>
> Testcase: igt/gem_close_race
> Testcase: igt/gem_exec_parallel
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/gem/i915_gem_context.c | 75 ++++++++++---------
> .../gpu/drm/i915/gem/i915_gem_context_types.h | 12 +--
> .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 25 +++++--
> drivers/gpu/drm/i915/gem/i915_gem_object.c | 38 ++++++----
> .../gpu/drm/i915/gem/i915_gem_object_types.h | 1 -
> .../gpu/drm/i915/gem/selftests/mock_context.c | 1 -
> drivers/gpu/drm/i915/i915_drv.h | 4 +-
> drivers/gpu/drm/i915/i915_gem.c | 1 +
> drivers/gpu/drm/i915/i915_gem_gtt.c | 1 +
> drivers/gpu/drm/i915/i915_timeline.c | 13 ++--
> drivers/gpu/drm/i915/i915_vma.c | 42 +++++++----
> drivers/gpu/drm/i915/i915_vma.h | 17 ++---
> .../gpu/drm/i915/selftests/mock_gem_device.c | 1 +
> 13 files changed, 131 insertions(+), 100 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> index 08721ef62e4e..fb03a19932cf 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
> @@ -95,24 +95,40 @@ void i915_lut_handle_free(struct i915_lut_handle *lut)
>
> static void lut_close(struct i915_gem_context *ctx)
> {
> - struct i915_lut_handle *lut, *ln;
> struct radix_tree_iter iter;
> void __rcu **slot;
>
> - list_for_each_entry_safe(lut, ln, &ctx->handles_list, ctx_link) {
> - list_del(&lut->obj_link);
> - i915_lut_handle_free(lut);
> - }
> - INIT_LIST_HEAD(&ctx->handles_list);
> + lockdep_assert_held(&ctx->mutex);
>
> 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;
> +
> + rcu_read_unlock();
> + i915_gem_object_lock(obj);
> + list_for_each_entry(lut, &obj->lut_list, obj_link) {
> + if (lut->ctx != ctx)
> + continue;
>
> - radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
> + if (lut->handle != iter.index)
> + continue;
>
> - vma->open_count--;
> - i915_vma_put(vma);
> + list_del(&lut->obj_link);
> + break;
> + }
> + i915_gem_object_unlock(obj);
> + rcu_read_lock();
> +
> + if (&lut->obj_link != &obj->lut_list) {
So mean.
Fwiw,
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
More information about the Intel-gfx
mailing list