aboutsummaryrefslogtreecommitdiffstats
path: root/arch/xtensa/mm/pgtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/xtensa/mm/pgtable.c')
-rw-r--r--arch/xtensa/mm/pgtable.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/arch/xtensa/mm/pgtable.c b/arch/xtensa/mm/pgtable.c
index e5e119c820e4..7d28914d11cb 100644
--- a/arch/xtensa/mm/pgtable.c
+++ b/arch/xtensa/mm/pgtable.c
@@ -14,25 +14,21 @@
14 14
15pte_t* pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) 15pte_t* pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
16{ 16{
17 pte_t *pte, p; 17 pte_t *pte = NULL, *p;
18 int color = ADDR_COLOR(address); 18 int color = ADDR_COLOR(address);
19 int i; 19 int i;
20 20
21 p = (pte_t*) __get_free_pages(GFP_KERNEL|__GFP_REPEAT, COLOR_ORDER); 21 p = (pte_t*) __get_free_pages(GFP_KERNEL|__GFP_REPEAT, COLOR_ORDER);
22 22
23 if (likely(p)) { 23 if (likely(p)) {
24 struct page *page; 24 split_page(virt_to_page(p), COLOR_ORDER);
25
26 for (i = 0; i < COLOR_SIZE; i++, p++) {
27 page = virt_to_page(pte);
28
29 set_page_count(page, 1);
30 ClearPageCompound(page);
31 25
26 for (i = 0; i < COLOR_SIZE; i++) {
32 if (ADDR_COLOR(p) == color) 27 if (ADDR_COLOR(p) == color)
33 pte = p; 28 pte = p;
34 else 29 else
35 free_page(p); 30 free_page(p);
31 p += PTRS_PER_PTE;
36 } 32 }
37 clear_page(pte); 33 clear_page(pte);
38 } 34 }
@@ -49,20 +45,20 @@ int flush;
49 45
50struct page* pte_alloc_one(struct mm_struct *mm, unsigned long address) 46struct page* pte_alloc_one(struct mm_struct *mm, unsigned long address)
51{ 47{
52 struct page *page, p; 48 struct page *page = NULL, *p;
53 int color = ADDR_COLOR(address); 49 int color = ADDR_COLOR(address);
54 50
55 p = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER); 51 p = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER);
56 52
57 if (likely(p)) { 53 if (likely(p)) {
58 for (i = 0; i < PAGE_ORDER; i++) { 54 split_page(p, COLOR_ORDER);
59 set_page_count(p, 1);
60 ClearPageCompound(p);
61 55
62 if (PADDR_COLOR(page_address(pg)) == color) 56 for (i = 0; i < PAGE_ORDER; i++) {
57 if (PADDR_COLOR(page_address(p)) == color)
63 page = p; 58 page = p;
64 else 59 else
65 free_page(p); 60 __free_page(p);
61 p++;
66 } 62 }
67 clear_highpage(page); 63 clear_highpage(page);
68 } 64 }