[PATCH 70/95] drm/amdgpu: Use vm->last_update fence in UALink NPA unmap paths
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: Mukul Joshi <[email protected]> amdgpu_ualink_map_npa_addr() already uses vm->last_update as the fence output for amdgpu_vm_update_range(), but the two unmap functions used a local fence variable instead. This is incorrect because amdgpu_vm_update_pdes() always commits into vm->last_update regardless of the fence passed to update_range(). As a result the PDE update job (submitted after the range update) would not wait before the TLB flush. As a result, switch both amdgpu_ualink_unmap_npa_addr() and amdgpu_ualink_unmap_all_npa_addr() to use vm->last_update fence. Signed-off-by: Mukul Joshi <[email protected]> Reviewed-by: Felix Kuehling <[email protected]> Signed-off-by: Alex Deucher <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c index 0edfc685b70f5..68faf2a30e0a1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c @@ -1441,6 +1441,7 @@ static int amdgpu_ualink_unmap_npa_addr(struct amdgpu_device *adev, struct amdgpu_bo *bo, u64 npa_addr, u64 size) { + struct amdgpu_vm *vm = &adev->ualink.npa_vm; uint64_t pte_value = adev->gmc.noretry_flags; struct amdgpu_bo *bos[] = { bo }; struct dma_fence *fence = NULL; @@ -1453,16 +1454,16 @@ static int amdgpu_ualink_unmap_npa_addr(struct amdgpu_device *adev, return r; } - r = amdgpu_vm_update_range(adev, &adev->ualink.npa_vm, false, false, true, + r = amdgpu_vm_update_range(adev, vm, false, false, true, false, NULL, npa_addr, npa_addr + size - 1, - pte_value, 0, 0, NULL, NULL, &fence); + pte_value, 0, 0, NULL, NULL, &vm->last_update); if (r) { dev_err(adev->dev, "Failed to unmap NPA addr (%llx) from NPA VM\n", npa_addr); goto out; } - r = amdgpu_vm_update_pdes(adev, &adev->ualink.npa_vm, false); + r = amdgpu_vm_update_pdes(adev, vm, false); if (r) { dev_err(adev->dev, "Failed %d to update page directories during unmapping NPA: 0x%llx\n", @@ -1470,12 +1471,16 @@ static int amdgpu_ualink_unmap_npa_addr(struct amdgpu_device *adev, goto out; } + fence = dma_fence_get(vm->last_update); if (fence) { r = dma_fence_wait(fence, false); dma_fence_put(fence); fence = NULL; - if (r) + if (r) { + dev_dbg(adev->dev, + "UNMAP-NPA: dma fence wait failed, error: %d\n", r); goto out; + } } amdgpu_ualink_flush_tlb(adev, TLB_FLUSH_HEAVYWEIGHT); @@ -2082,6 +2087,7 @@ static void amdgpu_ualink_send_tlb_shootdown(struct amdgpu_device *adev, static void amdgpu_ualink_unmap_all_npa_addr(struct amdgpu_device *adev, struct amdgpu_ualink_exp_xa_node *exp_xa_node) { + struct amdgpu_vm *vm = &adev->ualink.npa_vm; u32 addr_mode = adev->ualink.info->vpod.addr_mode; struct amdgpu_ualink_importer_entry *imp_entry; u64 pte_value = adev->gmc.noretry_flags; @@ -2120,10 +2126,10 @@ static void amdgpu_ualink_unmap_all_npa_addr(struct amdgpu_device *adev, npa_addr, exp_xa_node->handle.handle_hi, exp_xa_node->handle.handle_lo, remote_acc_id, pte_value); - r = amdgpu_vm_update_range(adev, &adev->ualink.npa_vm, false, + r = amdgpu_vm_update_range(adev, vm, false, false, true, false, NULL, npa_addr, npa_addr + size - 1, pte_value, 0, - 0, NULL, NULL, &fence); + 0, NULL, NULL, &vm->last_update); if (r) dev_err(adev->dev, @@ -2135,7 +2141,7 @@ static void amdgpu_ualink_unmap_all_npa_addr(struct amdgpu_device *adev, break; } - r = amdgpu_vm_update_pdes(adev, &adev->ualink.npa_vm, false); + r = amdgpu_vm_update_pdes(adev, vm, false); if (r) { dev_err(adev->dev, "Failed %d to update page directories during all NPA addresses unmapping\n", @@ -2144,6 +2150,7 @@ static void amdgpu_ualink_unmap_all_npa_addr(struct amdgpu_device *adev, return; } + fence = dma_fence_get(vm->last_update); if (fence) { r = dma_fence_wait(fence, false); dma_fence_put(fence); -- 2.55.0