if destination is on system ram. migrate_vma_pages can fail if a CPU thread faults on the same page. However, the page table is locked and only one of the new pages will be inserted. The device driver will see that the MIGRATE_PFN_MIGRATE bit is cleared if it loses the race.
Signed-off-by: James Zhu <james....@amd.com> --- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index 10e787e47191..1a30764aa91b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -266,9 +266,13 @@ static unsigned long svm_migrate_successful_pages(struct migrate_vma *migrate) unsigned long i; for (i = 0; i < migrate->npages; i++) { - if (migrate->dst[i] & MIGRATE_PFN_VALID && - migrate->src[i] & MIGRATE_PFN_MIGRATE) - mpages++; + if (migrate->dst[i] & MIGRATE_PFN_VALID) { + if (migrate->src[i] & MIGRATE_PFN_MIGRATE) { + mpages++; + } else if (!(migrate->flags & MIGRATE_VMA_SELECT_SYSTEM)) { + svm_migrate_put_sys_page(migrate->dst[i]); + migrate->dst[i] = 0; + } } } return mpages; -- 2.34.1