pgtable.c 1.2 KB
Newer Older
1
/*
2
 * arch/xtensa/mm/pgtable.c
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2001 - 2005 Tensilica Inc.
 *
 * Chris Zankel <chris@zankel.net>
 */

#if (DCACHE_SIZE > PAGE_SIZE)

pte_t* pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
{
N
Nick Piggin 已提交
17
	pte_t *pte = NULL, *p;
18 19 20 21 22 23
	int color = ADDR_COLOR(address);
	int i;

	p = (pte_t*) __get_free_pages(GFP_KERNEL|__GFP_REPEAT, COLOR_ORDER);

	if (likely(p)) {
N
Nick Piggin 已提交
24
		split_page(virt_to_page(p), COLOR_ORDER);
25

N
Nick Piggin 已提交
26
		for (i = 0; i < COLOR_SIZE; i++) {
27 28 29 30
			if (ADDR_COLOR(p) == color)
				pte = p;
			else
				free_page(p);
N
Nick Piggin 已提交
31
			p += PTRS_PER_PTE;
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
		}
		clear_page(pte);
	}
	return pte;
}

#ifdef PROFILING

int mask;
int hit;
int flush;

#endif

struct page* pte_alloc_one(struct mm_struct *mm, unsigned long address)
{
N
Nick Piggin 已提交
48
	struct page *page = NULL, *p;
49 50 51 52 53
	int color = ADDR_COLOR(address);

	p = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER);

	if (likely(p)) {
N
Nick Piggin 已提交
54
		split_page(p, COLOR_ORDER);
55

N
Nick Piggin 已提交
56
		for (i = 0; i < PAGE_ORDER; i++) {
N
Nick Piggin 已提交
57
			if (PADDR_COLOR(page_address(p)) == color)
58 59
				page = p;
			else
N
Nick Piggin 已提交
60 61
				__free_page(p);
			p++;
62 63 64 65 66 67 68 69 70 71 72
		}
		clear_highpage(page);
	}

	return page;
}

#endif