[PATCH] drm/amdgpu: fix VM sync with always valid BOs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



+Roger,

Roger, this change could also help GuoKai's issue(he needs to pass bo in 
first CS when enabling Per-VM-BOs).


Regards,

David Zhou


On 2017å¹´09æ??08æ?¥ 20:26, Christian König 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;
>
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux