1 #ifndef _SPARC64_PGALLOC_H 2 #define _SPARC64_PGALLOC_H 3 4 #include <linux/kernel.h> 5 #include <linux/sched.h> 6 #include <linux/mm.h> 7 #include <linux/slab.h> 8 #include <linux/quicklist.h> 9 10 #include <asm/spitfire.h> 11 #include <asm/cpudata.h> 12 #include <asm/cacheflush.h> 13 #include <asm/page.h> 14 15 /* Page table allocation/freeing. */ 16 17 static inline pgd_t *pgd_alloc(struct mm_struct *mm) 18 { 19 return quicklist_alloc(0, GFP_KERNEL, NULL); 20 } 21 22 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 23 { 24 quicklist_free(0, NULL, pgd); 25 } 26 27 #define pud_populate(MM, PUD, PMD) pud_set(PUD, PMD) 28 29 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) 30 { 31 return quicklist_alloc(0, GFP_KERNEL, NULL); 32 } 33 34 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) 35 { 36 quicklist_free(0, NULL, pmd); 37 } 38 39 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, 40 unsigned long address) 41 { 42 return quicklist_alloc(0, GFP_KERNEL, NULL); 43 } 44 45 static inline pgtable_t pte_alloc_one(struct mm_struct *mm, 46 unsigned long address) 47 { 48 struct page *page; 49 void *pg; 50 51 pg = quicklist_alloc(0, GFP_KERNEL, NULL); 52 if (!pg) 53 return NULL; 54 page = virt_to_page(pg); 55 pgtable_page_ctor(page); 56 return page; 57 } 58 59 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 60 { 61 quicklist_free(0, NULL, pte); 62 } 63 64 static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) 65 { 66 pgtable_page_dtor(ptepage); 67 quicklist_free_page(0, NULL, ptepage); 68 } 69 70 71 #define pmd_populate_kernel(MM, PMD, PTE) pmd_set(PMD, PTE) 72 #define pmd_populate(MM,PMD,PTE_PAGE) \ 73 pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE)) 74 #define pmd_pgtable(pmd) pmd_page(pmd) 75 76 static inline void check_pgt_cache(void) 77 { 78 quicklist_trim(0, NULL, 25, 16); 79 } 80 81 #endif /* _SPARC64_PGALLOC_H */ 82