On 2025-09-09 16:43, James Zhu wrote:
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)) {
just notice migrate.flags is only available #ifdef
HAVE_MIGRATE_VMA_PGMAP_OWNER, check if this is system page instead
if (!is_zone_device_page(pfn_to_page(migrate->dst[i])))
Regards,
Philip
+ svm_migrate_put_sys_page(migrate->dst[i]);
+ migrate->dst[i] = 0;
+ }
}
}
return mpages;