Signed-off-by: Matthew Wilcox <wi...@infradead.org>
---
 drivers/gpu/drm/i915/i915_debugfs.c     | 32 ++++++++++++-------------
 drivers/gpu/drm/i915/i915_drv.h         |  4 ++--
 drivers/gpu/drm/i915/i915_gem_context.c | 31 ++++++++++--------------
 3 files changed, 30 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 030263870ba6..4981d1f6e7a5 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -376,9 +376,9 @@ static void print_batch_pool_stats(struct seq_file *m,
        print_file_stats(m, "[k]batch pool", stats);
 }
 
-static int per_file_ctx_stats(int idx, void *ptr, void *data)
+static void per_file_ctx_stats(struct i915_gem_context *ctx,
+               struct file_stats *stats)
 {
-       struct i915_gem_context *ctx = ptr;
        struct intel_engine_cs *engine;
        enum intel_engine_id id;
 
@@ -386,12 +386,10 @@ static int per_file_ctx_stats(int idx, void *ptr, void 
*data)
                struct intel_context *ce = to_intel_context(ctx, engine);
 
                if (ce->state)
-                       per_file_stats(ce->state->obj, data);
+                       per_file_stats(ce->state->obj, stats);
                if (ce->ring)
-                       per_file_stats(ce->ring->vma->obj, data);
+                       per_file_stats(ce->ring->vma->obj, stats);
        }
-
-       return 0;
 }
 
 static void print_context_stats(struct seq_file *m,
@@ -405,11 +403,15 @@ static void print_context_stats(struct seq_file *m,
 
        mutex_lock(&dev->struct_mutex);
        if (dev_priv->kernel_context)
-               per_file_ctx_stats(0, dev_priv->kernel_context, &stats);
+               per_file_ctx_stats(dev_priv->kernel_context, &stats);
 
        list_for_each_entry(file, &dev->filelist, lhead) {
                struct drm_i915_file_private *fpriv = file->driver_priv;
-               idr_for_each(&fpriv->context_idr, per_file_ctx_stats, &stats);
+               struct i915_gem_context *ctx;
+               unsigned long index;
+
+               xa_for_each(&fpriv->contexts, index, ctx)
+                       per_file_ctx_stats(ctx, &stats);
        }
        mutex_unlock(&dev->struct_mutex);
 
@@ -2078,16 +2080,14 @@ static int i915_swizzle_info(struct seq_file *m, void 
*data)
        return 0;
 }
 
-static int per_file_ctx(int id, void *ptr, void *data)
+static void per_file_ctx(struct i915_gem_context *ctx, struct seq_file *m)
 {
-       struct i915_gem_context *ctx = ptr;
-       struct seq_file *m = data;
        struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
 
        if (!ppgtt) {
                seq_printf(m, "  no ppgtt for context %d\n",
                           ctx->user_handle);
-               return 0;
+               return;
        }
 
        if (i915_gem_context_is_default(ctx))
@@ -2095,8 +2095,6 @@ static int per_file_ctx(int id, void *ptr, void *data)
        else
                seq_printf(m, "  context %d:\n", ctx->user_handle);
        ppgtt->debug_dump(ppgtt, m);
-
-       return 0;
 }
 
 static void gen8_ppgtt_info(struct seq_file *m,
@@ -2176,6 +2174,8 @@ static int i915_ppgtt_info(struct seq_file *m, void *data)
        list_for_each_entry_reverse(file, &dev->filelist, lhead) {
                struct drm_i915_file_private *file_priv = file->driver_priv;
                struct task_struct *task;
+               struct i915_gem_context *ctx;
+               unsigned long index;
 
                task = get_pid_task(file->pid, PIDTYPE_PID);
                if (!task) {
@@ -2184,8 +2184,8 @@ static int i915_ppgtt_info(struct seq_file *m, void *data)
                }
                seq_printf(m, "\nproc: %s\n", task->comm);
                put_task_struct(task);
-               idr_for_each(&file_priv->context_idr, per_file_ctx,
-                            (void *)(unsigned long)m);
+               xa_for_each(&file_priv->contexts, index, ctx)
+                       per_file_ctx(ctx, m);
        }
 
 out_rpm:
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 4b5ce517cbcf..1b7663258f42 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -213,7 +213,7 @@ struct drm_i915_file_private {
  */
 #define DRM_I915_THROTTLE_JIFFIES msecs_to_jiffies(20)
        } mm;
-       struct idr context_idr;
+       struct xarray contexts;
 
        struct intel_rps_client {
                atomic_t boosts;
@@ -3118,7 +3118,7 @@ void i915_gem_object_save_bit_17_swizzle(struct 
drm_i915_gem_object *obj,
 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 *
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 9db04b2e65cf..033a6fd72e40 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -350,12 +350,12 @@ __create_hw_context(struct drm_i915_private *dev_priv,
        /* Default context will never have a file_priv */
        ret = DEFAULT_CONTEXT_HANDLE;
        if (file_priv) {
-               ret = idr_alloc(&file_priv->context_idr, ctx,
-                               DEFAULT_CONTEXT_HANDLE, 0, GFP_KERNEL);
+               ret = xa_alloc(&file_priv->contexts, &ctx->user_handle, ctx,
+                               XA_LIMIT(DEFAULT_CONTEXT_HANDLE, UINT_MAX),
+                               GFP_KERNEL);
                if (ret < 0)
                        goto err_lut;
        }
-       ctx->user_handle = ret;
 
        ctx->file_priv = file_priv;
        if (file_priv) {
@@ -384,7 +384,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
 
 err_pid:
        put_pid(ctx->pid);
-       idr_remove(&file_priv->context_idr, ctx->user_handle);
+       xa_erase(&file_priv->contexts, ctx->user_handle);
 err_lut:
        context_close(ctx);
        return ERR_PTR(ret);
@@ -393,7 +393,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
 static void __destroy_hw_context(struct i915_gem_context *ctx,
                                 struct drm_i915_file_private *file_priv)
 {
-       idr_remove(&file_priv->context_idr, ctx->user_handle);
+       xa_erase(&file_priv->contexts, ctx->user_handle);
        context_close(ctx);
 }
 
@@ -597,29 +597,19 @@ 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)
-{
-       struct i915_gem_context *ctx = p;
-
-       context_close(ctx);
-       return 0;
-}
-
 int i915_gem_context_open(struct drm_i915_private *i915,
                          struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
        struct i915_gem_context *ctx;
 
-       idr_init(&file_priv->context_idr);
+       xa_init_flags(&file_priv->contexts, XA_FLAGS_ALLOC);
 
        mutex_lock(&i915->drm.struct_mutex);
        ctx = i915_gem_create_context(i915, file_priv);
        mutex_unlock(&i915->drm.struct_mutex);
-       if (IS_ERR(ctx)) {
-               idr_destroy(&file_priv->context_idr);
+       if (IS_ERR(ctx))
                return PTR_ERR(ctx);
-       }
 
        GEM_BUG_ON(i915_gem_context_is_kernel(ctx));
 
@@ -629,11 +619,14 @@ int i915_gem_context_open(struct drm_i915_private *i915,
 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;
 
        lockdep_assert_held(&file_priv->dev_priv->drm.struct_mutex);
 
-       idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);
-       idr_destroy(&file_priv->context_idr);
+       xa_for_each(&file_priv->contexts, index, ctx)
+               context_close(ctx);
+       xa_destroy(&file_priv->contexts);
 }
 
 static struct i915_request *
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to