On Mon, Nov 5, 2018 at 8:41 PM Kuehling, Felix <Felix.Kuehling@xxxxxxx> wrote: > > From: Harish Kasiviswanathan <Harish.Kasiviswanathan@xxxxxxx> > > PD or PT might have to be moved during validation and this move has to be > completed before updating it. If page table updates are done using SDMA > then this serializing is done by SDMA command submission. > > And if PD/PT updates are done by CPU, then explicit waiting for PD/PT > updates are done in amdgpu VM amdgpu_vm_wait_pd function. > > Sync to PD BO moving fence to handle corner case where none of the PTs > are updated but PD is evicted. > > Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@xxxxxxx> > Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> > Signed-off-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 31 ++++++++++++++++++------ > 1 file changed, 24 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index 9a1b2b2..e124d2d 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -901,6 +901,26 @@ static int process_validate_vms(struct amdkfd_process_info *process_info) > return 0; > } > > +static int process_sync_pds_resv(struct amdkfd_process_info *process_info, > + struct amdgpu_sync *sync) > +{ > + struct amdgpu_vm *peer_vm; > + int ret; > + > + list_for_each_entry(peer_vm, &process_info->vm_list_head, > + vm_list_node) { > + struct amdgpu_bo *pd = peer_vm->root.base.bo; > + > + ret = amdgpu_sync_resv(amdgpu_ttm_adev(pd->tbo.bdev), > + sync, pd->tbo.resv, > + AMDGPU_FENCE_OWNER_UNDEFINED, false); > + if (ret) > + return ret; > + } > + > + return 0; > +} > + > static int process_update_pds(struct amdkfd_process_info *process_info, > struct amdgpu_sync *sync) > { > @@ -2045,13 +2065,10 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence **ef) > if (ret) > goto validate_map_fail; > > - /* Wait for PD/PTs validate to finish */ > - /* FIXME: I think this isn't needed */ > - list_for_each_entry(peer_vm, &process_info->vm_list_head, > - vm_list_node) { > - struct amdgpu_bo *bo = peer_vm->root.base.bo; > - > - ttm_bo_wait(&bo->tbo, false, false); > + ret = process_sync_pds_resv(process_info, &sync_obj); > + if (ret) { > + pr_debug("Memory eviction: Failed to sync to PD BO moving fence. Try again\n"); > + goto validate_map_fail; > } > > /* Validate BOs and map them to GPUVM (update VM page tables). */ > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx