[PATCH 1/2] drm/amdgpu: Cast to uint64_t before left shift

Christian König ckoenig.leichtzumerken at gmail.com
Tue Nov 27 09:37:45 UTC 2018


Am 26.11.18 um 23:01 schrieb Kuehling, Felix:
> Avoid potential integer overflows with left shift in huge-page mapping
> code by casting the operand to uin64_t first.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index dad0e23..be3e360 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -181,7 +181,7 @@ static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
>   
>   	if (level == adev->vm_manager.root_level)
>   		/* For the root directory */
> -		return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift;
> +		return round_up(adev->vm_manager.max_pfn, 1ULL << shift) >> shift;
>   	else if (level != AMDGPU_VM_PTB)
>   		/* Everything in between */
>   		return 512;
> @@ -1666,10 +1666,10 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
>   		}
>   
>   		/* Looks good so far, calculate parameters for the update */
> -		incr = AMDGPU_GPU_PAGE_SIZE << shift;
> +		incr = (uint64_t)AMDGPU_GPU_PAGE_SIZE << shift;

I wonder if it doesn't make more sense to make the definition of 
AMDGPU_GPU_PAGE_SIZE 64bit?

Anyway the patch is Reviewed-by: Christian König 
<christian.koenig at amd.com> for now.

Regards,
Christian.

>   		mask = amdgpu_vm_entries_mask(adev, cursor.level);
>   		pe_start = ((cursor.pfn >> shift) & mask) * 8;
> -		entry_end = (mask + 1) << shift;
> +		entry_end = (uint64_t)(mask + 1) << shift;
>   		entry_end += cursor.pfn & ~(entry_end - 1);
>   		entry_end = min(entry_end, end);
>   
> @@ -1682,7 +1682,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
>   					      flags | AMDGPU_PTE_FRAG(frag));
>   
>   			pe_start += nptes * 8;
> -			dst += nptes * AMDGPU_GPU_PAGE_SIZE << shift;
> +			dst += (uint64_t)nptes * AMDGPU_GPU_PAGE_SIZE << shift;
>   
>   			frag_start = upd_end;
>   			if (frag_start >= frag_end) {



More information about the amd-gfx mailing list