|
@@ -38,14 +38,18 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
|
|
free_page((unsigned long)pgd);
|
|
|
}
|
|
|
|
|
|
-/* Use a slab cache for the pte pages (see also sparc64 implementation) */
|
|
|
-
|
|
|
-extern struct kmem_cache *pgtable_cache;
|
|
|
-
|
|
|
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
|
|
|
unsigned long address)
|
|
|
{
|
|
|
- return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT);
|
|
|
+ pte_t *ptep;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
|
|
|
+ if (!ptep)
|
|
|
+ return NULL;
|
|
|
+ for (i = 0; i < 1024; i++)
|
|
|
+ pte_clear(NULL, 0, ptep + i);
|
|
|
+ return ptep;
|
|
|
}
|
|
|
|
|
|
static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
|
|
@@ -59,7 +63,7 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
|
|
|
return NULL;
|
|
|
page = virt_to_page(pte);
|
|
|
if (!pgtable_page_ctor(page)) {
|
|
|
- kmem_cache_free(pgtable_cache, pte);
|
|
|
+ __free_page(page);
|
|
|
return NULL;
|
|
|
}
|
|
|
return page;
|
|
@@ -67,13 +71,13 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
|
|
|
|
|
|
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
|
|
|
{
|
|
|
- kmem_cache_free(pgtable_cache, pte);
|
|
|
+ free_page((unsigned long)pte);
|
|
|
}
|
|
|
|
|
|
static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
|
|
|
{
|
|
|
pgtable_page_dtor(pte);
|
|
|
- kmem_cache_free(pgtable_cache, page_address(pte));
|
|
|
+ __free_page(pte);
|
|
|
}
|
|
|
#define pmd_pgtable(pmd) pmd_page(pmd)
|
|
|
|