[AMD Official Use Only - AMD Internal Distribution Only] Yes.
Emily Deng Best Wishes >-----Original Message----- >From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Chen, >Xiaogang >Sent: Monday, February 24, 2025 11:40 PM >To: amd-gfx@lists.freedesktop.org >Subject: Re: [PATCH] drm/amdkfd: Correct the postion of reserve and unreserve >memory > > >Is it for fixing the issue you mentioned previously " Fix the deadlock in >svm_range_restore_work"? > >Regards > >Xiaogang > >On 2/20/2025 5:59 AM, Emily Deng wrote: >> Call amdgpu_amdkfd_reserve_mem_limit in svm_range_vram_node_new when >> creating a new SVM BO. Call amdgpu_amdkfd_unreserve_mem_limit in >> svm_range_bo_release when the SVM BO is deleted. >> >> Signed-off-by: Emily Deng <emily.d...@amd.com> >> --- >> drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 13 ------------- >> drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 20 ++++++++++++++++++++ >> 2 files changed, 20 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c >> b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c >> index 79251f22b702..3bbc69751f7e 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c >> @@ -514,15 +514,6 @@ svm_migrate_ram_to_vram(struct svm_range *prange, >uint32_t best_loc, >> start = start_mgr << PAGE_SHIFT; >> end = (last_mgr + 1) << PAGE_SHIFT; >> >> - r = amdgpu_amdkfd_reserve_mem_limit(node->adev, >> - prange->npages * PAGE_SIZE, >> - KFD_IOC_ALLOC_MEM_FLAGS_VRAM, >> - node->xcp ? node->xcp->id : 0); >> - if (r) { >> - dev_dbg(node->adev->dev, "failed to reserve VRAM, r: %ld\n", r); >> - return -ENOSPC; >> - } >> - >> r = svm_range_vram_node_new(node, prange, true); >> if (r) { >> dev_dbg(node->adev->dev, "fail %ld to alloc vram\n", r); @@ >> -560,10 +551,6 @@ svm_migrate_ram_to_vram(struct svm_range *prange, >uint32_t best_loc, >> } >> >> out: >> - amdgpu_amdkfd_unreserve_mem_limit(node->adev, >> - prange->npages * PAGE_SIZE, >> - KFD_IOC_ALLOC_MEM_FLAGS_VRAM, >> - node->xcp ? node->xcp->id : 0); >> return r < 0 ? r : 0; >> } >> >> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> index db3034b00dac..c861d8c90419 100644 >> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c >> @@ -430,6 +430,10 @@ static void svm_range_bo_release(struct kref *kref) >> /* We're not in the eviction worker. Signal the fence. */ >> dma_fence_signal(&svm_bo->eviction_fence->base); >> dma_fence_put(&svm_bo->eviction_fence->base); >> + amdgpu_amdkfd_unreserve_mem_limit(svm_bo->node->adev, >> + svm_bo->bo->tbo.base.size, >> + KFD_IOC_ALLOC_MEM_FLAGS_VRAM, >> + svm_bo->node->xcp ? svm_bo->node->xcp->id : 0); >> amdgpu_bo_unref(&svm_bo->bo); >> kfree(svm_bo); >> } >> @@ -581,6 +585,18 @@ svm_range_vram_node_new(struct kfd_node *node, >struct svm_range *prange, >> kfree(svm_bo); >> return -ESRCH; >> } >> + >> + r = amdgpu_amdkfd_reserve_mem_limit(node->adev, >> + prange->npages * PAGE_SIZE, >> + KFD_IOC_ALLOC_MEM_FLAGS_VRAM, >> + node->xcp ? node->xcp->id : 0); >> + if (r) { >> + pr_debug("failed to reserve VRAM, r: %ld\n", r); >> + mmput(mm); >> + kfree(svm_bo); >> + return -ENOSPC; >> + } >> + >> svm_bo->node = node; >> svm_bo->eviction_fence = >> amdgpu_amdkfd_fence_create(dma_fence_context_alloc(1), >> @@ -655,6 +671,10 @@ svm_range_vram_node_new(struct kfd_node *node, >struct svm_range *prange, >> reserve_bo_failed: >> amdgpu_bo_unref(&bo); >> create_bo_failed: >> + amdgpu_amdkfd_unreserve_mem_limit(svm_bo->node->adev, >> + prange->npages * PAGE_SIZE, >> + KFD_IOC_ALLOC_MEM_FLAGS_VRAM, >> + node->xcp ? node->xcp->id : 0); >> dma_fence_put(&svm_bo->eviction_fence->base); >> kfree(svm_bo); >> prange->ttm_res = NULL;