From: Matthew Wilcox Date: Wed, 26 Sep 2018 15:11:14 +0000 (-0400) Subject: drm/i915: Convert handles_vma to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=83918ebe7cac04044f18f2aa953a2389cb3a7792;p=users%2Fwilly%2Fxarray.git drm/i915: Convert handles_vma to XArray Straightforward conversion. Signed-off-by: Matthew Wilcox --- diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c index 0f2c22a3bcb6a..b69dfc9f25137 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c @@ -95,14 +95,13 @@ void i915_lut_handle_free(struct i915_lut_handle *lut) static void lut_close(struct i915_gem_context *ctx) { - struct radix_tree_iter iter; - void __rcu **slot; + XA_STATE(xas, &ctx->handles_vma, 0); + struct i915_vma *vma; 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); + xas_for_each(&xas, vma, ULONG_MAX) { struct drm_i915_gem_object *obj = vma->obj; struct i915_lut_handle *lut; @@ -115,7 +114,7 @@ static void lut_close(struct i915_gem_context *ctx) if (lut->ctx != ctx) continue; - if (lut->handle != iter.index) + if (lut->handle != xas.xa_index) continue; list_del(&lut->obj_link); @@ -126,7 +125,7 @@ static void lut_close(struct i915_gem_context *ctx) if (&lut->obj_link != &obj->lut_list) { i915_lut_handle_free(lut); - radix_tree_iter_delete(&ctx->handles_vma, &iter, slot); + xas_store(&xas, NULL); if (atomic_dec_and_test(&vma->open_count) && !i915_vma_is_ggtt(vma)) i915_vma_close(vma); @@ -447,7 +446,7 @@ __create_context(struct drm_i915_private *i915) } RCU_INIT_POINTER(ctx->engines, e); - INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL); + xa_init(&ctx->handles_vma); INIT_LIST_HEAD(&ctx->hw_id_link); /* NB: Mark all slices as needing a remap so that when the context first 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 cc513410eeef5..41f7907127885 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h @@ -192,11 +192,11 @@ struct i915_gem_context { u8 remap_slice; /** - * 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) + * handles_vma: map user_handle to our context specific obj/vma. + * User handles are per fd, but the binding is per vm, which may + * be one per context or shared with the global GTT. */ - struct radix_tree_root handles_vma; + struct xarray handles_vma; }; #endif /* __I915_GEM_CONTEXT_TYPES_H__ */ diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c index 5fae0e50aad06..af0f0eedf3298 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -797,7 +797,7 @@ static int eb_wait_for_ring(const struct i915_execbuffer *eb) static int eb_lookup_vmas(struct i915_execbuffer *eb) { - struct radix_tree_root *handles_vma = &eb->gem_context->handles_vma; + struct xarray *handles_vma = &eb->gem_context->handles_vma; struct drm_i915_gem_object *obj; unsigned int i, batch; int err; @@ -821,7 +821,7 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb) struct i915_lut_handle *lut; struct i915_vma *vma; - vma = radix_tree_lookup(handles_vma, handle); + vma = xa_load(handles_vma, handle); if (likely(vma)) goto add_vma; @@ -843,7 +843,7 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb) goto err_obj; } - err = radix_tree_insert(handles_vma, handle, vma); + err = xa_err(xa_store(handles_vma, handle, vma, GFP_KERNEL)); if (unlikely(err)) { i915_lut_handle_free(lut); goto err_obj; diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c index be6caccce0c5e..41fb6422ddc55 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c @@ -130,7 +130,7 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file) */ mutex_lock(&ctx->mutex); - vma = radix_tree_delete(&ctx->handles_vma, lut->handle); + vma = xa_erase(&ctx->handles_vma, lut->handle); if (vma) { GEM_BUG_ON(vma->obj != obj); GEM_BUG_ON(!atomic_read(&vma->open_count)); diff --git a/drivers/gpu/drm/i915/gem/selftests/mock_context.c b/drivers/gpu/drm/i915/gem/selftests/mock_context.c index be8974ccff241..c20ec28d272dd 100644 --- a/drivers/gpu/drm/i915/gem/selftests/mock_context.c +++ b/drivers/gpu/drm/i915/gem/selftests/mock_context.c @@ -29,7 +29,7 @@ mock_context(struct drm_i915_private *i915, goto err_free; RCU_INIT_POINTER(ctx->engines, e); - INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL); + xa_init(&ctx->handles_vma); INIT_LIST_HEAD(&ctx->hw_id_link); mutex_init(&ctx->mutex);