 106c992a5e
			
		
	
	
	106c992a5e
	
	
	
		
			
			Commit abf09bed3c ("s390/mm: implement software dirty bits")
introduced another difference in the pte layout vs.  the pmd layout on
s390, thoroughly breaking the s390 support for hugetlbfs.  This requires
replacing some more pte_xxx functions in mm/hugetlbfs.c with a
huge_pte_xxx version.
This patch introduces those huge_pte_xxx functions and their generic
implementation in asm-generic/hugetlb.h, which will now be included on
all architectures supporting hugetlbfs apart from s390.  This change
will be a no-op for those architectures.
[akpm@linux-foundation.org: fix warning]
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Hugh Dickins <hughd@google.com>
Cc: Hillf Danton <dhillf@gmail.com>
Acked-by: Michal Hocko <mhocko@suse.cz>	[for !s390 parts]
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
	
			
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_SPARC64_HUGETLB_H
 | |
| #define _ASM_SPARC64_HUGETLB_H
 | |
| 
 | |
| #include <asm/page.h>
 | |
| #include <asm-generic/hugetlb.h>
 | |
| 
 | |
| 
 | |
| void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
 | |
| 		     pte_t *ptep, pte_t pte);
 | |
| 
 | |
| pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
 | |
| 			      pte_t *ptep);
 | |
| 
 | |
| static inline void hugetlb_prefault_arch_hook(struct mm_struct *mm)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline int is_hugepage_only_range(struct mm_struct *mm,
 | |
| 					 unsigned long addr,
 | |
| 					 unsigned long len) {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * If the arch doesn't supply something else, assume that hugepage
 | |
|  * size aligned regions are ok without further preparation.
 | |
|  */
 | |
| static inline int prepare_hugepage_range(struct file *file,
 | |
| 			unsigned long addr, unsigned long len)
 | |
| {
 | |
| 	if (len & ~HPAGE_MASK)
 | |
| 		return -EINVAL;
 | |
| 	if (addr & ~HPAGE_MASK)
 | |
| 		return -EINVAL;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static inline void hugetlb_free_pgd_range(struct mmu_gather *tlb,
 | |
| 					  unsigned long addr, unsigned long end,
 | |
| 					  unsigned long floor,
 | |
| 					  unsigned long ceiling)
 | |
| {
 | |
| 	free_pgd_range(tlb, addr, end, floor, ceiling);
 | |
| }
 | |
| 
 | |
| static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
 | |
| 					 unsigned long addr, pte_t *ptep)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline int huge_pte_none(pte_t pte)
 | |
| {
 | |
| 	return pte_none(pte);
 | |
| }
 | |
| 
 | |
| static inline pte_t huge_pte_wrprotect(pte_t pte)
 | |
| {
 | |
| 	return pte_wrprotect(pte);
 | |
| }
 | |
| 
 | |
| static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
 | |
| 					   unsigned long addr, pte_t *ptep)
 | |
| {
 | |
| 	pte_t old_pte = *ptep;
 | |
| 	set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
 | |
| }
 | |
| 
 | |
| static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
 | |
| 					     unsigned long addr, pte_t *ptep,
 | |
| 					     pte_t pte, int dirty)
 | |
| {
 | |
| 	int changed = !pte_same(*ptep, pte);
 | |
| 	if (changed) {
 | |
| 		set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
 | |
| 		flush_tlb_page(vma, addr);
 | |
| 	}
 | |
| 	return changed;
 | |
| }
 | |
| 
 | |
| static inline pte_t huge_ptep_get(pte_t *ptep)
 | |
| {
 | |
| 	return *ptep;
 | |
| }
 | |
| 
 | |
| static inline int arch_prepare_hugepage(struct page *page)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static inline void arch_release_hugepage(struct page *page)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline void arch_clear_hugepage_flags(struct page *page)
 | |
| {
 | |
| }
 | |
| 
 | |
| #endif /* _ASM_SPARC64_HUGETLB_H */
 |