aboutsummaryrefslogtreecommitdiffstats
path: root/litmus
diff options
context:
space:
mode:
authorChristopher Kenna <cjk@cs.unc.edu>2012-05-07 21:34:37 -0400
committerChristopher Kenna <cjk@cs.unc.edu>2012-05-08 00:12:18 -0400
commit5fae0af221f5e914f945859e6a33df3e6206ac46 (patch)
treeddce605e75e3e0d62d9e866a0ff91a63568acc07 /litmus
parentc0d2e33a54c3f99e062d9545c4d43b5e22345611 (diff)
Make colored memory optionally un-cachable.
Diffstat (limited to 'litmus')
-rw-r--r--litmus/Kconfig7
-rw-r--r--litmus/color.c15
-rw-r--r--litmus/color_dev.c27
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
22config 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
22config PLUGIN_PFAIR 29config 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;