diff options
Diffstat (limited to 'arch/xtensa/include/asm/pgalloc.h')
| -rw-r--r-- | arch/xtensa/include/asm/pgalloc.h | 31 | 
1 files changed, 21 insertions, 10 deletions
diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h index 40cf9bceda2..d38eb9237e6 100644 --- a/arch/xtensa/include/asm/pgalloc.h +++ b/arch/xtensa/include/asm/pgalloc.h @@ -38,35 +38,46 @@ 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,  +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,  					unsigned long addr)  { +	pte_t *pte;  	struct page *page; -	page = virt_to_page(pte_alloc_one_kernel(mm, addr)); -	pgtable_page_ctor(page); +	pte = pte_alloc_one_kernel(mm, addr); +	if (!pte) +		return NULL; +	page = virt_to_page(pte); +	if (!pgtable_page_ctor(page)) { +		__free_page(page); +		return NULL; +	}  	return page;  }  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)  | 
