[PATCH 07/10] drm/amdkfd: skip migration for pages already in VRAM
Felix Kuehling
felix.kuehling at amd.com
Mon Jun 21 21:01:09 UTC 2021
On 2021-06-21 12:04 p.m., Alex Sierra wrote:
> Migration skipped for pages that are already in VRAM
> domain. These could be the result of previous partial
> migrations to SYS RAM, and prefetch back to VRAM.
> Ex. Coherent pages in VRAM that were not written/invalidated after
> a copy-on-write.
>
> Signed-off-by: Alex Sierra <alex.sierra at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> index 6fd68528c425..8a3f21d76915 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> @@ -329,14 +329,15 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
> for (i = j = 0; i < npages; i++) {
> struct page *spage;
>
> - dst[i] = vram_addr + (j << PAGE_SHIFT);
> - migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
> - svm_migrate_get_vram_page(prange, migrate->dst[i]);
> -
> - migrate->dst[i] = migrate_pfn(migrate->dst[i]);
> - migrate->dst[i] |= MIGRATE_PFN_LOCKED;
> -
> - if (migrate->src[i] & MIGRATE_PFN_VALID) {
> + spage = migrate_pfn_to_page(migrate->src[i]);
> + if (spage && !is_zone_device_page(spage)) {
> + dst[i] = vram_addr + (j << PAGE_SHIFT);
> + migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
> + svm_migrate_get_vram_page(prange, migrate->dst[i]);
> + migrate->dst[i] = migrate_pfn(migrate->dst[i]);
> + migrate->dst[i] |= MIGRATE_PFN_LOCKED;
> + }
> + if (migrate->dst[i] & MIGRATE_PFN_VALID) {
> spage = migrate_pfn_to_page(migrate->src[i]);
I think spage is already set correctly here. You shouldn't need to
assign it again.
Also, is this condition (migrate->dst[i] & MIGRATE_PFN_VALID) really
needed? It seems to me, migrate_pfn sets that flag unconditionally. So
you can just continue the previous if-block.
Regards,
Felix
> src[i] = dma_map_page(dev, spage, 0, PAGE_SIZE,
> DMA_TO_DEVICE);
More information about the amd-gfx
mailing list