|
@@ -50,19 +50,45 @@ extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift);
|
|
|
extern void __tlb_remove_table(void *_table);
|
|
|
#endif
|
|
|
|
|
|
+static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm)
|
|
|
+{
|
|
|
+#ifdef CONFIG_PPC_64K_PAGES
|
|
|
+ return (pgd_t *)__get_free_page(PGALLOC_GFP);
|
|
|
+#else
|
|
|
+ struct page *page;
|
|
|
+ page = alloc_pages(PGALLOC_GFP, 4);
|
|
|
+ if (!page)
|
|
|
+ return NULL;
|
|
|
+ return (pgd_t *) page_address(page);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+static inline void radix__pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
|
|
+{
|
|
|
+#ifdef CONFIG_PPC_64K_PAGES
|
|
|
+ free_page((unsigned long)pgd);
|
|
|
+#else
|
|
|
+ free_pages((unsigned long)pgd, 4);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
|
|
|
{
|
|
|
+ if (radix_enabled())
|
|
|
+ return radix__pgd_alloc(mm);
|
|
|
return kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE), GFP_KERNEL);
|
|
|
}
|
|
|
|
|
|
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
|
|
{
|
|
|
+ if (radix_enabled())
|
|
|
+ return radix__pgd_free(mm, pgd);
|
|
|
kmem_cache_free(PGT_CACHE(PGD_INDEX_SIZE), pgd);
|
|
|
}
|
|
|
|
|
|
static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
|
|
|
{
|
|
|
- pgd_set(pgd, __pgtable_ptr_val(pud));
|
|
|
+ pgd_set(pgd, __pgtable_ptr_val(pud) | PGD_VAL_BITS);
|
|
|
}
|
|
|
|
|
|
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
|
|
@@ -78,7 +104,7 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
|
|
|
|
|
|
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
|
|
|
{
|
|
|
- pud_set(pud, __pgtable_ptr_val(pmd));
|
|
|
+ pud_set(pud, __pgtable_ptr_val(pmd) | PUD_VAL_BITS);
|
|
|
}
|
|
|
|
|
|
static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
|
@@ -107,13 +133,13 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
|
|
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
|
|
|
pte_t *pte)
|
|
|
{
|
|
|
- pmd_set(pmd, __pgtable_ptr_val(pte));
|
|
|
+ pmd_set(pmd, __pgtable_ptr_val(pte) | PMD_VAL_BITS);
|
|
|
}
|
|
|
|
|
|
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
|
|
|
pgtable_t pte_page)
|
|
|
{
|
|
|
- pmd_set(pmd, __pgtable_ptr_val(pte_page));
|
|
|
+ pmd_set(pmd, __pgtable_ptr_val(pte_page) | PMD_VAL_BITS);
|
|
|
}
|
|
|
|
|
|
static inline pgtable_t pmd_pgtable(pmd_t pmd)
|