Skip to content

Commit 278a708

Browse files
alexsierragalexdeucher
authored andcommitted
drm/amdkfd: use hmm range fault to get both domain pfns
Now that prange could have mixed domains (VRAM or SYSRAM), actual_loc nor svm_bo can not be used to check its current domain and eventually get its pfns to map them in GPU. Instead, pfns from both domains, are now obtained from hmm_range_fault through amdgpu_hmm_range_get_pages call. This is done everytime a GPU map occur. Signed-off-by: Alex Sierra <alex.sierra@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 1fc160c commit 278a708

1 file changed

Lines changed: 27 additions & 41 deletions

File tree

drivers/gpu/drm/amd/amdkfd/kfd_svm.c

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,42 +1426,38 @@ static int svm_range_validate_and_map(struct mm_struct *mm,
14261426

14271427
svm_range_reserve_bos(&ctx);
14281428

1429-
if (!prange->actual_loc) {
1430-
p = container_of(prange->svms, struct kfd_process, svms);
1431-
owner = kfd_svm_page_owner(p, find_first_bit(ctx.bitmap,
1432-
MAX_GPU_INSTANCE));
1433-
for_each_set_bit(idx, ctx.bitmap, MAX_GPU_INSTANCE) {
1434-
if (kfd_svm_page_owner(p, idx) != owner) {
1435-
owner = NULL;
1436-
break;
1437-
}
1438-
}
1439-
r = amdgpu_hmm_range_get_pages(&prange->notifier, mm, NULL,
1440-
prange->start << PAGE_SHIFT,
1441-
prange->npages, &hmm_range,
1442-
false, true, owner);
1443-
if (r) {
1444-
pr_debug("failed %d to get svm range pages\n", r);
1445-
goto unreserve_out;
1446-
}
1447-
1448-
r = svm_range_dma_map(prange, ctx.bitmap,
1449-
hmm_range->hmm_pfns);
1450-
if (r) {
1451-
pr_debug("failed %d to dma map range\n", r);
1452-
goto unreserve_out;
1429+
p = container_of(prange->svms, struct kfd_process, svms);
1430+
owner = kfd_svm_page_owner(p, find_first_bit(ctx.bitmap,
1431+
MAX_GPU_INSTANCE));
1432+
for_each_set_bit(idx, ctx.bitmap, MAX_GPU_INSTANCE) {
1433+
if (kfd_svm_page_owner(p, idx) != owner) {
1434+
owner = NULL;
1435+
break;
14531436
}
1437+
}
1438+
r = amdgpu_hmm_range_get_pages(&prange->notifier, mm, NULL,
1439+
prange->start << PAGE_SHIFT,
1440+
prange->npages, &hmm_range,
1441+
false, true, owner);
1442+
if (r) {
1443+
pr_debug("failed %d to get svm range pages\n", r);
1444+
goto unreserve_out;
1445+
}
14541446

1455-
prange->validated_once = true;
1447+
r = svm_range_dma_map(prange, ctx.bitmap,
1448+
hmm_range->hmm_pfns);
1449+
if (r) {
1450+
pr_debug("failed %d to dma map range\n", r);
1451+
goto unreserve_out;
14561452
}
14571453

1454+
prange->validated_once = true;
1455+
14581456
svm_range_lock(prange);
1459-
if (!prange->actual_loc) {
1460-
if (amdgpu_hmm_range_get_pages_done(hmm_range)) {
1461-
pr_debug("hmm update the range, need validate again\n");
1462-
r = -EAGAIN;
1463-
goto unlock_out;
1464-
}
1457+
if (amdgpu_hmm_range_get_pages_done(hmm_range)) {
1458+
pr_debug("hmm update the range, need validate again\n");
1459+
r = -EAGAIN;
1460+
goto unlock_out;
14651461
}
14661462
if (!list_empty(&prange->child_list)) {
14671463
pr_debug("range split by unmap in parallel, validate again\n");
@@ -2797,16 +2793,6 @@ svm_range_trigger_migration(struct mm_struct *mm, struct svm_range *prange,
27972793
best_loc == prange->actual_loc)
27982794
return 0;
27992795

2800-
/*
2801-
* Prefetch to GPU without host access flag, set actual_loc to gpu, then
2802-
* validate on gpu and map to gpus will be handled afterwards.
2803-
*/
2804-
if (best_loc && !prange->actual_loc &&
2805-
!(prange->flags & KFD_IOCTL_SVM_FLAG_HOST_ACCESS)) {
2806-
prange->actual_loc = best_loc;
2807-
return 0;
2808-
}
2809-
28102796
if (!best_loc) {
28112797
r = svm_migrate_vram_to_ram(prange, mm);
28122798
*migrated = !r;

0 commit comments

Comments
 (0)