forked from mirrors/linux
		
	mm: Allow arches to provide ptep_get()
Since commit9e343b467c("READ_ONCE: Enforce atomicity for {READ,WRITE}_ONCE() memory accesses") it is not possible anymore to use READ_ONCE() to access complex page table entries like the one defined for powerpc 8xx with 16k size pages. Define a ptep_get() helper that architectures can override instead of performing a READ_ONCE() on the page table entry pointer. Fixes:9e343b467c("READ_ONCE: Enforce atomicity for {READ,WRITE}_ONCE() memory accesses") Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Acked-by: Will Deacon <will@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/087fa12b6e920e32315136b998aa834f99242695.1592225558.git.christophe.leroy@csgroup.eu
This commit is contained in:
		
							parent
							
								
									55ca22633a
								
							
						
					
					
						commit
						481e980a7c
					
				
					 3 changed files with 9 additions and 2 deletions
				
			
		| 
						 | 
					@ -122,7 +122,7 @@ static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
 | 
				
			||||||
#ifndef __HAVE_ARCH_HUGE_PTEP_GET
 | 
					#ifndef __HAVE_ARCH_HUGE_PTEP_GET
 | 
				
			||||||
static inline pte_t huge_ptep_get(pte_t *ptep)
 | 
					static inline pte_t huge_ptep_get(pte_t *ptep)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return READ_ONCE(*ptep);
 | 
						return ptep_get(ptep);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -249,6 +249,13 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __HAVE_ARCH_PTEP_GET
 | 
				
			||||||
 | 
					static inline pte_t ptep_get(pte_t *ptep)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return READ_ONCE(*ptep);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 | 
					#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 | 
				
			||||||
#ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR
 | 
					#ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR
 | 
				
			||||||
static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm,
 | 
					static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								mm/gup.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mm/gup.c
									
									
									
									
									
								
							| 
						 | 
					@ -2196,7 +2196,7 @@ static inline pte_t gup_get_pte(pte_t *ptep)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static inline pte_t gup_get_pte(pte_t *ptep)
 | 
					static inline pte_t gup_get_pte(pte_t *ptep)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return READ_ONCE(*ptep);
 | 
						return ptep_get(ptep);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* CONFIG_GUP_GET_PTE_LOW_HIGH */
 | 
					#endif /* CONFIG_GUP_GET_PTE_LOW_HIGH */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue