[Intel-gfx] [CI] drm/i915/gem: Convert vm idr to xarray

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Jan 22 16:36:00 UTC 2020


On 22/01/2020 16:15, Chris Wilson wrote:
> Replace the vm_idr + vm_idr_mutex to an XArray. The XArray data
> structure is now used to implement IDRs, and provides its own locking.
> 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>
> Reviewed-by: Michael J. Ruhl <michael.j.ruhl at intel.com>

Acked-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko

> ---
>   drivers/gpu/drm/i915/gem/i915_gem_context.c | 77 +++++++--------------
>   drivers/gpu/drm/i915/i915_drv.h             |  4 +-
>   2 files changed, 25 insertions(+), 56 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..5d4157e1ccf7 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)
> @@ -804,8 +798,8 @@ int i915_gem_context_open(struct drm_i915_private *i915,
>   
>   	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);
> +	/* 0 reserved for invalid/unassigned ppgtt */
> +	xa_init_flags(&file_priv->vm_xa, XA_FLAGS_ALLOC1);
>   
>   	ctx = i915_gem_create_context(i915, 0);
>   	if (IS_ERR(ctx)) {
> @@ -823,9 +817,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 +826,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 +834,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);
>   }
> @@ -854,6 +848,7 @@ int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,
>   	struct drm_i915_gem_vm_control *args = data;
>   	struct drm_i915_file_private *file_priv = file->driver_priv;
>   	struct i915_ppgtt *ppgtt;
> +	u32 id;
>   	int err;
>   
>   	if (!HAS_FULL_PPGTT(i915))
> @@ -876,23 +871,15 @@ 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, &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 */
> -
> -	mutex_unlock(&file_priv->vm_idr_lock);
> -
> -	args->vm_id = err;
> +	GEM_BUG_ON(id == 0); /* reserved for invalid/unassigned ppgtt */
> +	args->vm_id = id;
>   	return 0;
>   
> -err_unlock:
> -	mutex_unlock(&file_priv->vm_idr_lock);
>   err_put:
>   	i915_vm_put(&ppgtt->vm);
>   	return err;
> @@ -904,8 +891,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 +898,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 +996,31 @@ 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;
> +	u32 id;
>   
>   	if (!rcu_access_pointer(ctx->vm))
>   		return -ENODEV;
>   
> +	err = -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();
> -
> -	ret = mutex_lock_interruptible(&file_priv->vm_idr_lock);
> -	if (ret)
> +	if (err)
>   		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);
>   
> +	GEM_BUG_ON(id == 0); /* reserved for invalid/unassigned ppgtt */
> +	args->value = id;
>   	args->size = 0;
> -	args->value = ret;
>   
> -	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 +1122,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;
>   
> 


More information about the Intel-gfx mailing list