powerpc/mm: Use page fragments for allocation page table at PMD level
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Mon, 16 Apr 2018 11:27:23 +0000 (16:57 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 15 May 2018 12:29:12 +0000 (22:29 +1000)
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/book3s/64/hash.h
arch/powerpc/include/asm/book3s/64/pgalloc.h
arch/powerpc/include/asm/book3s/64/pgtable.h
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/pgtable-book3s64.c
arch/powerpc/mm/pgtable-radix.c
arch/powerpc/mm/pgtable_64.c

index cc8cd656ccfe9fb80bc67e15ce3cc45c7e74be16..0387b155f13de95831937cf2bc7b777e51a7fa64 100644 (file)
                                 H_PUD_INDEX_SIZE + H_PGD_INDEX_SIZE + PAGE_SHIFT)
 #define H_PGTABLE_RANGE                (ASM_CONST(1) << H_PGTABLE_EADDR_SIZE)
 
-#if (defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLB_PAGE)) && \
-       defined(CONFIG_PPC_64K_PAGES)
-/*
- * only with hash 64k we need to use the second half of pmd page table
- * to store pointer to deposited pgtable_t
- */
-#define H_PMD_CACHE_INDEX      (H_PMD_INDEX_SIZE + 1)
-#else
-#define H_PMD_CACHE_INDEX      H_PMD_INDEX_SIZE
-#endif
 /*
  * We store the slot details in the second half of page table.
  * Increase the pud level table so that hugetlb ptes can be stored
index 005f400cbf308ce0886925b9871e0f2464838f42..01ee40f11f3a1e75a2c3788add486d3329a6e5fd 100644 (file)
@@ -90,8 +90,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
         * need to do this for 4k.
         */
 #if defined(CONFIG_HUGETLB_PAGE) && defined(CONFIG_PPC_64K_PAGES) && \
-       ((H_PGD_INDEX_SIZE == H_PUD_CACHE_INDEX) ||                  \
-        (H_PGD_INDEX_SIZE == H_PMD_CACHE_INDEX))
+       (H_PGD_INDEX_SIZE == H_PUD_CACHE_INDEX)
        memset(pgd, 0, PGD_TABLE_SIZE);
 #endif
        return pgd;
@@ -138,13 +137,12 @@ static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
 
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
 {
-       return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX),
-               pgtable_gfp_flags(mm, GFP_KERNEL));
+       return pmd_fragment_alloc(mm, addr);
 }
 
 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
 {
-       kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd);
+       pmd_fragment_free((unsigned long *)pmd);
 }
 
 static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
index c9db19512b3cbe17cc57cb7b0591ab68068e93e1..c233915abb68ea7698950cf17b14d9e31fc2ed06 100644 (file)
@@ -212,13 +212,13 @@ extern unsigned long __pte_index_size;
 extern unsigned long __pmd_index_size;
 extern unsigned long __pud_index_size;
 extern unsigned long __pgd_index_size;
-extern unsigned long __pmd_cache_index;
 extern unsigned long __pud_cache_index;
 #define PTE_INDEX_SIZE  __pte_index_size
 #define PMD_INDEX_SIZE  __pmd_index_size
 #define PUD_INDEX_SIZE  __pud_index_size
 #define PGD_INDEX_SIZE  __pgd_index_size
-#define PMD_CACHE_INDEX __pmd_cache_index
+/* pmd table use page table fragments */
+#define PMD_CACHE_INDEX  0
 #define PUD_CACHE_INDEX __pud_cache_index
 /*
  * Because of use of pte fragments and THP, size of page table
index 2fb1c8df05e688e74b3b3414b9a852b79630dca6..3dc3dd3ea0b68f9faba243202d4c0f52ec99c3dd 100644 (file)
@@ -1020,7 +1020,6 @@ void __init hash__early_init_mmu(void)
        __pud_index_size = H_PUD_INDEX_SIZE;
        __pgd_index_size = H_PGD_INDEX_SIZE;
        __pud_cache_index = H_PUD_CACHE_INDEX;
-       __pmd_cache_index = H_PMD_CACHE_INDEX;
        __pte_table_size = H_PTE_TABLE_SIZE;
        __pmd_table_size = H_PMD_TABLE_SIZE;
        __pud_table_size = H_PUD_TABLE_SIZE;
index 47323ed8d7b54eca827051667a7f464db34bb1c0..abda2b92f1baab4831d8f604cb9c0687371646c0 100644 (file)
@@ -400,7 +400,7 @@ static inline void pgtable_free(void *table, int index)
                pte_fragment_free(table, 0);
                break;
        case PMD_INDEX:
-               kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), table);
+               pmd_fragment_free(table);
                break;
        case PUD_INDEX:
                kmem_cache_free(PGT_CACHE(PUD_CACHE_INDEX), table);
@@ -431,7 +431,6 @@ void __tlb_remove_table(void *_table)
 #else
 void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int index)
 {
-
        return pgtable_free(table, index);
 }
 #endif
index 32e58024e7cbc53143583f6c5524924bc2f827cf..ce24d72ea679999f6baf3c468a740013cc23e92a 100644 (file)
@@ -617,7 +617,6 @@ void __init radix__early_init_mmu(void)
        __pud_index_size = RADIX_PUD_INDEX_SIZE;
        __pgd_index_size = RADIX_PGD_INDEX_SIZE;
        __pud_cache_index = RADIX_PUD_INDEX_SIZE;
-       __pmd_cache_index = RADIX_PMD_INDEX_SIZE;
        __pte_table_size = RADIX_PTE_TABLE_SIZE;
        __pmd_table_size = RADIX_PMD_TABLE_SIZE;
        __pud_table_size = RADIX_PUD_TABLE_SIZE;
index f0208f8f9dbb99535afa870c34660449d0decdc0..53e9eeecd5d44aed619e4fa0c03bac639a502462 100644 (file)
@@ -72,8 +72,6 @@ unsigned long __pud_index_size;
 EXPORT_SYMBOL(__pud_index_size);
 unsigned long __pgd_index_size;
 EXPORT_SYMBOL(__pgd_index_size);
-unsigned long __pmd_cache_index;
-EXPORT_SYMBOL(__pmd_cache_index);
 unsigned long __pud_cache_index;
 EXPORT_SYMBOL(__pud_cache_index);
 unsigned long __pte_table_size;