* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-21 15:38 ` [PATCH v12 1/2] kernel.h: add u64_to_user_ptr() Gustavo Padovan
@ 2016-04-22 8:31 ` Daniel Vetter
2016-04-22 14:36 ` Gustavo Padovan
2016-04-22 15:13 ` Rob Clark
2016-04-26 9:01 ` Lucas Stach
2 siblings, 1 reply; 11+ messages in thread
From: Daniel Vetter @ 2016-04-22 8:31 UTC (permalink / raw)
To: Gustavo Padovan
Cc: devel, Daniel Stone, Greg Kroah-Hartman, linux-kernel, dri-devel,
Joe Perches, Arve Hjønnevåg, Daniel Vetter,
Riley Andrews, Daniel Vetter, Andrew Morton, Gustavo Padovan,
John Harrison
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
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-22 8:31 ` Daniel Vetter
@ 2016-04-22 14:36 ` Gustavo Padovan
0 siblings, 0 replies; 11+ messages in thread
From: Gustavo Padovan @ 2016-04-22 14:36 UTC (permalink / raw)
To: Greg Kroah-Hartman, linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Rob Clark, Greg Hackmann,
John Harrison, Maarten Lankhorst, Gustavo Padovan, Joe Perches,
Andrew Morton, David Airlie, Daniel Vetter
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
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-21 15:38 ` [PATCH v12 1/2] kernel.h: add u64_to_user_ptr() Gustavo Padovan
2016-04-22 8:31 ` Daniel Vetter
@ 2016-04-22 15:13 ` Rob Clark
2016-04-24 10:42 ` Maarten Lankhorst
2016-04-26 9:01 ` Lucas Stach
2 siblings, 1 reply; 11+ messages in thread
From: Rob Clark @ 2016-04-22 15:13 UTC (permalink / raw)
To: Gustavo Padovan
Cc: devel, Daniel Stone, Greg Kroah-Hartman,
Linux Kernel Mailing List, dri-devel@lists.freedesktop.org,
Joe Perches, Arve Hjønnevåg, Daniel Vetter,
Riley Andrews, Daniel Vetter, Andrew Morton, Gustavo Padovan,
John Harrison
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
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-22 15:13 ` Rob Clark
@ 2016-04-24 10:42 ` Maarten Lankhorst
0 siblings, 0 replies; 11+ messages in thread
From: Maarten Lankhorst @ 2016-04-24 10:42 UTC (permalink / raw)
To: Rob Clark, Gustavo Padovan
Cc: devel, Daniel Stone, Greg Kroah-Hartman,
Linux Kernel Mailing List, dri-devel@lists.freedesktop.org,
Joe Perches, Arve Hjønnevåg, Daniel Vetter,
Riley Andrews, Daniel Vetter, Andrew Morton, Gustavo Padovan,
John Harrison
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>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-21 15:38 ` [PATCH v12 1/2] kernel.h: add u64_to_user_ptr() Gustavo Padovan
2016-04-22 8:31 ` Daniel Vetter
2016-04-22 15:13 ` Rob Clark
@ 2016-04-26 9:01 ` Lucas Stach
2016-04-26 14:29 ` Gustavo Padovan
2 siblings, 1 reply; 11+ messages in thread
From: Lucas Stach @ 2016-04-26 9:01 UTC (permalink / raw)
To: Gustavo Padovan
Cc: devel, Daniel Stone, Greg Kroah-Hartman, linux-kernel, dri-devel,
Riley Andrews, Arve Hjønnevåg, Daniel Vetter,
Joe Perches, Daniel Vetter, Andrew Morton, Gustavo Padovan,
John Harrison
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>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-26 9:01 ` Lucas Stach
@ 2016-04-26 14:29 ` Gustavo Padovan
2016-04-26 14:40 ` Joe Perches
0 siblings, 1 reply; 11+ messages in thread
From: Gustavo Padovan @ 2016-04-26 14:29 UTC (permalink / raw)
To: Lucas Stach
Cc: Gustavo Padovan, Greg Kroah-Hartman, devel, Daniel Stone,
Daniel Vetter, Riley Andrews, dri-devel, linux-kernel,
Arve Hjønnevåg, Joe Perches, Daniel Vetter,
Andrew Morton, John Harrison
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.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-26 14:29 ` Gustavo Padovan
@ 2016-04-26 14:40 ` Joe Perches
2016-07-11 7:51 ` Tomas Winkler
0 siblings, 1 reply; 11+ messages in thread
From: Joe Perches @ 2016-04-26 14:40 UTC (permalink / raw)
To: Gustavo Padovan, Lucas Stach
Cc: devel, Daniel Stone, Greg Kroah-Hartman, linux-kernel, dri-devel,
Riley Andrews, Arve Hjønnevåg, Daniel Vetter,
Daniel Vetter, Andrew Morton, John Harrison
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.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH v12 1/2] kernel.h: add u64_to_user_ptr()
2016-04-26 14:40 ` Joe Perches
@ 2016-07-11 7:51 ` Tomas Winkler
0 siblings, 0 replies; 11+ messages in thread
From: Tomas Winkler @ 2016-07-11 7:51 UTC (permalink / raw)
To: Joe Perches
Cc: driverdevel, Daniel Stone, Gustavo Padovan,
linux-kernel@vger.kernel.org, dri-devel, Daniel Vetter,
Riley Andrews, Arve Hjønnevåg, Greg Kroah-Hartman,
Daniel Vetter, Andrew Morton, Gustavo Padovan, John Harrison,
Lucas Stach
> > > 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.
>
sparse is throwing 'warning: dereference of noderef expression' on
this macro now.
Any clues what need to be fixed
Thanks
Tomas
^ permalink raw reply [flat|nested] 11+ messages in thread