Michael Ellerman <michael@xxxxxxxxxxxxxx> writes: > On Thu, Apr 04, 2013 at 11:27:57AM +0530, Aneesh Kumar K.V wrote: >> From: "Aneesh Kumar K.V" <aneesh.kumar@xxxxxxxxxxxxxxxxxx> >> >> HUGETLB clear the top bit of PMD entries and use that to indicate >> a HUGETLB page directory. Since we store pfns in PMDs for THP, >> we would have the top bit cleared by default. Add the top bit mask >> for THP PMD entries and clear that when we are looking for pmd_pfn. >> >> @@ -44,6 +44,14 @@ struct mm_struct; >> #define PMD_HUGE_RPN_SHIFT PTE_RPN_SHIFT >> #define HUGE_PAGE_SIZE (ASM_CONST(1) << 24) >> #define HUGE_PAGE_MASK (~(HUGE_PAGE_SIZE - 1)) >> +/* >> + * HugeTLB looks at the top bit of the Linux page table entries to >> + * decide whether it is a huge page directory or not. Mark HUGE >> + * PMD to differentiate >> + */ >> +#define PMD_HUGE_NOT_HUGETLB (ASM_CONST(1) << 63) >> +#define PMD_ISHUGE (_PMD_ISHUGE | PMD_HUGE_NOT_HUGETLB) >> +#define PMD_HUGE_PROTBITS (0xfff | PMD_HUGE_NOT_HUGETLB) >> >> #ifndef __ASSEMBLY__ >> extern void hpte_need_hugepage_flush(struct mm_struct *mm, unsigned long addr, >> @@ -84,7 +93,8 @@ static inline unsigned long pmd_pfn(pmd_t pmd) >> /* >> * Only called for hugepage pmd >> */ >> - return pmd_val(pmd) >> PMD_HUGE_RPN_SHIFT; >> + unsigned long val = pmd_val(pmd) & ~PMD_HUGE_PROTBITS; >> + return val >> PMD_HUGE_RPN_SHIFT; >> } > > This is breaking the 32-bit build for me (pmac32_defconfig): > > arch/powerpc/include/asm/pgtable.h:123:2: error: left shift count >= width of type [-Werror] > diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index 5617dee..30c765a 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h @@ -110,11 +110,6 @@ static inline int has_transparent_hugepage(void) return 1; } -#else -#define pmd_large(pmd) 0 -#define has_transparent_hugepage() 0 -#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ - static inline unsigned long pmd_pfn(pmd_t pmd) { /* @@ -124,6 +119,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd) return val >> PMD_HUGE_RPN_SHIFT; } +#else +#define pmd_large(pmd) 0 +#define has_transparent_hugepage() 0 +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + static inline int pmd_young(pmd_t pmd) { return pmd_val(pmd) & PMD_HUGE_ACCESSED; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>