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.y...@amd.com>
---
 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

Reply via email to