@@ -372,7 +372,6 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
372372 size_t size ;
373373 void * buf ;
374374 int r = - ENOMEM ;
375- int retry = 0 ;
376375
377376 memset (& migrate , 0 , sizeof (migrate ));
378377 migrate .vma = vma ;
@@ -391,25 +390,16 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
391390 migrate .dst = migrate .src + npages ;
392391 scratch = (dma_addr_t * )(migrate .dst + npages );
393392
394- retry :
395393 r = migrate_vma_setup (& migrate );
396394 if (r ) {
397395 pr_debug ("failed %d prepare migrate svms 0x%p [0x%lx 0x%lx]\n" ,
398396 r , prange -> svms , prange -> start , prange -> last );
399397 goto out_free ;
400398 }
401399 if (migrate .cpages != npages ) {
402- pr_debug ("collect 0x%lx/0x%llx pages, retry\n" , migrate .cpages ,
400+ pr_debug ("Partial migration. 0x%lx/0x%llx pages can be migrated\n" ,
401+ migrate .cpages ,
403402 npages );
404- migrate_vma_finalize (& migrate );
405- if (retry ++ >= 3 ) {
406- r = - ENOMEM ;
407- pr_debug ("failed %d migrate svms 0x%p [0x%lx 0x%lx]\n" ,
408- r , prange -> svms , prange -> start , prange -> last );
409- goto out_free ;
410- }
411-
412- goto retry ;
413403 }
414404
415405 if (migrate .cpages ) {
@@ -506,9 +496,8 @@ static void svm_migrate_page_free(struct page *page)
506496static int
507497svm_migrate_copy_to_ram (struct amdgpu_device * adev , struct svm_range * prange ,
508498 struct migrate_vma * migrate , struct dma_fence * * mfence ,
509- dma_addr_t * scratch )
499+ dma_addr_t * scratch , uint64_t npages )
510500{
511- uint64_t npages = migrate -> cpages ;
512501 struct device * dev = adev -> dev ;
513502 uint64_t * src ;
514503 dma_addr_t * dst ;
@@ -525,15 +514,23 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange,
525514 src = (uint64_t * )(scratch + npages );
526515 dst = scratch ;
527516
528- for (i = 0 , j = 0 ; i < npages ; i ++ , j ++ , addr += PAGE_SIZE ) {
517+ for (i = 0 , j = 0 ; i < npages ; i ++ , addr += PAGE_SIZE ) {
529518 struct page * spage ;
530519
531520 spage = migrate_pfn_to_page (migrate -> src [i ]);
532- if (!spage ) {
533- pr_debug ("failed get spage svms 0x%p [0x%lx 0x%lx]\n" ,
521+ if (!spage || ! is_zone_device_page ( spage ) ) {
522+ pr_debug ("invalid page. Could be in CPU already svms 0x%p [0x%lx 0x%lx]\n" ,
534523 prange -> svms , prange -> start , prange -> last );
535- r = - ENOMEM ;
536- goto out_oom ;
524+ if (j ) {
525+ r = svm_migrate_copy_memory_gart (adev , dst + i - j ,
526+ src + i - j , j ,
527+ FROM_VRAM_TO_RAM ,
528+ mfence );
529+ if (r )
530+ goto out_oom ;
531+ j = 0 ;
532+ }
533+ continue ;
537534 }
538535 src [i ] = svm_migrate_addr (adev , spage );
539536 if (i > 0 && src [i ] != src [i - 1 ] + PAGE_SIZE ) {
@@ -566,6 +563,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange,
566563
567564 migrate -> dst [i ] = migrate_pfn (page_to_pfn (dpage ));
568565 migrate -> dst [i ] |= MIGRATE_PFN_LOCKED ;
566+ j ++ ;
569567 }
570568
571569 r = svm_migrate_copy_memory_gart (adev , dst + i - j , src + i - j , j ,
@@ -624,7 +622,7 @@ svm_migrate_vma_to_ram(struct amdgpu_device *adev, struct svm_range *prange,
624622
625623 if (migrate .cpages ) {
626624 r = svm_migrate_copy_to_ram (adev , prange , & migrate , & mfence ,
627- scratch );
625+ scratch , npages );
628626 migrate_vma_pages (& migrate );
629627 svm_migrate_copy_done (adev , mfence );
630628 migrate_vma_finalize (& migrate );
0 commit comments