]> err.no Git - linux-2.6/blobdiff - include/asm-powerpc/pgalloc-64.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6
[linux-2.6] / include / asm-powerpc / pgalloc-64.h
index 30b50cf56e2c1da4b0178978844f767728aecc95..94d0294341d65a90006669e2a9bfd7851ab37452 100644 (file)
 
 extern struct kmem_cache *pgtable_cache[];
 
-#ifdef CONFIG_PPC_64K_PAGES
-#define PTE_CACHE_NUM  0
-#define PMD_CACHE_NUM  1
-#define PGD_CACHE_NUM  2
-#define HUGEPTE_CACHE_NUM 3
-#else
-#define PTE_CACHE_NUM  0
-#define PMD_CACHE_NUM  1
-#define PUD_CACHE_NUM  1
-#define PGD_CACHE_NUM  0
-#define HUGEPTE_CACHE_NUM 2
-#endif
+#define PGD_CACHE_NUM          0
+#define PUD_CACHE_NUM          1
+#define PMD_CACHE_NUM          1
+#define HUGEPTE_CACHE_NUM      2
+#define PTE_NONCACHE_NUM       3  /* from GFP rather than kmem_cache */
 
 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
 {
@@ -91,24 +84,24 @@ static inline void pmd_free(pmd_t *pmd)
 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
                                          unsigned long address)
 {
-       return kmem_cache_alloc(pgtable_cache[PTE_CACHE_NUM],
-                               GFP_KERNEL|__GFP_REPEAT);
+        return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
 }
 
 static inline struct page *pte_alloc_one(struct mm_struct *mm,
                                         unsigned long address)
 {
-       return virt_to_page(pte_alloc_one_kernel(mm, address));
+       pte_t *pte = pte_alloc_one_kernel(mm, address);
+       return pte ? virt_to_page(pte) : NULL;
 }
 
 static inline void pte_free_kernel(pte_t *pte)
 {
-       kmem_cache_free(pgtable_cache[PTE_CACHE_NUM], pte);
+       free_page((unsigned long)pte);
 }
 
 static inline void pte_free(struct page *ptepage)
 {
-       pte_free_kernel(page_address(ptepage));
+       __free_page(ptepage);
 }
 
 #define PGF_CACHENUM_MASK      0x3
@@ -130,14 +123,17 @@ static inline void pgtable_free(pgtable_free_t pgf)
        void *p = (void *)(pgf.val & ~PGF_CACHENUM_MASK);
        int cachenum = pgf.val & PGF_CACHENUM_MASK;
 
-       kmem_cache_free(pgtable_cache[cachenum], p);
+       if (cachenum == PTE_NONCACHE_NUM)
+               free_page((unsigned long)p);
+       else
+               kmem_cache_free(pgtable_cache[cachenum], p);
 }
 
 extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
 
 #define __pte_free_tlb(tlb, ptepage)   \
        pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
-               PTE_CACHE_NUM, PTE_TABLE_SIZE-1))
+               PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1))
 #define __pmd_free_tlb(tlb, pmd)       \
        pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
                PMD_CACHE_NUM, PMD_TABLE_SIZE-1))