diff options
author | Christopher Kenna <cjk@cs.unc.edu> | 2012-05-07 21:34:37 -0400 |
---|---|---|
committer | Christopher Kenna <cjk@cs.unc.edu> | 2012-05-08 00:12:18 -0400 |
commit | 5fae0af221f5e914f945859e6a33df3e6206ac46 (patch) | |
tree | ddce605e75e3e0d62d9e866a0ff91a63568acc07 /litmus | |
parent | c0d2e33a54c3f99e062d9545c4d43b5e22345611 (diff) |
Make colored memory optionally un-cachable.
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/Kconfig | 7 | ||||
-rw-r--r-- | litmus/color.c | 15 | ||||
-rw-r--r-- | litmus/color_dev.c | 27 |
3 files changed, 39 insertions, 10 deletions
diff --git a/litmus/Kconfig b/litmus/Kconfig index 69150b954dba..272b64c30ba3 100644 --- a/litmus/Kconfig +++ b/litmus/Kconfig | |||
@@ -19,6 +19,13 @@ config PLUGIN_COLOR | |||
19 | help | 19 | help |
20 | Include the scheduling with colors scheduler. | 20 | Include the scheduling with colors scheduler. |
21 | 21 | ||
22 | config PLUGIN_COLOR_UNCACHABLE | ||
23 | bool "Colored memory is not cachable" | ||
24 | depends on PLUGIN_COLOR && X86_PAT | ||
25 | default n | ||
26 | help | ||
27 | Any memory allocated to the color plugin is not CPU cached. | ||
28 | |||
22 | config PLUGIN_PFAIR | 29 | config PLUGIN_PFAIR |
23 | bool "PFAIR" | 30 | bool "PFAIR" |
24 | depends on HIGH_RES_TIMERS && !NO_HZ | 31 | depends on HIGH_RES_TIMERS && !NO_HZ |
diff --git a/litmus/color.c b/litmus/color.c index 0b99523bcf66..8a9f68544e8f 100644 --- a/litmus/color.c +++ b/litmus/color.c | |||
@@ -8,6 +8,10 @@ | |||
8 | #include <linux/sched.h> /* required by litmus.h */ | 8 | #include <linux/sched.h> /* required by litmus.h */ |
9 | #include <asm/io.h> /* page_to_phys on SPARC */ | 9 | #include <asm/io.h> /* page_to_phys on SPARC */ |
10 | 10 | ||
11 | #ifdef CONFIG_PLUGIN_COLOR_UNCACHABLE | ||
12 | #include <asm/cacheflush.h> /* set_memory_uc */ | ||
13 | #endif | ||
14 | |||
11 | #include <litmus/color.h> | 15 | #include <litmus/color.h> |
12 | #include <litmus/litmus.h> /* for in_list(...) */ | 16 | #include <litmus/litmus.h> /* for in_list(...) */ |
13 | 17 | ||
@@ -106,6 +110,10 @@ static int do_add_pages(void) | |||
106 | int ret = 0; | 110 | int ret = 0; |
107 | 111 | ||
108 | while (smallest_nr_pages() < PAGES_PER_COLOR) { | 112 | while (smallest_nr_pages() < PAGES_PER_COLOR) { |
113 | #ifdef CONFIG_PLUGIN_COLOR_UNCACHABLE | ||
114 | unsigned long vaddr; | ||
115 | #endif | ||
116 | |||
109 | #if defined(CONFIG_X86) | 117 | #if defined(CONFIG_X86) |
110 | page = alloc_page(GFP_HIGHUSER | __GFP_ZERO | | 118 | page = alloc_page(GFP_HIGHUSER | __GFP_ZERO | |
111 | __GFP_MOVABLE); | 119 | __GFP_MOVABLE); |
@@ -122,6 +130,13 @@ static int do_add_pages(void) | |||
122 | color = page_color(page); | 130 | color = page_color(page); |
123 | if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR) { | 131 | if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR) { |
124 | SetPageReserved(page); | 132 | SetPageReserved(page); |
133 | #ifdef CONFIG_PLUGIN_COLOR_UNCACHABLE | ||
134 | vaddr = (unsigned long) pfn_to_kaddr(page_to_pfn(page)); | ||
135 | if (set_memory_uc(vaddr, 1)) { | ||
136 | printk(KERN_ALERT "Could not set_memory_uc\n"); | ||
137 | BUG(); | ||
138 | } | ||
139 | #endif | ||
125 | add_page_to_color_list(page); | 140 | add_page_to_color_list(page); |
126 | } else | 141 | } else |
127 | list_add_tail(&page->lru, &free_later); | 142 | list_add_tail(&page->lru, &free_later); |
diff --git a/litmus/color_dev.c b/litmus/color_dev.c index d8480d7fd543..51760328418e 100644 --- a/litmus/color_dev.c +++ b/litmus/color_dev.c | |||
@@ -159,6 +159,10 @@ static int do_map_colored_pages(struct vm_area_struct *vma) | |||
159 | TRACE_CUR(ALLOC_NAME ": allocating %lu pages (flags:%lx prot:%lx)\n", | 159 | TRACE_CUR(ALLOC_NAME ": allocating %lu pages (flags:%lx prot:%lx)\n", |
160 | nr_pages, vma->vm_flags, pgprot_val(vma->vm_page_prot)); | 160 | nr_pages, vma->vm_flags, pgprot_val(vma->vm_page_prot)); |
161 | 161 | ||
162 | #ifdef CONFIG_PLUGIN_COLOR_UNCACHABLE | ||
163 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||
164 | #endif | ||
165 | |||
162 | for (i = 0, nr_mapped = 0; nr_mapped < nr_pages; ++i) { | 166 | for (i = 0, nr_mapped = 0; nr_mapped < nr_pages; ++i) { |
163 | const unsigned long color_no = color_ctrl->colors[i]; | 167 | const unsigned long color_no = color_ctrl->colors[i]; |
164 | unsigned int page_no = 0; | 168 | unsigned int page_no = 0; |
@@ -167,6 +171,11 @@ static int do_map_colored_pages(struct vm_area_struct *vma) | |||
167 | const unsigned long addr = vma->vm_start + | 171 | const unsigned long addr = vma->vm_start + |
168 | (nr_mapped << PAGE_SHIFT); | 172 | (nr_mapped << PAGE_SHIFT); |
169 | struct page *page = get_colored_page(color_no); | 173 | struct page *page = get_colored_page(color_no); |
174 | #ifdef CONFIG_PLUGIN_COLOR_UNCACHABLE | ||
175 | const pgprot_t ins_prot = pgprot_noncached(PAGE_SHARED); | ||
176 | #else | ||
177 | const pgprot_t ins_prot = PAGE_SHARED; | ||
178 | #endif | ||
170 | 179 | ||
171 | if (!page) { | 180 | if (!page) { |
172 | TRACE_CUR(ALLOC_NAME ": Could not get page with" | 181 | TRACE_CUR(ALLOC_NAME ": Could not get page with" |
@@ -181,21 +190,19 @@ static int do_map_colored_pages(struct vm_area_struct *vma) | |||
181 | #endif | 190 | #endif |
182 | 191 | ||
183 | TRACE_CUR(ALLOC_NAME ": insert page (pa:0x%10llx, " | 192 | TRACE_CUR(ALLOC_NAME ": insert page (pa:0x%10llx, " |
184 | "pfn:%8lu, color:%3lu) at 0x%lx (flags:%16lx " | 193 | "pfn:%8lu, color:%3lu, prot:%lx) at 0x%lx " |
185 | "prot:%16lx) PAGE_SHARED:0x%16lx\n", | 194 | "vma:(flags:%16lx prot:%16lx)\n", |
186 | page_to_phys(page), | 195 | page_to_phys(page), |
187 | page_to_pfn(page), color_no, addr, | 196 | page_to_pfn(page), color_no, |
188 | vma->vm_flags, pgprot_val(vma->vm_page_prot), | 197 | pgprot_val(ins_prot), addr, |
189 | PAGE_SHARED); | 198 | vma->vm_flags, |
199 | pgprot_val(vma->vm_page_prot)); | ||
190 | 200 | ||
191 | err = remap_pfn_range(vma, addr, page_to_pfn(page), | 201 | err = remap_pfn_range(vma, addr, page_to_pfn(page), |
192 | PAGE_SIZE, PAGE_SHARED); | 202 | PAGE_SIZE, ins_prot); |
193 | |||
194 | if (err) { | 203 | if (err) { |
195 | TRACE_CUR(ALLOC_NAME ": remap_pfn_range() fail " | 204 | TRACE_CUR(ALLOC_NAME ": remap_pfn_range() fail " |
196 | "(%d) (flags:%lx prot:%lx)\n", err, | 205 | "(%d)\n", err); |
197 | vma->vm_flags, | ||
198 | pgprot_val(vma->vm_page_prot)); | ||
199 | /* TODO unmap mapped pages */ | 206 | /* TODO unmap mapped pages */ |
200 | err = -EINVAL; | 207 | err = -EINVAL; |
201 | goto out; | 208 | goto out; |