aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-sparc64')
-rw-r--r--include/asm-sparc64/pgalloc.h26
1 files changed, 14 insertions, 12 deletions
diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h
index 5891ff7ba760..5d66b858a965 100644
--- a/include/asm-sparc64/pgalloc.h
+++ b/include/asm-sparc64/pgalloc.h
@@ -6,6 +6,7 @@
6#include <linux/sched.h> 6#include <linux/sched.h>
7#include <linux/mm.h> 7#include <linux/mm.h>
8#include <linux/slab.h> 8#include <linux/slab.h>
9#include <linux/quicklist.h>
9 10
10#include <asm/spitfire.h> 11#include <asm/spitfire.h>
11#include <asm/cpudata.h> 12#include <asm/cpudata.h>
@@ -13,52 +14,50 @@
13#include <asm/page.h> 14#include <asm/page.h>
14 15
15/* Page table allocation/freeing. */ 16/* Page table allocation/freeing. */
16extern struct kmem_cache *pgtable_cache;
17 17
18static inline pgd_t *pgd_alloc(struct mm_struct *mm) 18static inline pgd_t *pgd_alloc(struct mm_struct *mm)
19{ 19{
20 return kmem_cache_alloc(pgtable_cache, GFP_KERNEL); 20 return quicklist_alloc(0, GFP_KERNEL, NULL);
21} 21}
22 22
23static inline void pgd_free(pgd_t *pgd) 23static inline void pgd_free(pgd_t *pgd)
24{ 24{
25 kmem_cache_free(pgtable_cache, pgd); 25 quicklist_free(0, NULL, pgd);
26} 26}
27 27
28#define pud_populate(MM, PUD, PMD) pud_set(PUD, PMD) 28#define pud_populate(MM, PUD, PMD) pud_set(PUD, PMD)
29 29
30static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) 30static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
31{ 31{
32 return kmem_cache_alloc(pgtable_cache, 32 return quicklist_alloc(0, GFP_KERNEL, NULL);
33 GFP_KERNEL|__GFP_REPEAT);
34} 33}
35 34
36static inline void pmd_free(pmd_t *pmd) 35static inline void pmd_free(pmd_t *pmd)
37{ 36{
38 kmem_cache_free(pgtable_cache, pmd); 37 quicklist_free(0, NULL, pmd);
39} 38}
40 39
41static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, 40static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
42 unsigned long address) 41 unsigned long address)
43{ 42{
44 return kmem_cache_alloc(pgtable_cache, 43 return quicklist_alloc(0, GFP_KERNEL, NULL);
45 GFP_KERNEL|__GFP_REPEAT);
46} 44}
47 45
48static inline struct page *pte_alloc_one(struct mm_struct *mm, 46static inline struct page *pte_alloc_one(struct mm_struct *mm,
49 unsigned long address) 47 unsigned long address)
50{ 48{
51 return virt_to_page(pte_alloc_one_kernel(mm, address)); 49 void *pg = quicklist_alloc(0, GFP_KERNEL, NULL);
50 return pg ? virt_to_page(pg) : NULL;
52} 51}
53 52
54static inline void pte_free_kernel(pte_t *pte) 53static inline void pte_free_kernel(pte_t *pte)
55{ 54{
56 kmem_cache_free(pgtable_cache, pte); 55 quicklist_free(0, NULL, pte);
57} 56}
58 57
59static inline void pte_free(struct page *ptepage) 58static inline void pte_free(struct page *ptepage)
60{ 59{
61 pte_free_kernel(page_address(ptepage)); 60 quicklist_free_page(0, NULL, ptepage);
62} 61}
63 62
64 63
@@ -66,6 +65,9 @@ static inline void pte_free(struct page *ptepage)
66#define pmd_populate(MM,PMD,PTE_PAGE) \ 65#define pmd_populate(MM,PMD,PTE_PAGE) \
67 pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE)) 66 pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE))
68 67
69#define check_pgt_cache() do { } while (0) 68static inline void check_pgt_cache(void)
69{
70 quicklist_trim(0, NULL, 25, 16);
71}
70 72
71#endif /* _SPARC64_PGALLOC_H */ 73#endif /* _SPARC64_PGALLOC_H */