diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2013-03-06 21:39:52 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2013-03-06 21:39:52 -0500 |
commit | 6aa68b530d69cd7e04b09b30ee76438a58fa9dc4 (patch) | |
tree | 9ce57e265c1c502334147f911ad4c19613cacfb7 | |
parent | 22da1b2b4f02413e58bf01caa5b14e42e7913598 (diff) |
share branch with otherswip-mmap-uncache
-rw-r--r-- | mm/mmap.c | 67 | ||||
-rw-r--r-- | tools/perf/Makefile | 5 |
2 files changed, 30 insertions, 42 deletions
@@ -1202,55 +1202,43 @@ static inline int accountable_mapping(struct file *file, vm_flags_t vm_flags) | |||
1202 | } | 1202 | } |
1203 | 1203 | ||
1204 | 1204 | ||
1205 | |||
1206 | |||
1207 | #if 0 | ||
1208 | #ifdef CONFIG_X86_PAT | ||
1209 | static int make_pages_uncache(unsigned long addr, unsigned long end) | 1205 | static int make_pages_uncache(unsigned long addr, unsigned long end) |
1210 | { | 1206 | { |
1211 | struct vm_area_struct * vma; | 1207 | int ret = 0; |
1212 | int len; | 1208 | int nr_pages; |
1213 | int ret; | 1209 | struct page **pages; |
1210 | struct vm_area_struct *vma; | ||
1211 | void *page_addr; | ||
1212 | void *vaddr; | ||
1213 | int i; | ||
1214 | 1214 | ||
1215 | vma = find_vma(current->mm, addr); | 1215 | vma = find_vma(current->mm, addr); |
1216 | if (!vma) | 1216 | if (!vma) |
1217 | return -ENOMEM; | 1217 | return -ENOMEM; |
1218 | 1218 | ||
1219 | BUG_ON(addr >= end); | 1219 | BUG_ON(addr >= end); |
1220 | BUG_ON(end > vma->vm_end); | ||
1221 | 1220 | ||
1222 | len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; | 1221 | nr_pages = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; |
1222 | pages = kmalloc(nr_pages * sizeof(*pages), GFP_KERNEL); | ||
1223 | // page_addr = (void *)(addr & PAGE_MASK); | ||
1224 | page_addr = (void *)(vma->vm_start & PAGE_MASK); | ||
1223 | 1225 | ||
1224 | printk("%s: Marking addresses from %p to %p as uncacheable (%d pages).\n", __FUNCTION__, (void*)vma->vm_start, (void*)vma->vm_end, len); | 1226 | if (NULL == pages) |
1225 | ret = set_memory_uc(vma->vm_start, len); | 1227 | return -ENOMEM; |
1226 | // ret = set_memory_uc((unsigned long)pfn_to_kaddr(page_to_pfn(virt_to_page(vma->vm_start))), len); | ||
1227 | printk("%s: result = %d\n", __FUNCTION__, ret); | ||
1228 | |||
1229 | return ret; | ||
1230 | } | ||
1231 | #else | ||
1232 | static int make_pages_uncache(unsigned long addr, unsigned long end) | ||
1233 | { | ||
1234 | // use ioremap_nocache()? | ||
1235 | return -ENOMEM; | ||
1236 | } | ||
1237 | #endif | ||
1238 | #endif | ||
1239 | 1228 | ||
1240 | static int make_pages_uncache(unsigned long addr, unsigned long end) | 1229 | for(i = 0; i < nr_pages; ++i, page_addr += PAGE_SIZE) { |
1241 | { | 1230 | pages[i] = page_addr; |
1242 | int len; | 1231 | } |
1243 | struct vm_area_struct *vma; | ||
1244 | 1232 | ||
1245 | vma = find_vma(current->mm, addr); | 1233 | vaddr = vmap(pages, nr_pages, VM_MAP, pgprot_noncached(vma->vm_page_prot)); |
1246 | if (!vma) | 1234 | if (NULL == vaddr) |
1247 | return -ENOMEM; | 1235 | ret = -ENOMEM; |
1248 | 1236 | ||
1249 | BUG_ON(addr >= end); | 1237 | kfree(pages); |
1250 | BUG_ON(end > vma->vm_end); | ||
1251 | 1238 | ||
1252 | len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; | 1239 | printk("uncache ret = %d\n", ret); |
1253 | 1240 | ||
1241 | return ret; | ||
1254 | } | 1242 | } |
1255 | 1243 | ||
1256 | unsigned long mmap_region(struct file *file, unsigned long addr, | 1244 | unsigned long mmap_region(struct file *file, unsigned long addr, |
@@ -1267,6 +1255,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, | |||
1267 | 1255 | ||
1268 | /* Clear old maps */ | 1256 | /* Clear old maps */ |
1269 | error = -ENOMEM; | 1257 | error = -ENOMEM; |
1258 | |||
1270 | munmap_back: | 1259 | munmap_back: |
1271 | vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent); | 1260 | vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent); |
1272 | if (vma && vma->vm_start < addr + len) { | 1261 | if (vma && vma->vm_start < addr + len) { |
@@ -1396,17 +1385,15 @@ out: | |||
1396 | if (!mlock_vma_pages_range(vma, addr, addr + len)) { | 1385 | if (!mlock_vma_pages_range(vma, addr, addr + len)) { |
1397 | mm->locked_vm += (len >> PAGE_SHIFT); | 1386 | mm->locked_vm += (len >> PAGE_SHIFT); |
1398 | } | 1387 | } |
1399 | } else if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK)) { | 1388 | } |
1400 | if (flags & MAP_UNCACHE) { | 1389 | else if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK)) { |
1401 | printk("populate!\n"); | ||
1402 | } | ||
1403 | make_pages_present(addr, addr + len); | 1390 | make_pages_present(addr, addr + len); |
1404 | } | 1391 | } |
1405 | /* | 1392 | |
1406 | if (flags & MAP_UNCACHE) { | 1393 | if (flags & MAP_UNCACHE) { |
1394 | /* is this needed with pgprot_noncached() set earlier? */ | ||
1407 | make_pages_uncache(addr, addr + len); | 1395 | make_pages_uncache(addr, addr + len); |
1408 | } | 1396 | } |
1409 | */ | ||
1410 | 1397 | ||
1411 | return addr; | 1398 | return addr; |
1412 | 1399 | ||
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 940257b5774e..916c02e845a6 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -92,7 +92,8 @@ ifndef PERF_DEBUG | |||
92 | CFLAGS_OPTIMIZE = -O6 | 92 | CFLAGS_OPTIMIZE = -O6 |
93 | endif | 93 | endif |
94 | 94 | ||
95 | CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 -Werror $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) | 95 | #CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 -Werror $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) |
96 | CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) | ||
96 | EXTLIBS = -lpthread -lrt -lelf -lm | 97 | EXTLIBS = -lpthread -lrt -lelf -lm |
97 | ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 | 98 | ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 |
98 | ALL_LDFLAGS = $(LDFLAGS) | 99 | ALL_LDFLAGS = $(LDFLAGS) |
@@ -161,7 +162,7 @@ endif | |||
161 | # Those must not be GNU-specific; they are shared with perl/ which may | 162 | # Those must not be GNU-specific; they are shared with perl/ which may |
162 | # be built by a different compiler. (Note that this is an artifact now | 163 | # be built by a different compiler. (Note that this is an artifact now |
163 | # but it still might be nice to keep that distinction.) | 164 | # but it still might be nice to keep that distinction.) |
164 | BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include | 165 | BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -I/home/gelliott/LitmusGPU/litmus-rt/include |
165 | BASIC_LDFLAGS = | 166 | BASIC_LDFLAGS = |
166 | 167 | ||
167 | # Guard against environment variables | 168 | # Guard against environment variables |