[Intel-xe] [PATCH] drm/xe: Fix vm refcount races

Matthew Brost matthew.brost at intel.com
Thu May 25 21:35:09 UTC 2023


On Thu, May 25, 2023 at 09:41:44AM +0200, Thomas Hellström wrote:
> Fix a race in xe_vm_lookup() where the vm could disappear after
> the lookup mutex unlock but before the get. The xe_vm_get() call
> must be inside the lookup mutex.
> 
> Also fix a vm close race where multiple callers could potentially
> succeed in calling xe_vm_close_and_put().
> 
> Reported-by: Oded Gabbay <ogabbay at kernel.org>
> Link: https://lists.freedesktop.org/archives/intel-xe/2023-May/004704.html
> Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>

Reviewed-by: Matthew Brost <matthew.brost at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_vm.c | 26 ++++++++++++--------------
>  1 file changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index a0306526b269..ac25afac89fd 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -1463,10 +1463,9 @@ struct xe_vm *xe_vm_lookup(struct xe_file *xef, u32 id)
>  
>  	mutex_lock(&xef->vm.lock);
>  	vm = xa_load(&xef->vm.xa, id);
> -	mutex_unlock(&xef->vm.lock);
> -
>  	if (vm)
>  		xe_vm_get(vm);
> +	mutex_unlock(&xef->vm.lock);
>  
>  	return vm;
>  }
> @@ -1940,26 +1939,25 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
>  	struct xe_file *xef = to_xe_file(file);
>  	struct drm_xe_vm_destroy *args = data;
>  	struct xe_vm *vm;
> +	int err = 0;
>  
>  	if (XE_IOCTL_ERR(xe, args->pad))
>  		return -EINVAL;
>  
> -	vm = xe_vm_lookup(xef, args->vm_id);
> -	if (XE_IOCTL_ERR(xe, !vm))
> -		return -ENOENT;
> -	xe_vm_put(vm);
> -
> -	/* FIXME: Extend this check to non-compute mode VMs */
> -	if (XE_IOCTL_ERR(xe, vm->preempt.num_engines))
> -		return -EBUSY;
> -
>  	mutex_lock(&xef->vm.lock);
> -	xa_erase(&xef->vm.xa, args->vm_id);
> +	vm = xa_load(&xef->vm.xa, args->vm_id);
> +	if (XE_IOCTL_ERR(xe, !vm))
> +		err = -ENOENT;
> +	else if (XE_IOCTL_ERR(xe, vm->preempt.num_engines))
> +		err = -EBUSY;
> +	else
> +		xa_erase(&xef->vm.xa, args->vm_id);
>  	mutex_unlock(&xef->vm.lock);
>  
> -	xe_vm_close_and_put(vm);
> +	if (!err)
> +		xe_vm_close_and_put(vm);
>  
> -	return 0;
> +	return err;
>  }
>  
>  static const u32 region_to_mem_type[] = {
> -- 
> 2.39.2
> 


More information about the Intel-xe mailing list