This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / asm-sparc64 / pgalloc.h
index 8354a05..e1b0538 100644 (file)
@@ -73,10 +73,9 @@ static __inline__ pgd_t *get_pgd_fast(void)
                struct page *page;
 
                preempt_enable();
-               page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
+               page = alloc_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
                if (page) {
                        ret = (struct page *)page_address(page);
-                       clear_page(ret);
                        page->lru.prev = (void *) 2UL;
 
                        preempt_disable();
@@ -134,7 +133,7 @@ static __inline__ void free_pgd_slow(pgd_t *pgd)
 #define DCACHE_COLOR(address)          0
 #endif
 
-#define pgd_populate(MM, PGD, PMD)     pgd_set(PGD, PMD)
+#define pud_populate(MM, PUD, PMD)     pud_set(PUD, PMD)
 
 static __inline__ pmd_t *pmd_alloc_one_fast(struct mm_struct *mm, unsigned long address)
 {
@@ -188,15 +187,30 @@ static __inline__ void free_pmd_slow(pmd_t *pmd)
 #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)
@@ -230,8 +244,18 @@ static __inline__ void free_pte_slow(pte_t *pte)
        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()