 2679494246
			
		
	
	
	2679494246
	
	
	
		
			
			The include/asm-generic/hugetlb.h stubs that just vector huge_pte_*() calls to the pte_*() implementations won't work in certain situations. x86 and sparc, for example, return "unsigned long" from the bit checks, and just go "return pte_val(pte) & PTE_BIT_FOO;" But since huge_pte_*() returns 'int', if any high bits on 64-bit are relevant, they get chopped off. The net effect is that we can loop forever trying to COW a huge page, because the huge_pte_write() check signals false all the time. Reported-by: Gurudas Pai <gurudas.pai@oracle.com> Tested-by: Gurudas Pai <gurudas.pai@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: David Rientjes <rientjes@google.com>
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			758 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			758 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_GENERIC_HUGETLB_H
 | |
| #define _ASM_GENERIC_HUGETLB_H
 | |
| 
 | |
| static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot)
 | |
| {
 | |
| 	return mk_pte(page, pgprot);
 | |
| }
 | |
| 
 | |
| static inline unsigned long huge_pte_write(pte_t pte)
 | |
| {
 | |
| 	return pte_write(pte);
 | |
| }
 | |
| 
 | |
| static inline unsigned long huge_pte_dirty(pte_t pte)
 | |
| {
 | |
| 	return pte_dirty(pte);
 | |
| }
 | |
| 
 | |
| static inline pte_t huge_pte_mkwrite(pte_t pte)
 | |
| {
 | |
| 	return pte_mkwrite(pte);
 | |
| }
 | |
| 
 | |
| static inline pte_t huge_pte_mkdirty(pte_t pte)
 | |
| {
 | |
| 	return pte_mkdirty(pte);
 | |
| }
 | |
| 
 | |
| static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot)
 | |
| {
 | |
| 	return pte_modify(pte, newprot);
 | |
| }
 | |
| 
 | |
| static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
 | |
| 				  pte_t *ptep)
 | |
| {
 | |
| 	pte_clear(mm, addr, ptep);
 | |
| }
 | |
| 
 | |
| #endif /* _ASM_GENERIC_HUGETLB_H */
 |