mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
drm/amdkfd: Get prange->offset after svm_range_vram_node_new
During miration to vram prange->offset is valid after vram buffer is located,
either use old one or allocate a new one. Move svm_range_vram_node_new before
migrate for each vma to get valid prange->offset.
v2: squash in warning fix
Fixes: b4ee960637
("drm/amdkfd: Fix BO offset for multi-VMA page migration")
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:
parent
b4ee960637
commit
8eeddc0d42
1 changed files with 9 additions and 7 deletions
|
@ -305,12 +305,6 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
|
||||||
src = scratch;
|
src = scratch;
|
||||||
dst = (uint64_t *)(scratch + npages);
|
dst = (uint64_t *)(scratch + npages);
|
||||||
|
|
||||||
r = svm_range_vram_node_new(adev, prange, true);
|
|
||||||
if (r) {
|
|
||||||
dev_dbg(adev->dev, "fail %d to alloc vram\n", r);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
amdgpu_res_first(prange->ttm_res, ttm_res_offset,
|
amdgpu_res_first(prange->ttm_res, ttm_res_offset,
|
||||||
npages << PAGE_SHIFT, &cursor);
|
npages << PAGE_SHIFT, &cursor);
|
||||||
for (i = j = 0; i < npages; i++) {
|
for (i = j = 0; i < npages; i++) {
|
||||||
|
@ -391,7 +385,7 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
|
||||||
migrate->dst[i + 3] = 0;
|
migrate->dst[i + 3] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
out:
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,6 +514,12 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,
|
||||||
|
|
||||||
start = prange->start << PAGE_SHIFT;
|
start = prange->start << PAGE_SHIFT;
|
||||||
end = (prange->last + 1) << PAGE_SHIFT;
|
end = (prange->last + 1) << PAGE_SHIFT;
|
||||||
|
|
||||||
|
r = svm_range_vram_node_new(adev, prange, true);
|
||||||
|
if (r) {
|
||||||
|
dev_dbg(adev->dev, "fail %ld to alloc vram\n", r);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
ttm_res_offset = prange->offset << PAGE_SHIFT;
|
ttm_res_offset = prange->offset << PAGE_SHIFT;
|
||||||
|
|
||||||
for (addr = start; addr < end;) {
|
for (addr = start; addr < end;) {
|
||||||
|
@ -543,6 +543,8 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,
|
||||||
|
|
||||||
if (cpages)
|
if (cpages)
|
||||||
prange->actual_loc = best_loc;
|
prange->actual_loc = best_loc;
|
||||||
|
else
|
||||||
|
svm_range_vram_node_free(prange);
|
||||||
|
|
||||||
return r < 0 ? r : 0;
|
return r < 0 ? r : 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue