#define pmd_populate(MM,PMD,PTE_PAGE) \
pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE))
-extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address);
+extern pte_t *__pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address);
+
+static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+{
+ pte_t *pte = __pte_alloc_one_kernel(mm, address);
+ if (pte) {
+ struct page *page = virt_to_page(pte);
+ page->mapping = (void *) mm;
+ page->index = address & PMD_MASK;
+ }
+ return pte;
+}
static inline struct page *
pte_alloc_one(struct mm_struct *mm, unsigned long addr)
{
- pte_t *pte = pte_alloc_one_kernel(mm, addr);
- if (pte)
- return virt_to_page(pte);
- return 0;
+ pte_t *pte = __pte_alloc_one_kernel(mm, addr);
+ if (pte) {
+ struct page *page = virt_to_page(pte);
+ page->mapping = (void *) mm;
+ page->index = addr & PMD_MASK;
+ return page;
+ }
+ return NULL;
}
static __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
free_page((unsigned long)pte);
}
-#define pte_free_kernel(pte) free_pte_fast(pte)
-#define pte_free(pte) free_pte_fast(page_address(pte))
+static inline void pte_free_kernel(pte_t *pte)
+{
+ virt_to_page(pte)->mapping = NULL;
+ free_pte_fast(pte);
+}
+
+static inline void pte_free(struct page *ptepage)
+{
+ ptepage->mapping = NULL;
+ free_pte_fast(page_address(ptepage));
+}
+
#define pmd_free(pmd) free_pmd_fast(pmd)
#define pgd_free(pgd) free_pgd_fast(pgd)
#define pgd_alloc(mm) get_pgd_fast()