1 /* 2 * include/asm-xtensa/pgalloc.h 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * Copyright (C) 2001-2007 Tensilica Inc. 9 */ 10 11 #ifndef _XTENSA_PGALLOC_H 12 #define _XTENSA_PGALLOC_H 13 14 #ifdef __KERNEL__ 15 16 #include <linux/highmem.h> 17 #include <linux/slab.h> 18 19 /* 20 * Allocating and freeing a pmd is trivial: the 1-entry pmd is 21 * inside the pgd, so has no extra memory associated with it. 22 */ 23 24 #define pmd_populate_kernel(mm, pmdp, ptep) \ 25 (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 26 #define pmd_populate(mm, pmdp, page) \ 27 (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 28 #define pmd_pgtable(pmd) pmd_page(pmd) 29 30 static inline pgd_t* 31 pgd_alloc(struct mm_struct *mm) 32 { 33 return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER); 34 } 35 36 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 37 { 38 free_page((unsigned long)pgd); 39 } 40 41 /* Use a slab cache for the pte pages (see also sparc64 implementation) */ 42 43 extern struct kmem_cache *pgtable_cache; 44 45 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, 46 unsigned long address) 47 { 48 return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); 49 } 50 51 static inline pgtable_t pte_alloc_one(struct mm_struct *mm, 52 unsigned long addr) 53 { 54 struct page *page; 55 56 page = virt_to_page(pte_alloc_one_kernel(mm, addr)); 57 pgtable_page_ctor(page); 58 return page; 59 } 60 61 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 62 { 63 kmem_cache_free(pgtable_cache, pte); 64 } 65 66 static inline void pte_free(struct mm_struct *mm, pgtable_t pte) 67 { 68 pgtable_page_dtor(pte); 69 kmem_cache_free(pgtable_cache, page_address(pte)); 70 } 71 #define pmd_pgtable(pmd) pmd_page(pmd) 72 73 #endif /* __KERNEL__ */ 74 #endif /* _XTENSA_PGALLOC_H */ 75