Update huge page mapping, ex 2MB address and size aligned, we alloc PTB bo, and then free the PTB bo after updating PDE0 as PTE. If fragment size >= parent_shift, don't alloc PT bo, because we will update PDE entry, this will improve the huge page mapping update by removing the extra PTB bo alloc and free. Signed-off-by: Philip Yang <Philip.Yang@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c index a3d609655ce3..ef3ef03e50ab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c @@ -916,7 +916,11 @@ int amdgpu_vm_ptes_update(struct amdgpu_vm_update_params *params, uint64_t incr, entry_end, pe_start; struct amdgpu_bo *pt; - if (!params->unlocked) { + shift = amdgpu_vm_pt_level_shift(adev, cursor.level); + parent_shift = amdgpu_vm_pt_level_shift(adev, cursor.level - 1); + + if (!params->unlocked && + (adev->asic_type < CHIP_VEGA10 || frag < parent_shift)) { /* make sure that the page tables covering the * address range are actually allocated */ @@ -926,8 +930,6 @@ int amdgpu_vm_ptes_update(struct amdgpu_vm_update_params *params, return r; } - shift = amdgpu_vm_pt_level_shift(adev, cursor.level); - parent_shift = amdgpu_vm_pt_level_shift(adev, cursor.level - 1); if (params->unlocked) { /* Unlocked updates are only allowed on the leaves */ if (amdgpu_vm_pt_descendant(adev, &cursor)) -- 2.35.1