@@ -140,6 +140,7 @@ static vm_fault_t nouveau_dmem_fault_copy_one(struct nouveau_drm *drm,
140
140
{
141
141
struct device * dev = drm -> dev -> dev ;
142
142
struct page * dpage , * spage ;
143
+ struct nouveau_svmm * svmm ;
143
144
144
145
spage = migrate_pfn_to_page (args -> src [0 ]);
145
146
if (!spage || !(args -> src [0 ] & MIGRATE_PFN_MIGRATE ))
@@ -154,14 +155,19 @@ static vm_fault_t nouveau_dmem_fault_copy_one(struct nouveau_drm *drm,
154
155
if (dma_mapping_error (dev , * dma_addr ))
155
156
goto error_free_page ;
156
157
158
+ svmm = spage -> zone_device_data ;
159
+ mutex_lock (& svmm -> mutex );
160
+ nouveau_svmm_invalidate (svmm , args -> start , args -> end );
157
161
if (drm -> dmem -> migrate .copy_func (drm , 1 , NOUVEAU_APER_HOST , * dma_addr ,
158
162
NOUVEAU_APER_VRAM , nouveau_dmem_page_addr (spage )))
159
163
goto error_dma_unmap ;
164
+ mutex_unlock (& svmm -> mutex );
160
165
161
166
args -> dst [0 ] = migrate_pfn (page_to_pfn (dpage )) | MIGRATE_PFN_LOCKED ;
162
167
return 0 ;
163
168
164
169
error_dma_unmap :
170
+ mutex_unlock (& svmm -> mutex );
165
171
dma_unmap_page (dev , * dma_addr , PAGE_SIZE , DMA_BIDIRECTIONAL );
166
172
error_free_page :
167
173
__free_page (dpage );
@@ -531,7 +537,8 @@ nouveau_dmem_init(struct nouveau_drm *drm)
531
537
}
532
538
533
539
static unsigned long nouveau_dmem_migrate_copy_one (struct nouveau_drm * drm ,
534
- unsigned long src , dma_addr_t * dma_addr , u64 * pfn )
540
+ struct nouveau_svmm * svmm , unsigned long src ,
541
+ dma_addr_t * dma_addr , u64 * pfn )
535
542
{
536
543
struct device * dev = drm -> dev -> dev ;
537
544
struct page * dpage , * spage ;
@@ -561,6 +568,7 @@ static unsigned long nouveau_dmem_migrate_copy_one(struct nouveau_drm *drm,
561
568
goto out_free_page ;
562
569
}
563
570
571
+ dpage -> zone_device_data = svmm ;
564
572
* pfn = NVIF_VMM_PFNMAP_V0_V | NVIF_VMM_PFNMAP_V0_VRAM |
565
573
((paddr >> PAGE_SHIFT ) << NVIF_VMM_PFNMAP_V0_ADDR_SHIFT );
566
574
if (src & MIGRATE_PFN_WRITE )
@@ -584,8 +592,8 @@ static void nouveau_dmem_migrate_chunk(struct nouveau_drm *drm,
584
592
unsigned long addr = args -> start , nr_dma = 0 , i ;
585
593
586
594
for (i = 0 ; addr < args -> end ; i ++ ) {
587
- args -> dst [i ] = nouveau_dmem_migrate_copy_one (drm , args -> src [ i ] ,
588
- dma_addrs + nr_dma , pfns + i );
595
+ args -> dst [i ] = nouveau_dmem_migrate_copy_one (drm , svmm ,
596
+ args -> src [ i ], dma_addrs + nr_dma , pfns + i );
589
597
if (!dma_mapping_error (drm -> dev -> dev , dma_addrs [nr_dma ]))
590
598
nr_dma ++ ;
591
599
addr += PAGE_SIZE ;
@@ -616,6 +624,7 @@ nouveau_dmem_migrate_vma(struct nouveau_drm *drm,
616
624
struct migrate_vma args = {
617
625
.vma = vma ,
618
626
.start = start ,
627
+ .pgmap_owner = drm -> dev ,
619
628
.flags = MIGRATE_VMA_SELECT_SYSTEM ,
620
629
};
621
630
unsigned long i ;
0 commit comments