[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