diff mbox

[v12,1/2] kernel.h: add u64_to_user_ptr()

Message ID 1461253130-9266-2-git-send-email-gustavo@padovan.org (mailing list archive)
State New, archived
Headers show

Commit Message

Gustavo Padovan April 21, 2016, 3:38 p.m. UTC
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

This function had copies in 3 different files. Unify them in kernel.h.

Cc: Joe Perches <joe@perches.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Rob Clark <robdclark@gmail.com>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

---
v2: add typecheck() (comment from Maarten Lankhorst)

v3: make u64_to_user_ptr() a macro (comment from Joe Perches)
---
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 11 +++--------
 drivers/gpu/drm/i915/i915_drv.h              |  5 -----
 drivers/gpu/drm/i915/i915_gem.c              | 14 +++++++-------
 drivers/gpu/drm/i915/i915_gem_execbuffer.c   | 14 +++++++-------
 drivers/gpu/drm/msm/msm_gem_submit.c         | 11 +++--------
 include/linux/kernel.h                       |  7 +++++++
 6 files changed, 27 insertions(+), 35 deletions(-)

Comments

Daniel Vetter April 22, 2016, 8:31 a.m. UTC | #1
On Thu, Apr 21, 2016 at 12:38:49PM -0300, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> 
> This function had copies in 3 different files. Unify them in kernel.h.
> 
> Cc: Joe Perches <joe@perches.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

Ack for i915 parts for merging through any suitable tree. But since this
mostly touches drm I'd propose we pull this in through drm-misc. Joe?
-Daniel

