[PATCH 2/5] drm/radeon: add userptr flag to limit it to anonymous memory v2

Jerome Glisse j.glisse at gmail.com
Tue Aug 5 10:39:33 PDT 2014


On Tue, Aug 05, 2014 at 06:05:29PM +0200, Christian König wrote:
> From: Christian König <christian.koenig at amd.com>
> 
> Avoid problems with writeback by limiting userptr to anonymous memory.
> 
> v2: add commit and code comments

I guess, i have not expressed myself clearly. This is bogus, you pretend
you want to avoid writeback issue but you still allow userspace to map
file backed pages (which by the way might be a regular bo object from
another device for instance and that would be fun).

So this patch is a no go and i would rather see that this userptr to
be restricted to anon vma only no matter what. No flags here.

Cheers,
Jérôme

> 
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/radeon/radeon_gem.c |  3 ++-
>  drivers/gpu/drm/radeon/radeon_ttm.c | 10 ++++++++++
>  include/uapi/drm/radeon_drm.h       |  1 +
>  3 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index 993ab22..032736b 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -290,7 +290,8 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data,
>  		return -EACCES;
>  
>  	/* reject unknown flag values */
> -	if (args->flags & ~RADEON_GEM_USERPTR_READONLY)
> +	if (args->flags & ~(RADEON_GEM_USERPTR_READONLY |
> +	    RADEON_GEM_USERPTR_ANONONLY))
>  		return -EINVAL;
>  
>  	/* readonly pages not tested on older hardware */
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index 0109090..54eb7bc 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -542,6 +542,16 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm)
>  		       ttm->num_pages * PAGE_SIZE))
>  		return -EFAULT;
>  
> +	if (gtt->userflags & RADEON_GEM_USERPTR_ANONONLY) {
> +		/* check that we only pin down anonymous memory
> +		   to prevent problems with writeback */
> +		unsigned long end = gtt->userptr + ttm->num_pages * PAGE_SIZE;
> +		struct vm_area_struct *vma;
> +		vma = find_vma(gtt->usermm, gtt->userptr);
> +		if (!vma || vma->vm_file || vma->vm_end < end)
> +			return -EPERM;
> +	}
> +
>  	do {
>  		unsigned num_pages = ttm->num_pages - pinned;
>  		uint64_t userptr = gtt->userptr + pinned * PAGE_SIZE;
> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
> index 3a9f209..9720e1a 100644
> --- a/include/uapi/drm/radeon_drm.h
> +++ b/include/uapi/drm/radeon_drm.h
> @@ -816,6 +816,7 @@ struct drm_radeon_gem_create {
>   * perform any operation.
>   */
>  #define RADEON_GEM_USERPTR_READONLY	(1 << 0)
> +#define RADEON_GEM_USERPTR_ANONONLY	(1 << 1)
>  
>  struct drm_radeon_gem_userptr {
>  	uint64_t		addr;
> -- 
> 1.9.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list