at v2.6.24 1.6 kB view raw
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 18/* 19 * Allocating and freeing a pmd is trivial: the 1-entry pmd is 20 * inside the pgd, so has no extra memory associated with it. 21 */ 22 23#define pmd_populate_kernel(mm, pmdp, ptep) \ 24 (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 25#define pmd_populate(mm, pmdp, page) \ 26 (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 27 28static inline pgd_t* 29pgd_alloc(struct mm_struct *mm) 30{ 31 return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER); 32} 33 34static inline void pgd_free(pgd_t *pgd) 35{ 36 free_page((unsigned long)pgd); 37} 38 39/* Use a slab cache for the pte pages (see also sparc64 implementation) */ 40 41extern struct kmem_cache *pgtable_cache; 42 43static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, 44 unsigned long address) 45{ 46 return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); 47} 48 49static inline struct page *pte_alloc_one(struct mm_struct *mm, 50 unsigned long addr) 51{ 52 return virt_to_page(pte_alloc_one_kernel(mm, addr)); 53} 54 55static inline void pte_free_kernel(pte_t *pte) 56{ 57 kmem_cache_free(pgtable_cache, pte); 58} 59 60static inline void pte_free(struct page *page) 61{ 62 kmem_cache_free(pgtable_cache, page_address(page)); 63} 64 65#endif /* __KERNEL__ */ 66#endif /* _XTENSA_PGALLOC_H */