1/* 2 * arch/xtensa/mm/pgtable.c 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file "COPYING" in the main directory of this archive 6 * for more details. 7 * 8 * Copyright (C) 2001 - 2005 Tensilica Inc. 9 * 10 * Chris Zankel <chris@zankel.net> 11 */ 12 13#if (DCACHE_SIZE > PAGE_SIZE) 14 15pte_t* pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) 16{ 17 pte_t *pte = NULL, *p; 18 int color = ADDR_COLOR(address); 19 int i; 20 21 p = (pte_t*) __get_free_pages(GFP_KERNEL|__GFP_REPEAT, COLOR_ORDER); 22 23 if (likely(p)) { 24 split_page(virt_to_page(p), COLOR_ORDER); 25 26 for (i = 0; i < COLOR_SIZE; i++) { 27 if (ADDR_COLOR(p) == color) 28 pte = p; 29 else 30 free_page(p); 31 p += PTRS_PER_PTE; 32 } 33 clear_page(pte); 34 } 35 return pte; 36} 37 38#ifdef PROFILING 39 40int mask; 41int hit; 42int flush; 43 44#endif 45 46struct page* pte_alloc_one(struct mm_struct *mm, unsigned long address) 47{ 48 struct page *page = NULL, *p; 49 int color = ADDR_COLOR(address); 50 51 p = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER); 52 53 if (likely(p)) { 54 split_page(p, COLOR_ORDER); 55 56 for (i = 0; i < PAGE_ORDER; i++) { 57 if (PADDR_COLOR(page_address(p)) == color) 58 page = p; 59 else 60 __free_page(p); 61 p++; 62 } 63 clear_highpage(page); 64 } 65 66 return page; 67} 68 69#endif 70