[Intel-gfx] [PATCH 24/29] drm/i915: Allow multiple user handles to the same VM

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Apr 12 07:21:17 UTC 2019


On 08/04/2019 10:17, Chris Wilson wrote:
> It was noted that we made the same mistake for VM_ID as for object
> handles, whereby we ensured that we only allocated a single handle for
> one ppgtt. This has the unfortunate consequence for userspace that they
> need to reference count the handles to avoid destroying an active ID. If
> we allow multiple handles to the same ppgtt, userspace can freely
> unreference any handle they own without fear of destroying the same
> handle in use elsewhere.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/i915_gem_context.c | 26 ++++++++-----------------
>   drivers/gpu/drm/i915/i915_gem_gtt.h     |  2 --
>   2 files changed, 8 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index c05f949ed893..2a30cab7a65d 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -837,8 +837,7 @@ int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,
>   	if (err < 0)
>   		goto err_unlock;
>   
> -	GEM_BUG_ON(err == 0); /* reserved for default/unassigned ppgtt */
> -	ppgtt->user_handle = err;
> +	GEM_BUG_ON(err == 0); /* reserved for invalid/unassigned ppgtt */
>   
>   	mutex_unlock(&file_priv->vm_idr_lock);
>   
> @@ -876,10 +875,6 @@ int i915_gem_vm_destroy_ioctl(struct drm_device *dev, void *data,
>   		return err;
>   
>   	ppgtt = idr_remove(&file_priv->vm_idr, id);
> -	if (ppgtt) {
> -		GEM_BUG_ON(ppgtt->user_handle != id);
> -		ppgtt->user_handle = 0;
> -	}
>   
>   	mutex_unlock(&file_priv->vm_idr_lock);
>   	if (!ppgtt)
> @@ -1001,18 +996,15 @@ static int get_ppgtt(struct drm_i915_file_private *file_priv,
>   	if (ret)
>   		goto err_put;
>   
> -	if (!ppgtt->user_handle) {
> -		ret = idr_alloc(&file_priv->vm_idr, ppgtt, 0, 0, GFP_KERNEL);
> -		GEM_BUG_ON(!ret);
> -		if (ret < 0)
> -			goto err_unlock;
> +	ret = idr_alloc(&file_priv->vm_idr, ppgtt, 0, 0, GFP_KERNEL);
> +	GEM_BUG_ON(!ret);
> +	if (ret < 0)
> +		goto err_unlock;
>   
> -		ppgtt->user_handle = ret;
> -		i915_ppgtt_get(ppgtt);
> -	}
> +	i915_ppgtt_get(ppgtt);
>   
>   	args->size = 0;
> -	args->value = ppgtt->user_handle;
> +	args->value = ret;
>   
>   	ret = 0;
>   err_unlock:
> @@ -1103,10 +1095,8 @@ static int set_ppgtt(struct drm_i915_file_private *file_priv,
>   		return err;
>   
>   	ppgtt = idr_find(&file_priv->vm_idr, args->value);
> -	if (ppgtt) {
> -		GEM_BUG_ON(ppgtt->user_handle != args->value);
> +	if (ppgtt)
>   		i915_ppgtt_get(ppgtt);
> -	}
>   	mutex_unlock(&file_priv->vm_idr_lock);
>   	if (!ppgtt)
>   		return -ENOENT;
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index c8d96e91f3dc..4832bb5c5fc0 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -396,8 +396,6 @@ struct i915_hw_ppgtt {
>   		struct i915_page_directory_pointer pdp;	/* GEN8+ */
>   		struct i915_page_directory pd;		/* GEN6-7 */
>   	};
> -
> -	u32 user_handle;
>   };
>   
>   struct gen6_hw_ppgtt {
> 

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

Regards,

Tvrtko


More information about the Intel-gfx mailing list