[Intel-gfx] [PATCH 4/5] drm/i915/gem: Convert vm idr to xarray

Ruhl, Michael J michael.j.ruhl at intel.com
Wed Jan 22 16:00:25 UTC 2020


>-----Original Message-----
>From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Chris
>Wilson
>Sent: Monday, January 20, 2020 5:49 AM
>To: intel-gfx at lists.freedesktop.org
>Cc: Auld, Matthew <matthew.auld at intel.com>
>Subject: [Intel-gfx] [PATCH 4/5] drm/i915/gem: Convert vm idr to xarray
>
>Replace the vm_idr + vm_idr_mutex to an XArray. The XArray data
>structure is now used to implement IDRs, and provides its won locking.

s/won/own

>We can simply remove the IDR wrapper and in the process also remove our
>extra mutex.
>
>Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>---
> drivers/gpu/drm/i915/gem/i915_gem_context.c | 80 ++++++---------------
> drivers/gpu/drm/i915/i915_drv.h             |  4 +-
> 2 files changed, 22 insertions(+), 62 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c
>b/drivers/gpu/drm/i915/gem/i915_gem_context.c
>index a2e57e62af30..d2e4e8cbf4d4 100644
>--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
>+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
>@@ -761,12 +761,6 @@ void i915_gem_driver_release__contexts(struct
>drm_i915_private *i915)
> 	flush_work(&i915->gem.contexts.free_work);
> }
>
>-static int vm_idr_cleanup(int id, void *p, void *data)
>-{
>-	i915_vm_put(p);
>-	return 0;
>-}
>-
> static int gem_context_register(struct i915_gem_context *ctx,
> 				struct drm_i915_file_private *fpriv,
> 				u32 *id)
>@@ -803,9 +797,7 @@ int i915_gem_context_open(struct drm_i915_private
>*i915,
> 	u32 id;
>
> 	xa_init_flags(&file_priv->context_xa, XA_FLAGS_ALLOC);
>-
>-	mutex_init(&file_priv->vm_idr_lock);
>-	idr_init_base(&file_priv->vm_idr, 1);
>+	xa_init_flags(&file_priv->vm_xa, XA_FLAGS_ALLOC1);
>
> 	ctx = i915_gem_create_context(i915, 0);
> 	if (IS_ERR(ctx)) {
>@@ -823,9 +815,8 @@ int i915_gem_context_open(struct drm_i915_private
>*i915,
> err_ctx:
> 	context_close(ctx);
> err:
>-	idr_destroy(&file_priv->vm_idr);
>+	xa_destroy(&file_priv->vm_xa);
> 	xa_destroy(&file_priv->context_xa);
>-	mutex_destroy(&file_priv->vm_idr_lock);
> 	return err;
> }
>
>@@ -833,6 +824,7 @@ void i915_gem_context_close(struct drm_file *file)
> {
> 	struct drm_i915_file_private *file_priv = file->driver_priv;
> 	struct drm_i915_private *i915 = file_priv->dev_priv;
>+	struct i915_address_space *vm;
> 	struct i915_gem_context *ctx;
> 	unsigned long idx;
>
>@@ -840,9 +832,9 @@ void i915_gem_context_close(struct drm_file *file)
> 		context_close(ctx);
> 	xa_destroy(&file_priv->context_xa);
>
>-	idr_for_each(&file_priv->vm_idr, vm_idr_cleanup, NULL);
>-	idr_destroy(&file_priv->vm_idr);
>-	mutex_destroy(&file_priv->vm_idr_lock);
>+	xa_for_each(&file_priv->vm_xa, idx, vm)
>+		i915_vm_put(vm);
>+	xa_destroy(&file_priv->vm_xa);
>
> 	contexts_flush_free(&i915->gem.contexts);
> }
>@@ -876,23 +868,13 @@ int i915_gem_vm_create_ioctl(struct drm_device
>*dev, void *data,
> 			goto err_put;
> 	}
>
>-	err = mutex_lock_interruptible(&file_priv->vm_idr_lock);
>+	err = xa_alloc(&file_priv->vm_xa, &args->vm_id,
>+		       &ppgtt->vm, xa_limit_32b, GFP_KERNEL);
> 	if (err)
> 		goto err_put;
>
>-	err = idr_alloc(&file_priv->vm_idr, &ppgtt->vm, 0, 0, GFP_KERNEL);
>-	if (err < 0)
>-		goto err_unlock;
>-
>-	GEM_BUG_ON(err == 0); /* reserved for invalid/unassigned ppgtt */

Moving this comment to the xa_init_flags() would help me understand
why the index started at 1.

>-	mutex_unlock(&file_priv->vm_idr_lock);
>-
>-	args->vm_id = err;
> 	return 0;
>
>-err_unlock:
>-	mutex_unlock(&file_priv->vm_idr_lock);
> err_put:
> 	i915_vm_put(&ppgtt->vm);
> 	return err;
>@@ -904,8 +886,6 @@ int i915_gem_vm_destroy_ioctl(struct drm_device
>*dev, void *data,
> 	struct drm_i915_file_private *file_priv = file->driver_priv;
> 	struct drm_i915_gem_vm_control *args = data;
> 	struct i915_address_space *vm;
>-	int err;
>-	u32 id;
>
> 	if (args->flags)
> 		return -EINVAL;
>@@ -913,17 +893,7 @@ int i915_gem_vm_destroy_ioctl(struct drm_device
>*dev, void *data,
> 	if (args->extensions)
> 		return -EINVAL;
>
>-	id = args->vm_id;
>-	if (!id)
>-		return -ENOENT;
>-
>-	err = mutex_lock_interruptible(&file_priv->vm_idr_lock);
>-	if (err)
>-		return err;
>-
>-	vm = idr_remove(&file_priv->vm_idr, id);
>-
>-	mutex_unlock(&file_priv->vm_idr_lock);
>+	vm = xa_erase(&file_priv->vm_xa, args->vm_id);
> 	if (!vm)
> 		return -ENOENT;
>
>@@ -1021,35 +991,27 @@ static int get_ppgtt(struct drm_i915_file_private
>*file_priv,
> 		     struct drm_i915_gem_context_param *args)
> {
> 	struct i915_address_space *vm;
>-	int ret;
>+	int err = -ENODEV;
>+	u32 id;
>
> 	if (!rcu_access_pointer(ctx->vm))
> 		return -ENODEV;
>
> 	rcu_read_lock();
> 	vm = context_get_vm_rcu(ctx);
>+	if (vm)
>+		err = xa_alloc(&file_priv->vm_xa, &id, vm,
>+			       xa_limit_32b, GFP_KERNEL);
> 	rcu_read_unlock();
>+	if (!err) {
>+		i915_vm_open(vm);

Why did you switch to success path in the if here?

Can you do:

if (err)
	goto err_put;

?

>-	ret = mutex_lock_interruptible(&file_priv->vm_idr_lock);
>-	if (ret)
>-		goto err_put;
>-
>-	ret = idr_alloc(&file_priv->vm_idr, vm, 0, 0, GFP_KERNEL);
>-	GEM_BUG_ON(!ret);
>-	if (ret < 0)
>-		goto err_unlock;
>-
>-	i915_vm_open(vm);
>-
>-	args->size = 0;
>-	args->value = ret;
>+		args->size = 0;
>+		args->value = id;

Would passing args->value to the xa_alloc be a useful?

Nice clean up.

Reviewed-by: Michael J. Ruhl <michael.j.ruhl at intel.com>

Mike


>+	}
>
>-	ret = 0;
>-err_unlock:
>-	mutex_unlock(&file_priv->vm_idr_lock);
>-err_put:
> 	i915_vm_put(vm);
>-	return ret;
>+	return err;
> }
>
> static void set_ppgtt_barrier(void *data)
>@@ -1151,7 +1113,7 @@ static int set_ppgtt(struct drm_i915_file_private
>*file_priv,
> 		return -ENOENT;
>
> 	rcu_read_lock();
>-	vm = idr_find(&file_priv->vm_idr, args->value);
>+	vm = xa_load(&file_priv->vm_xa, args->value);
> 	if (vm && !kref_get_unless_zero(&vm->ref))
> 		vm = NULL;
> 	rcu_read_unlock();
>diff --git a/drivers/gpu/drm/i915/i915_drv.h
>b/drivers/gpu/drm/i915/i915_drv.h
>index 077af22b8340..50abf9113b2f 100644
>--- a/drivers/gpu/drm/i915/i915_drv.h
>+++ b/drivers/gpu/drm/i915/i915_drv.h
>@@ -203,9 +203,7 @@ struct drm_i915_file_private {
> 	} mm;
>
> 	struct xarray context_xa;
>-
>-	struct idr vm_idr;
>-	struct mutex vm_idr_lock; /* guards vm_idr */
>+	struct xarray vm_xa;
>
> 	unsigned int bsd_engine;
>
>--
>2.25.0
>
>_______________________________________________
>Intel-gfx mailing list
>Intel-gfx at lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list