mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 14:04:27 -04:00
drm/amdkfd: Fix the case that vm range is hole at svm_migrate_copy_to_vram
When migration vm range is hole at cpu side(MIGRATE_PFN_MIGRATE set + MIGRATE_PFN_VALID unset) driver still allocates device pages. There is no dma map of src pages and migration. j is 0 and svm_migrate_copy_memory_gart() will return an uninitialized r. That can trigger out_free_vram_pages to drop all VRAM just set up. Initialize r and only call the last svm_migrate_copy_memory_gart if j > 0. Current code postponed the last page to the final copy. This patch flushes on the last page when reach to the end of current drm_buddy_block; avoids another svm_migrate_copy_memory_gart. Cc: stable@vger.kernel.org Signed-off-by: Xiaogang Chen <xiaogang.chen@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
960c4a8069
commit
520e345ffe
@@ -134,7 +134,7 @@ svm_migrate_copy_memory_gart(struct amdgpu_device *adev, dma_addr_t *sys,
|
||||
u64 gart_s, gart_d;
|
||||
struct dma_fence *next;
|
||||
u64 size;
|
||||
int r;
|
||||
int r = 0;
|
||||
|
||||
ring = to_amdgpu_ring(adev->mman.buffer_funcs_scheds[0]);
|
||||
entity = &adev->mman.move_entities[0];
|
||||
@@ -284,7 +284,7 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
||||
dma_addr_t *src;
|
||||
u64 *dst;
|
||||
u64 i, j;
|
||||
int r;
|
||||
int r = 0;
|
||||
|
||||
pr_debug("svms 0x%p [0x%lx 0x%lx 0x%llx]\n", prange->svms, prange->start,
|
||||
prange->last, ttm_res_offset);
|
||||
@@ -310,6 +310,7 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
||||
DMA_BIDIRECTIONAL);
|
||||
r = dma_mapping_error(dev, src[i]);
|
||||
if (r) {
|
||||
src[i] = 0;
|
||||
dev_err(dev, "%s: fail %d dma_map_page\n",
|
||||
__func__, r);
|
||||
goto out_free_vram_pages;
|
||||
@@ -334,7 +335,8 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
||||
pr_debug_ratelimited("dma mapping src to 0x%llx, pfn 0x%lx\n",
|
||||
src[i] >> PAGE_SHIFT, page_to_pfn(spage));
|
||||
|
||||
if (j >= (cursor.size >> PAGE_SHIFT) - 1 && i < npages - 1) {
|
||||
/* accumulated j + 1 pages reach end of current drm_buddy_block */
|
||||
if (j + 1 >= (cursor.size >> PAGE_SHIFT)) {
|
||||
r = svm_migrate_copy_memory_gart(adev, src + i - j,
|
||||
dst + i - j, j + 1,
|
||||
FROM_RAM_TO_VRAM,
|
||||
@@ -348,7 +350,8 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
|
||||
}
|
||||
}
|
||||
|
||||
r = svm_migrate_copy_memory_gart(adev, src + i - j, dst + i - j, j,
|
||||
if (j > 0)
|
||||
r = svm_migrate_copy_memory_gart(adev, src + i - j, dst + i - j, j,
|
||||
FROM_RAM_TO_VRAM, mfence);
|
||||
|
||||
out_free_vram_pages:
|
||||
|
||||
Reference in New Issue
Block a user