Commit f820e280 authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Linus Torvalds

xtensa: use buddy allocator for PTE table

At the moment xtensa uses slab allocator for PTE table.  It doesn't work
with enabled split page table lock: slab uses page->slab_cache and
page->first_page for its pages.  These fields share stroage with
Signed-off-by: default avatarKirill A. Shutemov <>
Cc: Chris Zankel <>
Acked-by: default avatarMax Filippov <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent 01058e70
......@@ -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);
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)
kmem_cache_free(pgtable_cache, page_address(pte));
#define pmd_pgtable(pmd) pmd_page(pmd)
......@@ -220,12 +220,11 @@ extern unsigned long empty_zero_page[1024];
extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)];
extern void paging_init(void);
extern void pgtable_cache_init(void);
# define swapper_pg_dir NULL
static inline void paging_init(void) { }
static inline void pgtable_cache_init(void) { }
static inline void pgtable_cache_init(void) { }
* The pmd contains the kernel virtual address of the pte page.
......@@ -50,23 +50,3 @@ void __init init_mmu(void)
struct kmem_cache *pgtable_cache __read_mostly;
static void pgd_ctor(void *addr)
pte_t *ptep = (pte_t *)addr;
int i;
for (i = 0; i < 1024; i++, ptep++)
pte_clear(NULL, 0, ptep);
void __init pgtable_cache_init(void)
pgtable_cache = kmem_cache_create("pgd",
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment