[PATCH 1/1] drm/amdgpu: Wait for newly allocated PTs to be idle
Kuehling, Felix
Felix.Kuehling at amd.com
Tue Mar 12 23:36:55 UTC 2019
When we use SDMA, we don't wait on the CPU. The GPU scheduler waits for
the fences on the root PD reservation before executing the SDMA IB.
amdgpu_vm_bo_update_mapping gets those fences and builds the sync object
for the scheduler after all the page tables have been allocated, so it
should be no problem.
Regards,
Felix
On 2019-03-12 6:13 p.m., Liu, Shaoyun wrote:
> Hi,
>
> I think even use SDMA to update PTE we may still need to wait the clear
> job to be completed if we can not guarantee the clear and set PTE job
> will use the exact same SDMA engine ( Did we use a dedicate SDMA engine
> for PTE update including clear? ). But if we didn't use the same
> engine , it may explain why the test failed occasionally.
>
> Regards
>
> shaoyun.liu
>
>
>
> On 2019-03-12 5:20 p.m., Kuehling, Felix wrote:
>> When page table are updated by the CPU, synchronize with the
>> allocation and initialization of newly allocated page tables.
>>
>> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 20 +++++++++++++-------
>> 1 file changed, 13 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> index 8603c85..4303436 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> @@ -899,17 +899,17 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,
>> }
>>
>> /**
>> - * amdgpu_vm_alloc_pts - Allocate page tables.
>> + * amdgpu_vm_alloc_pts - Allocate a specific page table
>> *
>> * @adev: amdgpu_device pointer
>> * @vm: VM to allocate page tables for
>> - * @saddr: Start address which needs to be allocated
>> - * @size: Size from start address we need.
>> + * @cursor: Which page table to allocate
>> *
>> - * Make sure the page directories and page tables are allocated
>> + * Make sure a specific page table or directory is allocated.
>> *
>> * Returns:
>> - * 0 on success, errno otherwise.
>> + * 1 if page table needed to be allocated, 0 if page table was already
>> + * allocated, negative errno if an error occurred.
>> */
>> static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm,
>> @@ -956,7 +956,7 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>> if (r)
>> goto error_free_pt;
>>
>> - return 0;
>> + return 1;
>>
>> error_free_pt:
>> amdgpu_bo_unref(&pt->shadow);
>> @@ -1621,10 +1621,12 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
>> unsigned shift, parent_shift, mask;
>> uint64_t incr, entry_end, pe_start;
>> struct amdgpu_bo *pt;
>> + bool need_to_sync;
>>
>> r = amdgpu_vm_alloc_pts(params->adev, params->vm, &cursor);
>> - if (r)
>> + if (r < 0)
>> return r;
>> + need_to_sync = (r && params->vm->use_cpu_for_update);
>>
>> pt = cursor.entry->base.bo;
>>
>> @@ -1672,6 +1674,10 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
>> entry_end += cursor.pfn & ~(entry_end - 1);
>> entry_end = min(entry_end, end);
>>
>> + if (need_to_sync)
>> + r = amdgpu_bo_sync_wait(params->vm->root.base.bo,
>> + AMDGPU_FENCE_OWNER_VM, true);
>> +
>> do {
>> uint64_t upd_end = min(entry_end, frag_end);
>> unsigned nptes = (upd_end - frag_start) >> shift;
More information about the amd-gfx
mailing list