Message ID | 1461253130-9266-2-git-send-email-gustavo@padovan.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 >
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
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 >
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>
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>
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.
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 --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