[PATCH] drm/amdgpu: fix max_entries calculation v2

Pan, Xinhui Xinhui.Pan at amd.com
Wed Sep 2 14:53:44 UTC 2020



> 2020年9月2日 22:31,Christian König <ckoenig.leichtzumerken at gmail.com> 写道:
> 
> Am 02.09.20 um 16:27 schrieb Pan, Xinhui:
>> 
>>> 2020年9月2日 22:05,Christian König <ckoenig.leichtzumerken at gmail.com> 写道:
>>> 
>>> Calculate the correct value for max_entries or we might run after the
>>> page_address array.
>>> 
>>> v2: Xinhui pointed out we don't need the shift
>>> 
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> Fixes: 1e691e244487 drm/amdgpu: stop allocating dummy GTT nodes
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>> 
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> index 8bc2253939be..be886bdca5c6 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>>> @@ -1697,7 +1697,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
>>> 				AMDGPU_GPU_PAGES_IN_CPU_PAGE;
>>> 		} else {
>>> 			addr = 0;
>>> -			max_entries = S64_MAX;
>>> +			max_entries = mapping->last - mapping->start + 1;
>> You need minus pfn here.
> 
> That doesn't sound correct either. The pfn is the destination of the mapping, e.g. the offset inside the BO and not related to the virtual address range we map.

I mean we need minus pfn too. pfn is mapping->offset >> PAGE_SHIFT.

In amdgpu_vm_bo_map(), there is a check  below
if (bo && offset + size > amdgpu_bo_size(bo))
return -EINVAL;
so mapping->offset is just an offset_in_bytes inside the BO as you said. 

mapping->start and mapping->last are virtual addresses in pfns, the range we are going to touch then is [start+ offset_in_pfns, last].

> 
>> The range we are going to touch is [start + offset, last].
>> so the max_entries is last - (start + offset) + 1. and offset is pfn in this case.
>> 
>> I still hit panic with this patch in practice.
> 
> Thanks for testing, I think I know what the problem is.
> 
> We need to start instead of mapping->start or otherwise the values is to large after the first iteration.
> 
> Give me a second for a v3.
> 
> Christian.
> 
>> 
>>> 		}
>>> 
>>> 		if (pages_addr) {
>>> -- 
>>> 2.17.1
>>> 
> 



More information about the amd-gfx mailing list