Loading arch/sh64/Kconfig +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ config MMU bool default y config QUICKLIST def_bool y config RWSEM_GENERIC_SPINLOCK bool default y Loading arch/sh64/mm/init.c +1 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ void show_mem(void) printk("%d reserved pages\n",reserved); printk("%d pages shared\n",shared); printk("%d pages swap cached\n",cached); printk("%ld pages in page table cache\n",pgtable_cache_size); printk("%ld pages in page table cache\n", quicklist_total_size()); } /* Loading include/asm-sh64/pgalloc.h +23 −77 Original line number Diff line number Diff line Loading @@ -14,13 +14,9 @@ * */ #include <linux/threads.h> #include <linux/mm.h> #define pgd_quicklist (current_cpu_data.pgd_quick) #define pmd_quicklist (current_cpu_data.pmd_quick) #define pte_quicklist (current_cpu_data.pte_quick) #define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) #include <linux/quicklist.h> #include <asm/page.h> static inline void pgd_init(unsigned long page) { Loading @@ -45,84 +41,37 @@ static inline pgd_t *get_pgd_slow(void) return ret; } static inline pgd_t *get_pgd_fast(void) { unsigned long *ret; if ((ret = pgd_quicklist) != NULL) { pgd_quicklist = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } else ret = (unsigned long *)get_pgd_slow(); if (ret) { memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); } return (pgd_t *)ret; } static inline void free_pgd_fast(pgd_t *pgd) static inline pgd_t *pgd_alloc(struct mm_struct *mm) { *(unsigned long *)pgd = (unsigned long) pgd_quicklist; pgd_quicklist = (unsigned long *) pgd; pgtable_cache_size++; return quicklist_alloc(0, GFP_KERNEL, NULL); } static inline void free_pgd_slow(pgd_t *pgd) static inline void pgd_free(pgd_t *pgd) { kfree((void *)pgd); } extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long address_preadjusted); extern pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long address_preadjusted); static inline pte_t *get_pte_fast(void) { unsigned long *ret; if((ret = (unsigned long *)pte_quicklist) != NULL) { pte_quicklist = (unsigned long *)(*ret); ret[0] = ret[1]; pgtable_cache_size--; } return (pte_t *)ret; quicklist_free(0, NULL, pgd); } static inline void free_pte_fast(pte_t *pte) static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) { *(unsigned long *)pte = (unsigned long) pte_quicklist; pte_quicklist = (unsigned long *) pte; pgtable_cache_size++; void *pg = quicklist_alloc(0, GFP_KERNEL, NULL); return pg ? virt_to_page(pg) : NULL; } static inline void pte_free_kernel(pte_t *pte) { free_page((unsigned long)pte); quicklist_free(0, NULL, pte); } static inline void pte_free(struct page *pte) { __free_page(pte); quicklist_free_page(0, NULL, pte); } static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { pte_t *pte; pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT|__GFP_ZERO); return pte; } static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) { struct page *pte; pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); return pte; return quicklist_alloc(0, GFP_KERNEL, NULL); } #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) Loading @@ -142,16 +91,14 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long add #elif defined(CONFIG_SH64_PGTABLE_3_LEVEL) static __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) { pmd_t *pmd; pmd = (pmd_t *) __get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); return pmd; return quicklist_alloc(0, GFP_KERNEL, NULL); } static __inline__ void pmd_free(pmd_t *pmd) static inline void pmd_free(pmd_t *pmd) { free_page((unsigned long) pmd); quicklist_free(0, NULL, pmd); } #define pgd_populate(mm, pgd, pmd) pgd_set(pgd, pmd) Loading @@ -161,12 +108,6 @@ static __inline__ void pmd_free(pmd_t *pmd) #error "No defined page table size" #endif #define check_pgt_cache() do { } while (0) #define pgd_free(pgd) free_pgd_slow(pgd) #define pgd_alloc(mm) get_pgd_fast() extern int do_check_pgt_cache(int, int); #define pmd_populate_kernel(mm, pmd, pte) \ set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) (pte))) Loading @@ -176,4 +117,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) page_address (pte))); } static inline void check_pgt_cache(void) { quicklist_trim(0, NULL, 25, 16); } #endif /* __ASM_SH64_PGALLOC_H */ mm/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -166,5 +166,5 @@ config ZONE_DMA_FLAG config NR_QUICK int depends on QUICKLIST default "2" if SUPERH default "2" if (SUPERH && !SUPERH64) default "1" Loading
arch/sh64/Kconfig +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,9 @@ config MMU bool default y config QUICKLIST def_bool y config RWSEM_GENERIC_SPINLOCK bool default y Loading
arch/sh64/mm/init.c +1 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ void show_mem(void) printk("%d reserved pages\n",reserved); printk("%d pages shared\n",shared); printk("%d pages swap cached\n",cached); printk("%ld pages in page table cache\n",pgtable_cache_size); printk("%ld pages in page table cache\n", quicklist_total_size()); } /* Loading
include/asm-sh64/pgalloc.h +23 −77 Original line number Diff line number Diff line Loading @@ -14,13 +14,9 @@ * */ #include <linux/threads.h> #include <linux/mm.h> #define pgd_quicklist (current_cpu_data.pgd_quick) #define pmd_quicklist (current_cpu_data.pmd_quick) #define pte_quicklist (current_cpu_data.pte_quick) #define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) #include <linux/quicklist.h> #include <asm/page.h> static inline void pgd_init(unsigned long page) { Loading @@ -45,84 +41,37 @@ static inline pgd_t *get_pgd_slow(void) return ret; } static inline pgd_t *get_pgd_fast(void) { unsigned long *ret; if ((ret = pgd_quicklist) != NULL) { pgd_quicklist = (unsigned long *)(*ret); ret[0] = 0; pgtable_cache_size--; } else ret = (unsigned long *)get_pgd_slow(); if (ret) { memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); } return (pgd_t *)ret; } static inline void free_pgd_fast(pgd_t *pgd) static inline pgd_t *pgd_alloc(struct mm_struct *mm) { *(unsigned long *)pgd = (unsigned long) pgd_quicklist; pgd_quicklist = (unsigned long *) pgd; pgtable_cache_size++; return quicklist_alloc(0, GFP_KERNEL, NULL); } static inline void free_pgd_slow(pgd_t *pgd) static inline void pgd_free(pgd_t *pgd) { kfree((void *)pgd); } extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long address_preadjusted); extern pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long address_preadjusted); static inline pte_t *get_pte_fast(void) { unsigned long *ret; if((ret = (unsigned long *)pte_quicklist) != NULL) { pte_quicklist = (unsigned long *)(*ret); ret[0] = ret[1]; pgtable_cache_size--; } return (pte_t *)ret; quicklist_free(0, NULL, pgd); } static inline void free_pte_fast(pte_t *pte) static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) { *(unsigned long *)pte = (unsigned long) pte_quicklist; pte_quicklist = (unsigned long *) pte; pgtable_cache_size++; void *pg = quicklist_alloc(0, GFP_KERNEL, NULL); return pg ? virt_to_page(pg) : NULL; } static inline void pte_free_kernel(pte_t *pte) { free_page((unsigned long)pte); quicklist_free(0, NULL, pte); } static inline void pte_free(struct page *pte) { __free_page(pte); quicklist_free_page(0, NULL, pte); } static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { pte_t *pte; pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT|__GFP_ZERO); return pte; } static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) { struct page *pte; pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); return pte; return quicklist_alloc(0, GFP_KERNEL, NULL); } #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) Loading @@ -142,16 +91,14 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long add #elif defined(CONFIG_SH64_PGTABLE_3_LEVEL) static __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) { pmd_t *pmd; pmd = (pmd_t *) __get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); return pmd; return quicklist_alloc(0, GFP_KERNEL, NULL); } static __inline__ void pmd_free(pmd_t *pmd) static inline void pmd_free(pmd_t *pmd) { free_page((unsigned long) pmd); quicklist_free(0, NULL, pmd); } #define pgd_populate(mm, pgd, pmd) pgd_set(pgd, pmd) Loading @@ -161,12 +108,6 @@ static __inline__ void pmd_free(pmd_t *pmd) #error "No defined page table size" #endif #define check_pgt_cache() do { } while (0) #define pgd_free(pgd) free_pgd_slow(pgd) #define pgd_alloc(mm) get_pgd_fast() extern int do_check_pgt_cache(int, int); #define pmd_populate_kernel(mm, pmd, pte) \ set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) (pte))) Loading @@ -176,4 +117,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) page_address (pte))); } static inline void check_pgt_cache(void) { quicklist_trim(0, NULL, 25, 16); } #endif /* __ASM_SH64_PGALLOC_H */
mm/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -166,5 +166,5 @@ config ZONE_DMA_FLAG config NR_QUICK int depends on QUICKLIST default "2" if SUPERH default "2" if (SUPERH && !SUPERH64) default "1"