at v2.6.13 91 lines 2.2 kB view raw
1#ifndef _PPC64_PGALLOC_H 2#define _PPC64_PGALLOC_H 3 4#include <linux/mm.h> 5#include <linux/slab.h> 6#include <linux/cpumask.h> 7#include <linux/percpu.h> 8 9extern kmem_cache_t *zero_cache; 10 11/* 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 15 * 2 of the License, or (at your option) any later version. 16 */ 17 18static inline pgd_t * 19pgd_alloc(struct mm_struct *mm) 20{ 21 return kmem_cache_alloc(zero_cache, GFP_KERNEL); 22} 23 24static inline void 25pgd_free(pgd_t *pgd) 26{ 27 kmem_cache_free(zero_cache, pgd); 28} 29 30#define pud_populate(MM, PUD, PMD) pud_set(PUD, PMD) 31 32static inline pmd_t * 33pmd_alloc_one(struct mm_struct *mm, unsigned long addr) 34{ 35 return kmem_cache_alloc(zero_cache, GFP_KERNEL|__GFP_REPEAT); 36} 37 38static inline void 39pmd_free(pmd_t *pmd) 40{ 41 kmem_cache_free(zero_cache, pmd); 42} 43 44#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, pte) 45#define pmd_populate(mm, pmd, pte_page) \ 46 pmd_populate_kernel(mm, pmd, page_address(pte_page)) 47 48static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) 49{ 50 return kmem_cache_alloc(zero_cache, GFP_KERNEL|__GFP_REPEAT); 51} 52 53static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) 54{ 55 pte_t *pte = kmem_cache_alloc(zero_cache, GFP_KERNEL|__GFP_REPEAT); 56 if (pte) 57 return virt_to_page(pte); 58 return NULL; 59} 60 61static inline void pte_free_kernel(pte_t *pte) 62{ 63 kmem_cache_free(zero_cache, pte); 64} 65 66static inline void pte_free(struct page *ptepage) 67{ 68 kmem_cache_free(zero_cache, page_address(ptepage)); 69} 70 71struct pte_freelist_batch 72{ 73 struct rcu_head rcu; 74 unsigned int index; 75 struct page * pages[0]; 76}; 77 78#define PTE_FREELIST_SIZE ((PAGE_SIZE - sizeof(struct pte_freelist_batch)) / \ 79 sizeof(struct page *)) 80 81extern void pte_free_now(struct page *ptepage); 82extern void pte_free_submit(struct pte_freelist_batch *batch); 83 84DECLARE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); 85 86void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage); 87#define __pmd_free_tlb(tlb, pmd) __pte_free_tlb(tlb, virt_to_page(pmd)) 88 89#define check_pgt_cache() do { } while (0) 90 91#endif /* _PPC64_PGALLOC_H */