[PATCH -V5 19/25] powerpc/THP: Differentiate THP PMD entries from HUGETLB PMD entries
Aneesh Kumar K.V
aneesh.kumar at linux.vnet.ibm.com
Thu Apr 11 04:26:56 EST 2013
Michael Ellerman <michael at ellerman.id.au> writes:
> On Thu, Apr 04, 2013 at 11:27:57AM +0530, Aneesh Kumar K.V wrote:
>> From: "Aneesh Kumar K.V" <aneesh.kumar at linux.vnet.ibm.com>
>>
>> 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;
More information about the Linuxppc-dev
mailing list