@@ -372,7 +372,6 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
372
372
size_t size ;
373
373
void * buf ;
374
374
int r = - ENOMEM ;
375
- int retry = 0 ;
376
375
377
376
memset (& migrate , 0 , sizeof (migrate ));
378
377
migrate .vma = vma ;
@@ -391,25 +390,16 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
391
390
migrate .dst = migrate .src + npages ;
392
391
scratch = (dma_addr_t * )(migrate .dst + npages );
393
392
394
- retry :
395
393
r = migrate_vma_setup (& migrate );
396
394
if (r ) {
397
395
pr_debug ("failed %d prepare migrate svms 0x%p [0x%lx 0x%lx]\n" ,
398
396
r , prange -> svms , prange -> start , prange -> last );
399
397
goto out_free ;
400
398
}
401
399
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 ,
403
402
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 ;
413
403
}
414
404
415
405
if (migrate .cpages ) {
@@ -506,9 +496,8 @@ static void svm_migrate_page_free(struct page *page)
506
496
static int
507
497
svm_migrate_copy_to_ram (struct amdgpu_device * adev , struct svm_range * prange ,
508
498
struct migrate_vma * migrate , struct dma_fence * * mfence ,
509
- dma_addr_t * scratch )
499
+ dma_addr_t * scratch , uint64_t npages )
510
500
{
511
- uint64_t npages = migrate -> cpages ;
512
501
struct device * dev = adev -> dev ;
513
502
uint64_t * src ;
514
503
dma_addr_t * dst ;
@@ -525,15 +514,23 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange,
525
514
src = (uint64_t * )(scratch + npages );
526
515
dst = scratch ;
527
516
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 ) {
529
518
struct page * spage ;
530
519
531
520
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" ,
534
523
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 ;
537
534
}
538
535
src [i ] = svm_migrate_addr (adev , spage );
539
536
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,
566
563
567
564
migrate -> dst [i ] = migrate_pfn (page_to_pfn (dpage ));
568
565
migrate -> dst [i ] |= MIGRATE_PFN_LOCKED ;
566
+ j ++ ;
569
567
}
570
568
571
569
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,
624
622
625
623
if (migrate .cpages ) {
626
624
r = svm_migrate_copy_to_ram (adev , prange , & migrate , & mfence ,
627
- scratch );
625
+ scratch , npages );
628
626
migrate_vma_pages (& migrate );
629
627
svm_migrate_copy_done (adev , mfence );
630
628
migrate_vma_finalize (& migrate );
0 commit comments