drm/amdgpu: fix 32-bit compiler warning
Subsystems (2)
PATCH 1/1 drm/amdgpu: fix 32-bit compiler warning
The new amdgpu driver passes a user space pointer in a 64-bit structure member, which is the correct way to do it, but it attempts to directly cast it to a __user pointer in the kernel, which causes a warning in three places:
drm/amd/amdgpu/amdgpu_cs.c: In function 'amdgpu_cs_parser_init':drm/amd/amdgpu/amdgpu_cs.c:180:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
chunk_array_user = (uint64_t __user *)(cs->in.chunks);
This changes all three to add an intermediate cast to 'unsigned long' as other drivers do. This avoids the warning and works correctly on both 32-bit and 64-bit architectures.
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +3 -3
@@ -177,7 +177,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)/* get chunks */ INIT_LIST_HEAD (&p->validated); - chunk_array_user = (uint64_t __user *)(cs->in.chunks); + chunk_array_user = (uint64_t __user *)(unsigned long )(cs->in.chunks);if (copy_from_user (chunk_array, chunk_array_user,sizeof (uint64_t )*cs->in.num_chunks)) { ret = -EFAULT ;
@@ -197,7 +197,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)struct drm_amdgpu_cs_chunk user_chunk;uint32_t __user *cdata; - chunk_ptr = (void __user *)chunk_array[i]; + chunk_ptr = (void __user *)(unsigned long )chunk_array[i];if (copy_from_user (&user_chunk, chunk_ptr,sizeof (struct drm_amdgpu_cs_chunk ))) { ret = -EFAULT ;
@@ -208,7 +208,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) p->chunks[i].length_dw = user_chunk.length_dw; size = p->chunks[i].length_dw; - cdata = (void __user *)user_chunk.chunk_data; + cdata = (void __user *)(unsigned long )user_chunk.chunk_data; p->chunks[i].user_ptr = cdata; p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t ));
Christian König
maintainerQuoted 9 lines · Arnd Bergmann
The new amdgpu driver passes a user space pointer in a 64-bit structure member, which is the correct way to do it, but it attempts to directly cast it to a
__userpointer in the kernel, which causes a warning in three places:
drm/amd/amdgpu/amdgpu_cs.c: In function 'amdgpu_cs_parser_init':drm/amd/amdgpu/amdgpu_cs.c:180:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
chunk_array_user= (uint64_t__user*)(cs->in.chunks);
Quoted 5 lines
This changes all three to add an intermediate cast to 'unsigned long' as other drivers do. This avoids the warning and works correctly on both 32-bit and 64-bit architectures.
Signed-off-by Arnd Bergmann <[email protected]>
Well if I'm not completely mistaken this is the second time we need to fix this because somebody thought the cast was unnecessary.
Anyway the patch is Reviewed-by: Christian König <[email protected]> and I'm going to keep an eye open for the next time somebody tries to remove this.
Regards,
Christian.
Quoted 33 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +3
-3@@ -177,7 +177,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)/* get chunks */ INIT_LIST_HEAD (&p->validated); - chunk_array_user = (uint64_t __user *)(cs->in.chunks); + chunk_array_user = (uint64_t __user *)(unsigned long )(cs->in.chunks);if (copy_from_user (chunk_array, chunk_array_user,sizeof (uint64_t )*cs->in.num_chunks)) { ret = -EFAULT ;@@ -197,7 +197,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)struct drm_amdgpu_cs_chunk user_chunk;uint32_t __user *cdata; - chunk_ptr = (void __user *)chunk_array[i]; + chunk_ptr = (void __user *)(unsigned long )chunk_array[i];if (copy_from_user (&user_chunk, chunk_ptr,sizeof (struct drm_amdgpu_cs_chunk ))) { ret = -EFAULT ;@@ -208,7 +208,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) p->chunks[i].length_dw = user_chunk.length_dw; size = p->chunks[i].length_dw; - cdata = (void __user *)user_chunk.chunk_data; + cdata = (void __user *)(unsigned long )user_chunk.chunk_data; p->chunks[i].user_ptr = cdata; p->chunks[i].kdata =drm_malloc_ab (size,sizeof (uint32_t ));
Quoted 14 lines · On Wednesday 07 October 2015 10:57:11 Christian K?nig wrote:
Quoted 13 lines · Arnd Bergmann
The new amdgpu driver passes a user space pointer in a 64-bit structure member, which is the correct way to do it, but it attempts to directly cast it to a
__userpointer in the kernel, which causes a warning in three places:
drm/amd/amdgpu/amdgpu_cs.c: In function 'amdgpu_cs_parser_init':drm/amd/amdgpu/amdgpu_cs.c:180:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
chunk_array_user= (uint64_t__user*)(cs->in.chunks);This changes all three to add an intermediate cast to 'unsigned long' as other drivers do. This avoids the warning and works correctly on both 32-bit and 64-bit architectures.
Quoted 9 lines
Quoted 1 line
Signed-off-by Arnd Bergmann <[email protected]>Well if I'm not completely mistaken this is the second time we need to fix this because somebody thought the cast was unnecessary.
Anyway the patch is Reviewed-by: Christian K?nig <[email protected]> and I'm going to keep an eye open for the next time somebody tries to remove this.
Ok, thanks.
I guess I should have added
Arnd
Quoted 25 lines · Arnd Bergmann
Quoted 14 lines · On Wednesday 07 October 2015 10:57:11 Christian K?nig wrote:
Quoted 13 lines · Arnd Bergmann
The new amdgpu driver passes a user space pointer in a 64-bit structure member, which is the correct way to do it, but it attempts to directly cast it to a
__userpointer in the kernel, which causes a warning in three places:
drm/amd/amdgpu/amdgpu_cs.c: In function 'amdgpu_cs_parser_init':drm/amd/amdgpu/amdgpu_cs.c:180:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
chunk_array_user= (uint64_t__user*)(cs->in.chunks);This changes all three to add an intermediate cast to 'unsigned long' as other drivers do. This avoids the warning and works correctly on both 32-bit and 64-bit architectures.
Quoted 9 lines
Quoted 1 line
Signed-off-by Arnd Bergmann <[email protected]>Well if I'm not completely mistaken this is the second time we need to fix this because somebody thought the cast was unnecessary.
Anyway the patch is Reviewed-by: Christian K?nig <[email protected]> and I'm going to keep an eye open for the next time somebody tries to remove this.
Quoted 5 lines
Ok, thanks.
I guess I should have added
Fixes e60b344f6c0eff ("drm/amdgpu: optimize amdgpu_parser_init")
Applied this that comment added.
Thanks!
Alex
Quoted 6 lines
Arnd
_______________________________________________
dri-devel mailing list
dri-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 14 lines · Christian K?nig
Quoted 13 lines · Arnd Bergmann
The new amdgpu driver passes a user space pointer in a 64-bit structure member, which is the correct way to do it, but it attempts to directly cast it to a
__userpointer in the kernel, which causes a warning in three places:
drm/amd/amdgpu/amdgpu_cs.c: In function 'amdgpu_cs_parser_init':drm/amd/amdgpu/amdgpu_cs.c:180:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
chunk_array_user= (uint64_t__user*)(cs->in.chunks);This changes all three to add an intermediate cast to 'unsigned long' as other drivers do. This avoids the warning and works correctly on both 32-bit and 64-bit architectures.
Quoted 8 lines
Quoted 1 line
Signed-off-by Arnd Bergmann <[email protected]>Well if I'm not completely mistaken this is the second time we need to fix this because somebody thought the cast was unnecessary.
Anyway the patch is Reviewed-by: Christian K?nig <[email protected]> and I'm going to keep an eye open for the next time somebody tries to remove this.
We use
static inline void __user *to_user_ptr(u64 address)
{
return (void __user *)(uintptr_t)address;
}to make the intention clear and hide the cast from prying eyes. -Chris
Signature · 1 line
Chris Wilson, Intel Open Source Technology Centre