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 |
