Skip to content

Commit 7d976fc

Browse files
Gustavo PadovanIgor Opaniuk
authored andcommitted
kernel.h: add u64_to_user_ptr()
This function had copies in 3 different files. Unify them in kernel.h. Cc: Joe Perches <[email protected]> Cc: Andrew Morton <[email protected]> Cc: David Airlie <[email protected]> Cc: Daniel Vetter <[email protected]> Cc: Rob Clark <[email protected]> Signed-off-by: Gustavo Padovan <[email protected]> Acked-by: Daniel Vetter <[email protected]> [drm/i915/] Acked-by: Rob Clark <[email protected]> [drm/msm/] Acked-by: Lucas Stach <[email protected]> [drm/etinav/] Acked-by: Maarten Lankhorst <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 15c3710 commit 7d976fc

File tree

6 files changed

+27
-35
lines changed

6 files changed

+27
-35
lines changed

drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@
2828
#define BO_LOCKED 0x4000
2929
#define BO_PINNED 0x2000
3030

31-
static inline void __user *to_user_ptr(u64 address)
32-
{
33-
return (void __user *)(uintptr_t)address;
34-
}
35-
3631
static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
3732
struct etnaviv_gpu *gpu, size_t nr)
3833
{
@@ -347,21 +342,21 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
347342
cmdbuf->exec_state = args->exec_state;
348343
cmdbuf->ctx = file->driver_priv;
349344

350-
ret = copy_from_user(bos, to_user_ptr(args->bos),
345+
ret = copy_from_user(bos, u64_to_user_ptr(args->bos),
351346
args->nr_bos * sizeof(*bos));
352347
if (ret) {
353348
ret = -EFAULT;
354349
goto err_submit_cmds;
355350
}
356351

357-
ret = copy_from_user(relocs, to_user_ptr(args->relocs),
352+
ret = copy_from_user(relocs, u64_to_user_ptr(args->relocs),
358353
args->nr_relocs * sizeof(*relocs));
359354
if (ret) {
360355
ret = -EFAULT;
361356
goto err_submit_cmds;
362357
}
363358

364-
ret = copy_from_user(stream, to_user_ptr(args->stream),
359+
ret = copy_from_user(stream, u64_to_user_ptr(args->stream),
365360
args->stream_size);
366361
if (ret) {
367362
ret = -EFAULT;

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3577,11 +3577,6 @@ static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
35773577
return VGACNTRL;
35783578
}
35793579

3580-
static inline void __user *to_user_ptr(u64 address)
3581-
{
3582-
return (void __user *)(uintptr_t)address;
3583-
}
3584-
35853580
static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
35863581
{
35873582
unsigned long j = msecs_to_jiffies(m);

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
324324
{
325325
struct drm_device *dev = obj->base.dev;
326326
void *vaddr = obj->phys_handle->vaddr + args->offset;
327-
char __user *user_data = to_user_ptr(args->data_ptr);
327+
char __user *user_data = u64_to_user_ptr(args->data_ptr);
328328
int ret = 0;
329329

330330
/* We manually control the domain here and pretend that it
@@ -605,7 +605,7 @@ i915_gem_shmem_pread(struct drm_device *dev,
605605
int needs_clflush = 0;
606606
struct sg_page_iter sg_iter;
607607

608-
user_data = to_user_ptr(args->data_ptr);
608+
user_data = u64_to_user_ptr(args->data_ptr);
609609
remain = args->size;
610610

611611
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,
692692
return 0;
693693

694694
if (!access_ok(VERIFY_WRITE,
695-
to_user_ptr(args->data_ptr),
695+
u64_to_user_ptr(args->data_ptr),
696696
args->size))
697697
return -EFAULT;
698698

@@ -783,7 +783,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
783783
if (ret)
784784
goto out_unpin;
785785

786-
user_data = to_user_ptr(args->data_ptr);
786+
user_data = u64_to_user_ptr(args->data_ptr);
787787
remain = args->size;
788788

789789
offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
@@ -907,7 +907,7 @@ i915_gem_shmem_pwrite(struct drm_device *dev,
907907
int needs_clflush_before = 0;
908908
struct sg_page_iter sg_iter;
909909

910-
user_data = to_user_ptr(args->data_ptr);
910+
user_data = u64_to_user_ptr(args->data_ptr);
911911
remain = args->size;
912912

913913
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,
10361036
return 0;
10371037

10381038
if (!access_ok(VERIFY_READ,
1039-
to_user_ptr(args->data_ptr),
1039+
u64_to_user_ptr(args->data_ptr),
10401040
args->size))
10411041
return -EFAULT;
10421042

10431043
if (likely(!i915.prefault_disable)) {
1044-
ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
1044+
ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
10451045
args->size);
10461046
if (ret)
10471047
return -EFAULT;

drivers/gpu/drm/i915/i915_gem_execbuffer.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
514514
struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
515515
int remain, ret;
516516

517-
user_relocs = to_user_ptr(entry->relocs_ptr);
517+
user_relocs = u64_to_user_ptr(entry->relocs_ptr);
518518

519519
remain = entry->relocation_count;
520520
while (remain) {
@@ -865,7 +865,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
865865
u64 invalid_offset = (u64)-1;
866866
int j;
867867

868-
user_relocs = to_user_ptr(exec[i].relocs_ptr);
868+
user_relocs = u64_to_user_ptr(exec[i].relocs_ptr);
869869

870870
if (copy_from_user(reloc+total, user_relocs,
871871
exec[i].relocation_count * sizeof(*reloc))) {
@@ -1009,7 +1009,7 @@ validate_exec_list(struct drm_device *dev,
10091009
invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
10101010

10111011
for (i = 0; i < count; i++) {
1012-
char __user *ptr = to_user_ptr(exec[i].relocs_ptr);
1012+
char __user *ptr = u64_to_user_ptr(exec[i].relocs_ptr);
10131013
int length; /* limited by fault_in_pages_readable() */
10141014

10151015
if (exec[i].flags & invalid_flags)
@@ -1696,7 +1696,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
16961696
return -ENOMEM;
16971697
}
16981698
ret = copy_from_user(exec_list,
1699-
to_user_ptr(args->buffers_ptr),
1699+
u64_to_user_ptr(args->buffers_ptr),
17001700
sizeof(*exec_list) * args->buffer_count);
17011701
if (ret != 0) {
17021702
DRM_DEBUG("copy %d exec entries failed %d\n",
@@ -1732,7 +1732,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
17321732
ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
17331733
if (!ret) {
17341734
struct drm_i915_gem_exec_object __user *user_exec_list =
1735-
to_user_ptr(args->buffers_ptr);
1735+
u64_to_user_ptr(args->buffers_ptr);
17361736

17371737
/* Copy the new buffer offsets back to the user's exec list. */
17381738
for (i = 0; i < args->buffer_count; i++) {
@@ -1786,7 +1786,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
17861786
return -ENOMEM;
17871787
}
17881788
ret = copy_from_user(exec2_list,
1789-
to_user_ptr(args->buffers_ptr),
1789+
u64_to_user_ptr(args->buffers_ptr),
17901790
sizeof(*exec2_list) * args->buffer_count);
17911791
if (ret != 0) {
17921792
DRM_DEBUG("copy %d exec entries failed %d\n",
@@ -1799,7 +1799,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
17991799
if (!ret) {
18001800
/* Copy the new buffer offsets back to the user's exec list. */
18011801
struct drm_i915_gem_exec_object2 __user *user_exec_list =
1802-
to_user_ptr(args->buffers_ptr);
1802+
u64_to_user_ptr(args->buffers_ptr);
18031803
int i;
18041804

18051805
for (i = 0; i < args->buffer_count; i++) {

drivers/gpu/drm/msm/msm_gem_submit.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,6 @@
2828
#define BO_LOCKED 0x4000
2929
#define BO_PINNED 0x2000
3030

31-
static inline void __user *to_user_ptr(u64 address)
32-
{
33-
return (void __user *)(uintptr_t)address;
34-
}
35-
3631
static struct msm_gem_submit *submit_create(struct drm_device *dev,
3732
struct msm_gpu *gpu, int nr)
3833
{
@@ -68,7 +63,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
6863
struct drm_gem_object *obj;
6964
struct msm_gem_object *msm_obj;
7065
void __user *userptr =
71-
to_user_ptr(args->bos + (i * sizeof(submit_bo)));
66+
u64_to_user_ptr(args->bos + (i * sizeof(submit_bo)));
7267

7368
ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
7469
if (ret) {
@@ -257,7 +252,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
257252
for (i = 0; i < nr_relocs; i++) {
258253
struct drm_msm_gem_submit_reloc submit_reloc;
259254
void __user *userptr =
260-
to_user_ptr(relocs + (i * sizeof(submit_reloc)));
255+
u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
261256
uint32_t iova, off;
262257
bool valid;
263258

@@ -356,7 +351,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
356351
for (i = 0; i < args->nr_cmds; i++) {
357352
struct drm_msm_gem_submit_cmd submit_cmd;
358353
void __user *userptr =
359-
to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
354+
u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
360355
struct msm_gem_object *msm_obj;
361356
uint32_t iova;
362357

include/linux/kernel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@
5353

5454
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
5555

56+
#define u64_to_user_ptr(x) ( \
57+
{ \
58+
typecheck(u64, x); \
59+
(void __user *)(uintptr_t)x; \
60+
} \
61+
)
62+
5663
/*
5764
* This looks more complex than it should be. But we need to
5865
* get the type for the ~ right in round_down (it needs to be

0 commit comments

Comments
 (0)