[PATCH 2/2] drm/amdkfd: add svm_migrate_successful_pages
Philip Yang
yangp at amd.com
Wed May 28 21:06:38 UTC 2025
On 2025-05-28 13:19, James Zhu wrote:
> to get migration pages. When migrating pages from system to vram,
> needn't check bit MIGRATE_PFN_VALID, since the system page could
> be allocated, but not be accessed.
I think the corner case is vram_pages becomes negative value when
migrating prange from vram to system memory, if the src page is on
system, src MIGRATE_PFN_MIGRATE set, MIGRATE_PFN_VALID not set, this
count as successful migrate page by svm_migrate_unsuccessful_page.
As discussed offline, we could check dst MIGRATE_PFN_MIGRATE flag for
both system to vram or vram to system cases.
Regards,
Philip
>
> Signed-off-by: James Zhu <James.Zhu at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 25 ++++++++++++------------
> 1 file changed, 13 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> index f0b690d4bb46..131838bf8751 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> @@ -260,17 +260,20 @@ static void svm_migrate_put_sys_page(unsigned long addr)
> put_page(page);
> }
>
> -static unsigned long svm_migrate_unsuccessful_pages(struct migrate_vma *migrate)
> +static unsigned long svm_migrate_successful_pages(struct migrate_vma *migrate)
> {
> - unsigned long upages = 0;
> + unsigned long mpages = 0;
> unsigned long i;
>
> for (i = 0; i < migrate->npages; i++) {
> - if (migrate->src[i] & MIGRATE_PFN_VALID &&
> - !(migrate->src[i] & MIGRATE_PFN_MIGRATE))
> - upages++;
> + if (migrate->flags == MIGRATE_VMA_SELECT_SYSTEM &&
> + migrate->src[i] & MIGRATE_PFN_MIGRATE)
> + mpages++;
> + else if (migrate->src[i] & MIGRATE_PFN_VALID &&
> + migrate->src[i] & MIGRATE_PFN_MIGRATE)
> + mpages++;
> }
> - return upages;
> + return mpages;
> }
>
> static int
> @@ -447,7 +450,7 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct svm_range *prange,
> svm_migrate_copy_done(adev, mfence);
> migrate_vma_finalize(&migrate);
>
> - mpages = cpages - svm_migrate_unsuccessful_pages(&migrate);
> + mpages = svm_migrate_successful_pages(&migrate);
> pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n",
> mpages, cpages, migrate.npages);
>
> @@ -688,7 +691,6 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct svm_range *prange,
> {
> struct kfd_process *p = container_of(prange->svms, struct kfd_process, svms);
> uint64_t npages = (end - start) >> PAGE_SHIFT;
> - unsigned long upages = npages;
> unsigned long cpages = 0;
> unsigned long mpages = 0;
> struct amdgpu_device *adev = node->adev;
> @@ -748,9 +750,9 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct svm_range *prange,
> scratch, npages);
> migrate_vma_pages(&migrate);
>
> - upages = svm_migrate_unsuccessful_pages(&migrate);
> - pr_debug("unsuccessful/cpages/npages 0x%lx/0x%lx/0x%lx\n",
> - upages, cpages, migrate.npages);
> + mpages = svm_migrate_successful_pages(&migrate);
> + pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n",
> + mpages, cpages, migrate.npages);
>
> svm_migrate_copy_done(adev, mfence);
> migrate_vma_finalize(&migrate);
> @@ -764,7 +766,6 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct svm_range *prange,
> node->id, 0, trigger, r);
> out:
> if (!r && cpages) {
> - mpages = cpages - upages;
> pdd = svm_range_get_pdd_by_node(prange, node);
> if (pdd)
> WRITE_ONCE(pdd->page_out, pdd->page_out + mpages);
More information about the amd-gfx
mailing list