]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/i915: Convert handles_vma to XArray
authorMatthew Wilcox <willy@infradead.org>
Wed, 26 Sep 2018 15:11:14 +0000 (11:11 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 03:39:32 +0000 (23:39 -0400)
Straightforward conversion.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/gem/i915_gem_context_types.h
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
drivers/gpu/drm/i915/gem/i915_gem_object.c
drivers/gpu/drm/i915/gem/selftests/mock_context.c

index 0f2c22a3bcb6a20f615877a4cfdd4aa0ab202434..b69dfc9f2513792146cc41c275163266fa2375a0 100644 (file)
@@ -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
index cc513410eeef57791925df8bda3b752df8336468..41f79071278852dc3ecd9f0667aa87a8828a993b 100644 (file)
@@ -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__ */
index 5fae0e50aad06881a53bc70c708ceccb7cbfe7d7..af0f0eedf329831886863f1760f7af7692e50223 100644 (file)
@@ -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;
index be6caccce0c5e0fd31a441e34bc89833c290dd21..41fb6422ddc551f5a9700b327eb3717a3fedcc5c 100644 (file)
@@ -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));
index be8974ccff2418ab6074a96f36d7b05dbefc2383..c20ec28d272ddf86f9137661db9781c2a6486329 100644 (file)
@@ -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);