[PATCH] drm/amdgpu: fix VM sync with always valid BOs
Marek Olšák
maraeo at gmail.com
Fri Sep 8 16:14:38 UTC 2017
The hang seems to be gone with this patch.
Marek
On Fri, Sep 8, 2017 at 2:26 PM, Christian König <deathsimple at vodafone.de> wrote:
> Marek this one will most likely fix your issues with always valid BOs on
> Raven.
>
> Please give it a try when you have time.
>
> Thanks,
> Christian.
>
>
> Am 08.09.2017 um 14:18 schrieb Christian König:
>>
>> From: Christian König <christian.koenig at amd.com>
>>
>> All users of a VM must always wait for updates with always
>> valid BOs to be completed.
>>
>> Signed-off-by: Christian König <christian.koenig at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 14 ++++++++++----
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 ++++++++++-----
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 +-
>> 3 files changed, 21 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> index 8aa37e0..d6e66b7 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> @@ -752,10 +752,6 @@ static int amdgpu_bo_vm_update_pte(struct
>> amdgpu_cs_parser *p)
>> if (r)
>> return r;
>> - r = amdgpu_sync_fence(adev, &p->job->sync, vm->last_dir_update);
>> - if (r)
>> - return r;
>> -
>> r = amdgpu_vm_clear_freed(adev, vm, NULL);
>> if (r)
>> return r;
>> @@ -797,6 +793,10 @@ static int amdgpu_bo_vm_update_pte(struct
>> amdgpu_cs_parser *p)
>> if (bo_va == NULL)
>> continue;
>> + if (bo_va->base.bo->flags &
>> + AMDGPU_GEM_CREATE_VM_ALWAYS_VALID)
>> + continue;
>> +
>> r = amdgpu_vm_bo_update(adev, bo_va, false);
>> if (r)
>> return r;
>> @@ -810,6 +810,12 @@ static int amdgpu_bo_vm_update_pte(struct
>> amdgpu_cs_parser *p)
>> }
>> r = amdgpu_vm_handle_moved(adev, vm, &p->job->sync);
>> + if (r)
>> + return r;
>> +
>> + r = amdgpu_sync_fence(adev, &p->job->sync, vm->mandatory_update);
>> + if (r)
>> + return r;
>> if (amdgpu_vm_debug && p->bo_list) {
>> /* Invalidate all BOs to test for userspace bugs */
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> index 55f1ecb..12c8a4c 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> @@ -1140,9 +1140,8 @@ static int amdgpu_vm_update_level(struct
>> amdgpu_device *adev,
>> goto error_free;
>> amdgpu_bo_fence(parent->base.bo, fence, true);
>> - dma_fence_put(vm->last_dir_update);
>> - vm->last_dir_update = dma_fence_get(fence);
>> - dma_fence_put(fence);
>> + dma_fence_put(vm->mandatory_update);
>> + vm->mandatory_update = fence;
>> }
>> }
>> @@ -1803,6 +1802,12 @@ int amdgpu_vm_bo_update(struct amdgpu_device
>> *adev,
>> trace_amdgpu_vm_bo_mapping(mapping);
>> }
>> + if (bo_va->base.bo &&
>> + bo_va->base.bo->tbo.resv == vm->root.base.bo->tbo.resv) {
>> + dma_fence_put(vm->mandatory_update);
>> + vm->mandatory_update =
>> dma_fence_get(bo_va->last_pt_update);
>> + }
>> +
>> return 0;
>> }
>> @@ -2586,7 +2591,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm,
>> vm->use_cpu_for_update ? "CPU" : "SDMA");
>> WARN_ONCE((vm->use_cpu_for_update &
>> !amdgpu_vm_is_large_bar(adev)),
>> "CPU update of VM recommended only for large BAR
>> system\n");
>> - vm->last_dir_update = NULL;
>> + vm->mandatory_update = NULL;
>> flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
>> AMDGPU_GEM_CREATE_VRAM_CLEARED;
>> @@ -2692,7 +2697,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm)
>> }
>> amdgpu_vm_free_levels(&vm->root);
>> - dma_fence_put(vm->last_dir_update);
>> + dma_fence_put(vm->mandatory_update);
>> for (i = 0; i < AMDGPU_MAX_VMHUBS; i++)
>> amdgpu_vm_free_reserved_vmid(adev, vm, i);
>> }
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> index c1accd1..63fa2e5 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> @@ -140,7 +140,7 @@ struct amdgpu_vm {
>> /* contains the page directory */
>> struct amdgpu_vm_pt root;
>> - struct dma_fence *last_dir_update;
>> + struct dma_fence *mandatory_update;
>> /* protecting freed */
>> spinlock_t freed_lock;
>
>
>
More information about the amd-gfx
mailing list