Skip to contentSkip to conversation

drm/amdgpu: fix 32-bit compiler warning

PATCH In review Arnd Bergmann 4 participants 5 messages Oct 7, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index cb3c274edb0a..fd16652aa277 100644
@@ -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));
maintainer
#1 lore raw
Quoted 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 __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);

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.

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
index cb3c274edb0a..fd16652aa277 100644
@@ -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));
#2 lore raw
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 __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.

Quoted 9 lines
Quoted 1 line

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

Fixes e60b344f6c0eff ("drm/amdgpu: optimize amdgpu_parser_init")

Arnd

#3 lore raw
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 __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.

Quoted 9 lines
Quoted 1 line

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

#4 lore raw
In reply to Christian König
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 __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.

Quoted 8 lines
Quoted 1 line

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