[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