> 
> ---
> v2: add typecheck() (comment from Maarten Lankhorst)
> 
> v3: make u64_to_user_ptr() a macro (comment from Joe Perches)
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 11 +++--------
>  drivers/gpu/drm/i915/i915_drv.h              |  5 -----
>  drivers/gpu/drm/i915/i915_gem.c              | 14 +++++++-------
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c   | 14 +++++++-------
>  drivers/gpu/drm/msm/msm_gem_submit.c         | 11 +++--------
>  include/linux/kernel.h                       |  7 +++++++
>  6 files changed, 27 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 236ada9..afdd55d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -28,11 +28,6 @@
>  #define BO_LOCKED   0x4000
>  #define BO_PINNED   0x2000
>  
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -	return (void __user *)(uintptr_t)address;
> -}
> -
>  static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
>  		struct etnaviv_gpu *gpu, size_t nr)
>  {
> @@ -347,21 +342,21 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>  	cmdbuf->exec_state = args->exec_state;
>  	cmdbuf->ctx = file->driver_priv;
>  
> -	ret = copy_from_user(bos, to_user_ptr(args->bos),
> +	ret = copy_from_user(bos, u64_to_user_ptr(args->bos),
>  			     args->nr_bos * sizeof(*bos));
>  	if (ret) {
>  		ret = -EFAULT;
>  		goto err_submit_cmds;
>  	}
>  
> -	ret = copy_from_user(relocs, to_user_ptr(args->relocs),
> +	ret = copy_from_user(relocs, u64_to_user_ptr(args->relocs),
>  			     args->nr_relocs * sizeof(*relocs));
>  	if (ret) {
>  		ret = -EFAULT;
>  		goto err_submit_cmds;
>  	}
>  
> -	ret = copy_from_user(stream, to_user_ptr(args->stream),
> +	ret = copy_from_user(stream, u64_to_user_ptr(args->stream),
>  			     args->stream_size);
>  	if (ret) {
>  		ret = -EFAULT;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 1048093..bb624cc 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3576,11 +3576,6 @@ static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
>  		return VGACNTRL;
>  }
>  
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -	return (void __user *)(uintptr_t)address;
> -}
> -
>  static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
>  {
>  	unsigned long j = msecs_to_jiffies(m);
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index dabc089..2889716 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -324,7 +324,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
>  {
>  	struct drm_device *dev = obj->base.dev;
>  	void *vaddr = obj->phys_handle->vaddr + args->offset;
> -	char __user *user_data = to_user_ptr(args->data_ptr);
> +	char __user *user_data = u64_to_user_ptr(args->data_ptr);
>  	int ret = 0;
>  
>  	/* We manually control the domain here and pretend that it
> @@ -605,7 +605,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
>  	int needs_clflush = 0;
>  	struct sg_page_iter sg_iter;
>  
> -	user_data = to_user_ptr(args->data_ptr);
> +	user_data = u64_to_user_ptr(args->data_ptr);
>  	remain = args->size;
>  
>  	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
> @@ -692,7 +692,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
>  		return 0;
>  
>  	if (!access_ok(VERIFY_WRITE,
> -		       to_user_ptr(args->data_ptr),
> +		       u64_to_user_ptr(args->data_ptr),
>  		       args->size))
>  		return -EFAULT;
>  
> @@ -783,7 +783,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
>  	if (ret)
>  		goto out_unpin;
>  
> -	user_data = to_user_ptr(args->data_ptr);
> +	user_data = u64_to_user_ptr(args->data_ptr);
>  	remain = args->size;
>  
>  	offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
> @@ -907,7 +907,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
>  	int needs_clflush_before = 0;
>  	struct sg_page_iter sg_iter;
>  
> -	user_data = to_user_ptr(args->data_ptr);
> +	user_data = u64_to_user_ptr(args->data_ptr);
>  	remain = args->size;
>  
>  	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
> @@ -1036,12 +1036,12 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
>  		return 0;
>  
>  	if (!access_ok(VERIFY_READ,
> -		       to_user_ptr(args->data_ptr),
> +		       u64_to_user_ptr(args->data_ptr),
>  		       args->size))
>  		return -EFAULT;
>  
>  	if (likely(!i915.prefault_disable)) {
> -		ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
> +		ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
>  						   args->size);
>  		if (ret)
>  			return -EFAULT;
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 1328bc5..e60b4e7 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -514,7 +514,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
>  	struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
>  	int remain, ret;
>  
> -	user_relocs = to_user_ptr(entry->relocs_ptr);
> +	user_relocs = u64_to_user_ptr(entry->relocs_ptr);
>  
>  	remain = entry->relocation_count;
>  	while (remain) {
> @@ -865,7 +865,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
>  		u64 invalid_offset = (u64)-1;
>  		int j;
>  
> -		user_relocs = to_user_ptr(exec[i].relocs_ptr);
> +		user_relocs = u64_to_user_ptr(exec[i].relocs_ptr);
>  
>  		if (copy_from_user(reloc+total, user_relocs,
>  				   exec[i].relocation_count * sizeof(*reloc))) {
> @@ -1009,7 +1009,7 @@ validate_exec_list(struct drm_device *dev,
>  		invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
>  
>  	for (i = 0; i < count; i++) {
> -		char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
> +		char __user *ptr = u64_to_user_ptr(exec[i].relocs_ptr);
>  		int length; /* limited by fault_in_pages_readable() */
>  
>  		if (exec[i].flags & invalid_flags)
> @@ -1696,7 +1696,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
>  		return -ENOMEM;
>  	}
>  	ret = copy_from_user(exec_list,
> -			     to_user_ptr(args->buffers_ptr),
> +			     u64_to_user_ptr(args->buffers_ptr),
>  			     sizeof(*exec_list) * args->buffer_count);
>  	if (ret != 0) {
>  		DRM_DEBUG("copy %d exec entries failed %d\n",
> @@ -1732,7 +1732,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
>  	ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
>  	if (!ret) {
>  		struct drm_i915_gem_exec_object __user *user_exec_list =
> -			to_user_ptr(args->buffers_ptr);
> +			u64_to_user_ptr(args->buffers_ptr);
>  
>  		/* Copy the new buffer offsets back to the user's exec list. */
>  		for (i = 0; i < args->buffer_count; i++) {
> @@ -1786,7 +1786,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
>  		return -ENOMEM;
>  	}
>  	ret = copy_from_user(exec2_list,
> -			     to_user_ptr(args->buffers_ptr),
> +			     u64_to_user_ptr(args->buffers_ptr),
>  			     sizeof(*exec2_list) * args->buffer_count);
>  	if (ret != 0) {
>  		DRM_DEBUG("copy %d exec entries failed %d\n",
> @@ -1799,7 +1799,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
>  	if (!ret) {
>  		/* Copy the new buffer offsets back to the user's exec list. */
>  		struct drm_i915_gem_exec_object2 __user *user_exec_list =
> -				   to_user_ptr(args->buffers_ptr);
> +				   u64_to_user_ptr(args->buffers_ptr);
>  		int i;
>  
>  		for (i = 0; i < args->buffer_count; i++) {
> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
> index 43d2181..23d2528 100644
> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
> @@ -28,11 +28,6 @@
>  #define BO_LOCKED   0x4000
>  #define BO_PINNED   0x2000
>  
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -	return (void __user *)(uintptr_t)address;
> -}
> -
>  static struct msm_gem_submit *submit_create(struct drm_device *dev,
>  		struct msm_gpu *gpu, int nr)
>  {
> @@ -68,7 +63,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
>  		struct drm_gem_object *obj;
>  		struct msm_gem_object *msm_obj;
>  		void __user *userptr =
> -			to_user_ptr(args->bos + (i * sizeof(submit_bo)));
> +			u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
>  
>  		ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
>  		if (ret) {
> @@ -257,7 +252,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
>  	for (i = 0; i < nr_relocs; i++) {
>  		struct drm_msm_gem_submit_reloc submit_reloc;
>  		void __user *userptr =
> -			to_user_ptr(relocs + (i * sizeof(submit_reloc)));
> +			u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
>  		uint32_t iova, off;
>  		bool valid;
>  
> @@ -356,7 +351,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
>  	for (i = 0; i < args->nr_cmds; i++) {
>  		struct drm_msm_gem_submit_cmd submit_cmd;
>  		void __user *userptr =
> -			to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
> +			u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
>  		struct msm_gem_object *msm_obj;
>  		uint32_t iova;
>  
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index 2f7775e..f3e45cb 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -53,6 +53,13 @@
>  
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
>  
> +#define u64_to_user_ptr(x) (		\
> +{					\
> +	typecheck(u64, x);		\
> +	(void __user *)(uintptr_t)x;	\
> +}					\
> +)
> +
>  /*
>   * This looks more complex than it should be. But we need to
>   * get the type for the ~ right in round_down (it needs to be
> -- 
> 2.5.5
>
Gustavo Padovan April 22, 2016, 2:36 p.m. UTC | #2
2016-04-22 Daniel Vetter <daniel@ffwll.ch>:

> On Thu, Apr 21, 2016 at 12:38:49PM -0300, Gustavo Padovan wrote:
> > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> > 
> > This function had copies in 3 different files. Unify them in kernel.h.
> > 
> > Cc: Joe Perches <joe@perches.com>
> > Cc: Andrew Morton <akpm@linux-foundation.org>
> > Cc: David Airlie <airlied@linux.ie>
> > Cc: Daniel Vetter <daniel.vetter@intel.com>
> > Cc: Rob Clark <robdclark@gmail.com>
> > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> 
> Ack for i915 parts for merging through any suitable tree. But since this
> mostly touches drm I'd propose we pull this in through drm-misc. Joe?

Patch 2 needs this change and it is meant to be applied against the
staging tree.

	Gustavo
Rob Clark April 22, 2016, 3:13 p.m. UTC | #3
On Thu, Apr 21, 2016 at 11:38 AM, Gustavo Padovan <gustavo@padovan.org> wrote:
> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>
> This function had copies in 3 different files. Unify them in kernel.h.
>
> Cc: Joe Perches <joe@perches.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

Acked-by: Rob Clark <robdclark@gmail.com>

>
> ---
> v2: add typecheck() (comment from Maarten Lankhorst)
>
> v3: make u64_to_user_ptr() a macro (comment from Joe Perches)
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 11 +++--------
>  drivers/gpu/drm/i915/i915_drv.h              |  5 -----
>  drivers/gpu/drm/i915/i915_gem.c              | 14 +++++++-------
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c   | 14 +++++++-------
>  drivers/gpu/drm/msm/msm_gem_submit.c         | 11 +++--------
>  include/linux/kernel.h                       |  7 +++++++
>  6 files changed, 27 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 236ada9..afdd55d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -28,11 +28,6 @@
>  #define BO_LOCKED   0x4000
>  #define BO_PINNED   0x2000
>
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -       return (void __user *)(uintptr_t)address;
> -}
> -
>  static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
>                 struct etnaviv_gpu *gpu, size_t nr)
>  {
> @@ -347,21 +342,21 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>         cmdbuf->exec_state = args->exec_state;
>         cmdbuf->ctx = file->driver_priv;
>
> -       ret = copy_from_user(bos, to_user_ptr(args->bos),
> +       ret = copy_from_user(bos, u64_to_user_ptr(args->bos),
>                              args->nr_bos * sizeof(*bos));
>         if (ret) {
>                 ret = -EFAULT;
>                 goto err_submit_cmds;
>         }
>
> -       ret = copy_from_user(relocs, to_user_ptr(args->relocs),
> +       ret = copy_from_user(relocs, u64_to_user_ptr(args->relocs),
>                              args->nr_relocs * sizeof(*relocs));
>         if (ret) {
>                 ret = -EFAULT;
>                 goto err_submit_cmds;
>         }
>
> -       ret = copy_from_user(stream, to_user_ptr(args->stream),
> +       ret = copy_from_user(stream, u64_to_user_ptr(args->stream),
>                              args->stream_size);
>         if (ret) {
>                 ret = -EFAULT;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 1048093..bb624cc 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3576,11 +3576,6 @@ static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
>                 return VGACNTRL;
>  }
>
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -       return (void __user *)(uintptr_t)address;
> -}
> -
>  static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
>  {
>         unsigned long j = msecs_to_jiffies(m);
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index dabc089..2889716 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -324,7 +324,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
>  {
>         struct drm_device *dev = obj->base.dev;
>         void *vaddr = obj->phys_handle->vaddr + args->offset;
> -       char __user *user_data = to_user_ptr(args->data_ptr);
> +       char __user *user_data = u64_to_user_ptr(args->data_ptr);
>         int ret = 0;
>
>         /* We manually control the domain here and pretend that it
> @@ -605,7 +605,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
>         int needs_clflush = 0;
>         struct sg_page_iter sg_iter;
>
> -       user_data = to_user_ptr(args->data_ptr);
> +       user_data = u64_to_user_ptr(args->data_ptr);
>         remain = args->size;
>
>         obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
> @@ -692,7 +692,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
>                 return 0;
>
>         if (!access_ok(VERIFY_WRITE,
> -                      to_user_ptr(args->data_ptr),
> +                      u64_to_user_ptr(args->data_ptr),
>                        args->size))
>                 return -EFAULT;
>
> @@ -783,7 +783,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
>         if (ret)
>                 goto out_unpin;
>
> -       user_data = to_user_ptr(args->data_ptr);
> +       user_data = u64_to_user_ptr(args->data_ptr);
>         remain = args->size;
>
>         offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
> @@ -907,7 +907,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
>         int needs_clflush_before = 0;
>         struct sg_page_iter sg_iter;
>
> -       user_data = to_user_ptr(args->data_ptr);
> +       user_data = u64_to_user_ptr(args->data_ptr);
>         remain = args->size;
>
>         obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
> @@ -1036,12 +1036,12 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
>                 return 0;
>
>         if (!access_ok(VERIFY_READ,
> -                      to_user_ptr(args->data_ptr),
> +                      u64_to_user_ptr(args->data_ptr),
>                        args->size))
>                 return -EFAULT;
>
>         if (likely(!i915.prefault_disable)) {
> -               ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
> +               ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
>                                                    args->size);
>                 if (ret)
>                         return -EFAULT;
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 1328bc5..e60b4e7 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -514,7 +514,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
>         struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
>         int remain, ret;
>
> -       user_relocs = to_user_ptr(entry->relocs_ptr);
> +       user_relocs = u64_to_user_ptr(entry->relocs_ptr);
>
>         remain = entry->relocation_count;
>         while (remain) {
> @@ -865,7 +865,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
>                 u64 invalid_offset = (u64)-1;
>                 int j;
>
> -               user_relocs = to_user_ptr(exec[i].relocs_ptr);
> +               user_relocs = u64_to_user_ptr(exec[i].relocs_ptr);
>
>                 if (copy_from_user(reloc+total, user_relocs,
>                                    exec[i].relocation_count * sizeof(*reloc))) {
> @@ -1009,7 +1009,7 @@ validate_exec_list(struct drm_device *dev,
>                 invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
>
>         for (i = 0; i < count; i++) {
> -               char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
> +               char __user *ptr = u64_to_user_ptr(exec[i].relocs_ptr);
>                 int length; /* limited by fault_in_pages_readable() */
>
>                 if (exec[i].flags & invalid_flags)
> @@ -1696,7 +1696,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
>                 return -ENOMEM;
>         }
>         ret = copy_from_user(exec_list,
> -                            to_user_ptr(args->buffers_ptr),
> +                            u64_to_user_ptr(args->buffers_ptr),
>                              sizeof(*exec_list) * args->buffer_count);
>         if (ret != 0) {
>                 DRM_DEBUG("copy %d exec entries failed %d\n",
> @@ -1732,7 +1732,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
>         ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
>         if (!ret) {
>                 struct drm_i915_gem_exec_object __user *user_exec_list =
> -                       to_user_ptr(args->buffers_ptr);
> +                       u64_to_user_ptr(args->buffers_ptr);
>
>                 /* Copy the new buffer offsets back to the user's exec list. */
>                 for (i = 0; i < args->buffer_count; i++) {
> @@ -1786,7 +1786,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
>                 return -ENOMEM;
>         }
>         ret = copy_from_user(exec2_list,
> -                            to_user_ptr(args->buffers_ptr),
> +                            u64_to_user_ptr(args->buffers_ptr),
>                              sizeof(*exec2_list) * args->buffer_count);
>         if (ret != 0) {
>                 DRM_DEBUG("copy %d exec entries failed %d\n",
> @@ -1799,7 +1799,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
>         if (!ret) {
>                 /* Copy the new buffer offsets back to the user's exec list. */
>                 struct drm_i915_gem_exec_object2 __user *user_exec_list =
> -                                  to_user_ptr(args->buffers_ptr);
> +                                  u64_to_user_ptr(args->buffers_ptr);
>                 int i;
>
>                 for (i = 0; i < args->buffer_count; i++) {
> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
> index 43d2181..23d2528 100644
> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
> @@ -28,11 +28,6 @@
>  #define BO_LOCKED   0x4000
>  #define BO_PINNED   0x2000
>
> -static inline void __user *to_user_ptr(u64 address)
> -{
> -       return (void __user *)(uintptr_t)address;
> -}
> -
>  static struct msm_gem_submit *submit_create(struct drm_device *dev,
>                 struct msm_gpu *gpu, int nr)
>  {
> @@ -68,7 +63,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
>                 struct drm_gem_object *obj;
>                 struct msm_gem_object *msm_obj;
>                 void __user *userptr =
> -                       to_user_ptr(args->bos + (i * sizeof(submit_bo)));
> +                       u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
>
>                 ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
>                 if (ret) {
> @@ -257,7 +252,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
>         for (i = 0; i < nr_relocs; i++) {
>                 struct drm_msm_gem_submit_reloc submit_reloc;
>                 void __user *userptr =
> -                       to_user_ptr(relocs + (i * sizeof(submit_reloc)));
> +                       u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
>                 uint32_t iova, off;
>                 bool valid;
>
> @@ -356,7 +351,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
>         for (i = 0; i < args->nr_cmds; i++) {
>                 struct drm_msm_gem_submit_cmd submit_cmd;
>                 void __user *userptr =
> -                       to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
> +                       u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
>                 struct msm_gem_object *msm_obj;
>                 uint32_t iova;
>
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index 2f7775e..f3e45cb 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -53,6 +53,13 @@
>
>  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
>
> +#define u64_to_user_ptr(x) (           \
> +{                                      \
> +       typecheck(u64, x);              \
> +       (void __user *)(uintptr_t)x;    \
> +}                                      \
> +)
> +
>  /*
>   * This looks more complex than it should be. But we need to
>   * get the type for the ~ right in round_down (it needs to be
> --
> 2.5.5
>
Maarten Lankhorst April 24, 2016, 10:42 a.m. UTC | #4
Op 22-04-16 om 17:13 schreef Rob Clark:
> On Thu, Apr 21, 2016 at 11:38 AM, Gustavo Padovan <gustavo@padovan.org> wrote:
>> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>>
>> This function had copies in 3 different files. Unify them in kernel.h.
>>
>> Cc: Joe Perches <joe@perches.com>
>> Cc: Andrew Morton <akpm@linux-foundation.org>
>> Cc: David Airlie <airlied@linux.ie>
>> Cc: Daniel Vetter <daniel.vetter@intel.com>
>> Cc: Rob Clark <robdclark@gmail.com>
>> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> Acked-by: Rob Clark <robdclark@gmail.com>
>
Looking much better.
Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Lucas Stach April 26, 2016, 9:01 a.m. UTC | #5
Am Donnerstag, den 21.04.2016, 12:38 -0300 schrieb Gustavo Padovan:
> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> 
> This function had copies in 3 different files. Unify them in kernel.h.
> 
> Cc: Joe Perches <joe@perches.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel.vetter@intel.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> 
Though I normally prefer static inline functions, I see the benefits of
using the macro form here.

For the etnaviv part:
Acked-by: Lucas Stach <l.stach@pengutronix.de>
Gustavo Padovan April 26, 2016, 2:29 p.m. UTC | #6
2016-04-26 Lucas Stach <l.stach@pengutronix.de>:

> Am Donnerstag, den 21.04.2016, 12:38 -0300 schrieb Gustavo Padovan:
> > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> > 
> > This function had copies in 3 different files. Unify them in kernel.h.
> > 
> > Cc: Joe Perches <joe@perches.com>
> > Cc: Andrew Morton <akpm@linux-foundation.org>
> > Cc: David Airlie <airlied@linux.ie>
> > Cc: Daniel Vetter <daniel.vetter@intel.com>
> > Cc: Rob Clark <robdclark@gmail.com>
> > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> > 
> Though I normally prefer static inline functions, I see the benefits of
> using the macro form here.
> 
> For the etnaviv part:
> Acked-by: Lucas Stach <l.stach@pengutronix.de>

Thank you all! I'll collect the Acks and send a new version, so it is
easier for Greg to pick it up.
Joe Perches April 26, 2016, 2:40 p.m. UTC | #7
On Tue, 2016-04-26 at 11:29 -0300, Gustavo Padovan wrote:
> 2016-04-26 Lucas Stach <l.stach@pengutronix.de>:
> > Am Donnerstag, den 21.04.2016, 12:38 -0300 schrieb Gustavo Padovan:
> > > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> > > 
> > > This function had copies in 3 different files. Unify them in kernel.h.
> > > 
> > > Cc: Joe Perches <joe@perches.com>
> > > Cc: Andrew Morton <akpm@linux-foundation.org>
> > > Cc: David Airlie <airlied@linux.ie>
> > > Cc: Daniel Vetter <daniel.vetter@intel.com>
> > > Cc: Rob Clark <robdclark@gmail.com>
> > > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> > > 
> > Though I normally prefer static inline functions, I see the benefits of
> > using the macro form here.

An inline could still work
	static inline void __user *u64_to_user_ptr(u64 address)
	{
		return (void __user *)(uintptr_t)address;
	}
if the macro was
	#define u64_to_user_ptr(x)		\
	({					\
		typecheck(u64, x);		\
		(u64_to_user_ptr)(x);		\
	})

the parenthesis around the u64_to_user_ptr
in the macro should prevent expansion.
diff mbox

Patch

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 236ada9..afdd55d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -28,11 +28,6 @@ 
 #define BO_LOCKED   0x4000
 #define BO_PINNED   0x2000
 
-static inline void __user *to_user_ptr(u64 address)
-{
-	return (void __user *)(uintptr_t)address;
-}
-
 static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
 		struct etnaviv_gpu *gpu, size_t nr)
 {
@@ -347,21 +342,21 @@  int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
 	cmdbuf->exec_state = args->exec_state;
 	cmdbuf->ctx = file->driver_priv;
 
-	ret = copy_from_user(bos, to_user_ptr(args->bos),
+	ret = copy_from_user(bos, u64_to_user_ptr(args->bos),
 			     args->nr_bos * sizeof(*bos));
 	if (ret) {
 		ret = -EFAULT;
 		goto err_submit_cmds;
 	}
 
-	ret = copy_from_user(relocs, to_user_ptr(args->relocs),
+	ret = copy_from_user(relocs, u64_to_user_ptr(args->relocs),
 			     args->nr_relocs * sizeof(*relocs));
 	if (ret) {
 		ret = -EFAULT;
 		goto err_submit_cmds;
 	}
 
-	ret = copy_from_user(stream, to_user_ptr(args->stream),
+	ret = copy_from_user(stream, u64_to_user_ptr(args->stream),
 			     args->stream_size);
 	if (ret) {
 		ret = -EFAULT;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1048093..bb624cc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3576,11 +3576,6 @@  static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
 		return VGACNTRL;
 }
 
-static inline void __user *to_user_ptr(u64 address)
-{
-	return (void __user *)(uintptr_t)address;
-}
-
 static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
 {
 	unsigned long j = msecs_to_jiffies(m);
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index dabc089..2889716 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -324,7 +324,7 @@  i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
 {
 	struct drm_device *dev = obj->base.dev;
 	void *vaddr = obj->phys_handle->vaddr + args->offset;
-	char __user *user_data = to_user_ptr(args->data_ptr);
+	char __user *user_data = u64_to_user_ptr(args->data_ptr);
 	int ret = 0;
 
 	/* We manually control the domain here and pretend that it
@@ -605,7 +605,7 @@  i915_gem_shmem_pread(struct drm_device *dev,
 	int needs_clflush = 0;
 	struct sg_page_iter sg_iter;
 
-	user_data = to_user_ptr(args->data_ptr);
+	user_data = u64_to_user_ptr(args->data_ptr);
 	remain = args->size;
 
 	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@ -692,7 +692,7 @@  i915_gem_pread_ioctl(struct drm_device *dev, void *data,
 		return 0;
 
 	if (!access_ok(VERIFY_WRITE,
-		       to_user_ptr(args->data_ptr),
+		       u64_to_user_ptr(args->data_ptr),
 		       args->size))
 		return -EFAULT;
 
@@ -783,7 +783,7 @@  i915_gem_gtt_pwrite_fast(struct drm_device *dev,
 	if (ret)
 		goto out_unpin;
 
-	user_data = to_user_ptr(args->data_ptr);
+	user_data = u64_to_user_ptr(args->data_ptr);
 	remain = args->size;
 
 	offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
@@ -907,7 +907,7 @@  i915_gem_shmem_pwrite(struct drm_device *dev,
 	int needs_clflush_before = 0;
 	struct sg_page_iter sg_iter;
 
-	user_data = to_user_ptr(args->data_ptr);
+	user_data = u64_to_user_ptr(args->data_ptr);
 	remain = args->size;
 
 	obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@ -1036,12 +1036,12 @@  i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
 		return 0;
 
 	if (!access_ok(VERIFY_READ,
-		       to_user_ptr(args->data_ptr),
+		       u64_to_user_ptr(args->data_ptr),
 		       args->size))
 		return -EFAULT;
 
 	if (likely(!i915.prefault_disable)) {
-		ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
+		ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
 						   args->size);
 		if (ret)
 			return -EFAULT;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 1328bc5..e60b4e7 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -514,7 +514,7 @@  i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
 	struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
 	int remain, ret;
 
-	user_relocs = to_user_ptr(entry->relocs_ptr);
+	user_relocs = u64_to_user_ptr(entry->relocs_ptr);
 
 	remain = entry->relocation_count;
 	while (remain) {
@@ -865,7 +865,7 @@  i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
 		u64 invalid_offset = (u64)-1;
 		int j;
 
-		user_relocs = to_user_ptr(exec[i].relocs_ptr);
+		user_relocs = u64_to_user_ptr(exec[i].relocs_ptr);
 
 		if (copy_from_user(reloc+total, user_relocs,
 				   exec[i].relocation_count * sizeof(*reloc))) {
@@ -1009,7 +1009,7 @@  validate_exec_list(struct drm_device *dev,
 		invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
 
 	for (i = 0; i < count; i++) {
-		char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
+		char __user *ptr = u64_to_user_ptr(exec[i].relocs_ptr);
 		int length; /* limited by fault_in_pages_readable() */
 
 		if (exec[i].flags & invalid_flags)
@@ -1696,7 +1696,7 @@  i915_gem_execbuffer(struct drm_device *dev, void *data,
 		return -ENOMEM;
 	}
 	ret = copy_from_user(exec_list,
-			     to_user_ptr(args->buffers_ptr),
+			     u64_to_user_ptr(args->buffers_ptr),
 			     sizeof(*exec_list) * args->buffer_count);
 	if (ret != 0) {
 		DRM_DEBUG("copy %d exec entries failed %d\n",
@@ -1732,7 +1732,7 @@  i915_gem_execbuffer(struct drm_device *dev, void *data,
 	ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
 	if (!ret) {
 		struct drm_i915_gem_exec_object __user *user_exec_list =
-			to_user_ptr(args->buffers_ptr);
+			u64_to_user_ptr(args->buffers_ptr);
 
 		/* Copy the new buffer offsets back to the user's exec list. */
 		for (i = 0; i < args->buffer_count; i++) {
@@ -1786,7 +1786,7 @@  i915_gem_execbuffer2(struct drm_device *dev, void *data,
 		return -ENOMEM;
 	}
 	ret = copy_from_user(exec2_list,
-			     to_user_ptr(args->buffers_ptr),
+			     u64_to_user_ptr(args->buffers_ptr),
 			     sizeof(*exec2_list) * args->buffer_count);
 	if (ret != 0) {
 		DRM_DEBUG("copy %d exec entries failed %d\n",
@@ -1799,7 +1799,7 @@  i915_gem_execbuffer2(struct drm_device *dev, void *data,
 	if (!ret) {
 		/* Copy the new buffer offsets back to the user's exec list. */
 		struct drm_i915_gem_exec_object2 __user *user_exec_list =
-				   to_user_ptr(args->buffers_ptr);
+				   u64_to_user_ptr(args->buffers_ptr);
 		int i;
 
 		for (i = 0; i < args->buffer_count; i++) {
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 43d2181..23d2528 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -28,11 +28,6 @@ 
 #define BO_LOCKED   0x4000
 #define BO_PINNED   0x2000
 
-static inline void __user *to_user_ptr(u64 address)
-{
-	return (void __user *)(uintptr_t)address;
-}
-
 static struct msm_gem_submit *submit_create(struct drm_device *dev,
 		struct msm_gpu *gpu, int nr)
 {
@@ -68,7 +63,7 @@  static int submit_lookup_objects(struct msm_gem_submit *submit,
 		struct drm_gem_object *obj;
 		struct msm_gem_object *msm_obj;
 		void __user *userptr =
-			to_user_ptr(args->bos + (i * sizeof(submit_bo)));
+			u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
 
 		ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
 		if (ret) {
@@ -257,7 +252,7 @@  static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
 	for (i = 0; i < nr_relocs; i++) {
 		struct drm_msm_gem_submit_reloc submit_reloc;
 		void __user *userptr =
-			to_user_ptr(relocs + (i * sizeof(submit_reloc)));
+			u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
 		uint32_t iova, off;
 		bool valid;
 
@@ -356,7 +351,7 @@  int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 	for (i = 0; i < args->nr_cmds; i++) {
 		struct drm_msm_gem_submit_cmd submit_cmd;
 		void __user *userptr =
-			to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
+			u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
 		struct msm_gem_object *msm_obj;
 		uint32_t iova;
 
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2f7775e..f3e45cb 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -53,6 +53,13 @@ 
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
 
+#define u64_to_user_ptr(x) (		\
+{					\
+	typecheck(u64, x);		\
+	(void __user *)(uintptr_t)x;	\
+}					\
+)
+
 /*
  * This looks more complex than it should be. But we need to
  * get the type for the ~ right in round_down (it needs to be