@@ -6341,34 +6341,34 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
6341
6341
resource_size_t phys_addr ;
6342
6342
unsigned long prot = 0 ;
6343
6343
void __iomem * maddr ;
6344
- pte_t * ptep , pte ;
6345
- spinlock_t * ptl ;
6346
6344
int offset = offset_in_page (addr );
6347
6345
int ret = - EINVAL ;
6346
+ bool writable ;
6347
+ struct follow_pfnmap_args args = { .vma = vma , .address = addr };
6348
6348
6349
6349
retry :
6350
- if (follow_pte ( vma , addr , & ptep , & ptl ))
6350
+ if (follow_pfnmap_start ( & args ))
6351
6351
return - EINVAL ;
6352
- pte = ptep_get (ptep );
6353
- pte_unmap_unlock (ptep , ptl );
6352
+ prot = pgprot_val (args .pgprot );
6353
+ phys_addr = (resource_size_t )args .pfn << PAGE_SHIFT ;
6354
+ writable = args .writable ;
6355
+ follow_pfnmap_end (& args );
6354
6356
6355
- prot = pgprot_val (pte_pgprot (pte ));
6356
- phys_addr = (resource_size_t )pte_pfn (pte ) << PAGE_SHIFT ;
6357
-
6358
- if ((write & FOLL_WRITE ) && !pte_write (pte ))
6357
+ if ((write & FOLL_WRITE ) && !writable )
6359
6358
return - EINVAL ;
6360
6359
6361
6360
maddr = ioremap_prot (phys_addr , PAGE_ALIGN (len + offset ), prot );
6362
6361
if (!maddr )
6363
6362
return - ENOMEM ;
6364
6363
6365
- if (follow_pte ( vma , addr , & ptep , & ptl ))
6364
+ if (follow_pfnmap_start ( & args ))
6366
6365
goto out_unmap ;
6367
6366
6368
- if (!pte_same (pte , ptep_get (ptep ))) {
6369
- pte_unmap_unlock (ptep , ptl );
6367
+ if ((prot != pgprot_val (args .pgprot )) ||
6368
+ (phys_addr != (args .pfn << PAGE_SHIFT )) ||
6369
+ (writable != args .writable )) {
6370
+ follow_pfnmap_end (& args );
6370
6371
iounmap (maddr );
6371
-
6372
6372
goto retry ;
6373
6373
}
6374
6374
@@ -6377,7 +6377,7 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
6377
6377
else
6378
6378
memcpy_fromio (buf , maddr + offset , len );
6379
6379
ret = len ;
6380
- pte_unmap_unlock ( ptep , ptl );
6380
+ follow_pfnmap_end ( & args );
6381
6381
out_unmap :
6382
6382
iounmap (maddr );
6383
6383
0 commit comments