]> www.infradead.org Git - users/willy/xarray.git/commitdiff
drm/i915: Convert context_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Fri, 15 Feb 2019 19:03:41 +0000 (14:03 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 03:39:33 +0000 (23:39 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/gpu/drm/i915/gem/i915_gem_context.c
drivers/gpu/drm/i915/i915_drv.h

index b69dfc9f2513792146cc41c275163266fa2375a0..d93e319f88c0ab1d896306e4a315da4abb5af33c 100644 (file)
@@ -704,12 +704,6 @@ void i915_gem_contexts_fini(struct drm_i915_private *i915)
        ida_destroy(&i915->contexts.hw_ida);
 }
 
-static int context_idr_cleanup(int id, void *p, void *data)
-{
-       context_close(p);
-       return 0;
-}
-
 static int vm_idr_cleanup(int id, void *p, void *data)
 {
        i915_vm_put(p);
@@ -719,7 +713,7 @@ static int vm_idr_cleanup(int id, void *p, void *data)
 static int gem_context_register(struct i915_gem_context *ctx,
                                struct drm_i915_file_private *fpriv)
 {
-       int ret;
+       int ret, id;
 
        ctx->file_priv = fpriv;
        if (ctx->vm)
@@ -733,17 +727,14 @@ static int gem_context_register(struct i915_gem_context *ctx,
                goto err_pid;
        }
 
-       /* And finally expose ourselves to userspace via the idr */
-       mutex_lock(&fpriv->context_idr_lock);
-       ret = idr_alloc(&fpriv->context_idr, ctx, 0, 0, GFP_KERNEL);
-       mutex_unlock(&fpriv->context_idr_lock);
-       if (ret >= 0)
-               goto out;
+       /* And finally expose ourselves to userspace */
+       ret = xa_alloc(&fpriv->contexts, &id, ctx, xa_limit_31b, GFP_KERNEL);
+       if (!ret)
+               return id;
 
        kfree(fetch_and_zero(&ctx->name));
 err_pid:
        put_pid(fetch_and_zero(&ctx->pid));
-out:
        return ret;
 }
 
@@ -754,10 +745,9 @@ int i915_gem_context_open(struct drm_i915_private *i915,
        struct i915_gem_context *ctx;
        int err;
 
-       mutex_init(&file_priv->context_idr_lock);
        mutex_init(&file_priv->vm_idr_lock);
 
-       idr_init(&file_priv->context_idr);
+       xa_init_flags(&file_priv->contexts, XA_FLAGS_ALLOC);
        idr_init_base(&file_priv->vm_idr, 1);
 
        mutex_lock(&i915->drm.struct_mutex);
@@ -781,19 +771,20 @@ err_ctx:
        context_close(ctx);
 err:
        idr_destroy(&file_priv->vm_idr);
-       idr_destroy(&file_priv->context_idr);
+       xa_destroy(&file_priv->contexts);
        mutex_destroy(&file_priv->vm_idr_lock);
-       mutex_destroy(&file_priv->context_idr_lock);
        return err;
 }
 
 void i915_gem_context_close(struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
+       struct i915_gem_context *ctx;
+       unsigned long index;
 
-       idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);
-       idr_destroy(&file_priv->context_idr);
-       mutex_destroy(&file_priv->context_idr_lock);
+       xa_for_each(&file_priv->contexts, index, ctx)
+               context_close(ctx);
+       xa_destroy(&file_priv->contexts);
 
        idr_for_each(&file_priv->vm_idr, vm_idr_cleanup, NULL);
        idr_destroy(&file_priv->vm_idr);
@@ -2197,11 +2188,7 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
        if (!args->ctx_id)
                return -ENOENT;
 
-       if (mutex_lock_interruptible(&file_priv->context_idr_lock))
-               return -EINTR;
-
-       ctx = idr_remove(&file_priv->context_idr, args->ctx_id);
-       mutex_unlock(&file_priv->context_idr_lock);
+       ctx = xa_erase(&file_priv->contexts, args->ctx_id);
        if (!ctx)
                return -ENOENT;
 
index 4998250bb2aaa15722e278dd6da3dae072068197..d84239cfd2bbfd19b323c08399b490a4813ae295 100644 (file)
@@ -218,8 +218,7 @@ struct drm_i915_file_private {
                struct list_head request_list;
        } mm;
 
-       struct idr context_idr;
-       struct mutex context_idr_lock; /* guards context_idr */
+       struct xarray contexts;
 
        struct idr vm_idr;
        struct mutex vm_idr_lock; /* guards vm_idr */
@@ -2599,7 +2598,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
 static inline struct i915_gem_context *
 __i915_gem_context_lookup_rcu(struct drm_i915_file_private *file_priv, u32 id)
 {
-       return idr_find(&file_priv->context_idr, id);
+       return xa_load(&file_priv->contexts, id);
 }
 
 static inline struct i915_gem_context *