mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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 */
 |