|
@@ -38,51 +38,20 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
|
|
kmem_cache_free(pgtable_cache, pmd);
|
|
kmem_cache_free(pgtable_cache, pmd);
|
|
}
|
|
}
|
|
|
|
|
|
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
|
|
|
|
- unsigned long address)
|
|
|
|
-{
|
|
|
|
- return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
|
|
|
|
- unsigned long address)
|
|
|
|
-{
|
|
|
|
- struct page *page;
|
|
|
|
- pte_t *pte;
|
|
|
|
-
|
|
|
|
- pte = pte_alloc_one_kernel(mm, address);
|
|
|
|
- if (!pte)
|
|
|
|
- return NULL;
|
|
|
|
- page = virt_to_page(pte);
|
|
|
|
- pgtable_page_ctor(page);
|
|
|
|
- return page;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
|
|
|
|
-{
|
|
|
|
- free_page((unsigned long)pte);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
|
|
|
|
-{
|
|
|
|
- pgtable_page_dtor(ptepage);
|
|
|
|
- __free_page(ptepage);
|
|
|
|
-}
|
|
|
|
|
|
+extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
|
|
|
|
+ unsigned long address);
|
|
|
|
+extern pgtable_t pte_alloc_one(struct mm_struct *mm,
|
|
|
|
+ unsigned long address);
|
|
|
|
+extern void pte_free_kernel(struct mm_struct *mm, pte_t *pte);
|
|
|
|
+extern void pte_free(struct mm_struct *mm, pgtable_t ptepage);
|
|
|
|
|
|
#define pmd_populate_kernel(MM, PMD, PTE) pmd_set(PMD, PTE)
|
|
#define pmd_populate_kernel(MM, PMD, PTE) pmd_set(PMD, PTE)
|
|
-#define pmd_populate(MM,PMD,PTE_PAGE) \
|
|
|
|
- pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE))
|
|
|
|
-#define pmd_pgtable(pmd) pmd_page(pmd)
|
|
|
|
|
|
+#define pmd_populate(MM, PMD, PTE) pmd_set(PMD, PTE)
|
|
|
|
+#define pmd_pgtable(PMD) ((pte_t *)__pmd_page(PMD))
|
|
|
|
|
|
#define check_pgt_cache() do { } while (0)
|
|
#define check_pgt_cache() do { } while (0)
|
|
|
|
|
|
-static inline void pgtable_free(void *table, bool is_page)
|
|
|
|
-{
|
|
|
|
- if (is_page)
|
|
|
|
- free_page((unsigned long)table);
|
|
|
|
- else
|
|
|
|
- kmem_cache_free(pgtable_cache, table);
|
|
|
|
-}
|
|
|
|
|
|
+extern void pgtable_free(void *table, bool is_page);
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
|
|
|
|
@@ -113,11 +82,10 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, bool is
|
|
}
|
|
}
|
|
#endif /* !CONFIG_SMP */
|
|
#endif /* !CONFIG_SMP */
|
|
|
|
|
|
-static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage,
|
|
|
|
|
|
+static inline void __pte_free_tlb(struct mmu_gather *tlb, pte_t *pte,
|
|
unsigned long address)
|
|
unsigned long address)
|
|
{
|
|
{
|
|
- pgtable_page_dtor(ptepage);
|
|
|
|
- pgtable_free_tlb(tlb, page_address(ptepage), true);
|
|
|
|
|
|
+ pgtable_free_tlb(tlb, pte, true);
|
|
}
|
|
}
|
|
|
|
|
|
#define __pmd_free_tlb(tlb, pmd, addr) \
|
|
#define __pmd_free_tlb(tlb, pmd, addr) \
|