aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/litmus.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r--litmus/litmus.c81
1 files changed, 63 insertions, 18 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c
index ddb80e1aae12..402c495f62c6 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -27,6 +27,7 @@
27#include <litmus/sched_trace.h> 27#include <litmus/sched_trace.h>
28#include <litmus/cache_proc.h> 28#include <litmus/cache_proc.h>
29#include <litmus/mc2_common.h> 29#include <litmus/mc2_common.h>
30#include <litmus/replicate_lib.h>
30 31
31#ifdef CONFIG_SCHED_CPU_AFFINITY 32#ifdef CONFIG_SCHED_CPU_AFFINITY
32#include <litmus/affinity.h> 33#include <litmus/affinity.h>
@@ -351,6 +352,8 @@ extern int isolate_lru_page(struct page *page);
351extern void putback_movable_page(struct page *page); 352extern void putback_movable_page(struct page *page);
352extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); 353extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x);
353 354
355DECLARE_PER_CPU(struct list_head, shared_lib_page_list);
356
354asmlinkage long sys_set_page_color(int cpu) 357asmlinkage long sys_set_page_color(int cpu)
355{ 358{
356 long ret = 0; 359 long ret = 0;
@@ -360,6 +363,7 @@ asmlinkage long sys_set_page_color(int cpu)
360 unsigned long node; 363 unsigned long node;
361 enum crit_level lv; 364 enum crit_level lv;
362 struct mm_struct *mm; 365 struct mm_struct *mm;
366 //struct list_head *shared_pagelist = this_cpu_ptr(&shared_lib_page_list);
363 367
364 LIST_HEAD(pagelist); 368 LIST_HEAD(pagelist);
365 LIST_HEAD(shared_pagelist); 369 LIST_HEAD(shared_pagelist);
@@ -372,13 +376,13 @@ asmlinkage long sys_set_page_color(int cpu)
372 mm = get_task_mm(current); 376 mm = get_task_mm(current);
373 put_task_struct(current); 377 put_task_struct(current);
374 378
375 //down_read(&current->mm->mmap_sem);
376 down_read(&mm->mmap_sem); 379 down_read(&mm->mmap_sem);
377 TRACE_TASK(current, "SYSCALL set_page_color\n"); 380 TRACE_TASK(current, "SYSCALL set_page_color\n");
378 vma_itr = mm->mmap; 381 vma_itr = mm->mmap;
379 while (vma_itr != NULL) { 382 while (vma_itr != NULL) {
380 unsigned int num_pages = 0, i; 383 unsigned int num_pages = 0, i;
381 struct page *old_page = NULL; 384 struct page *old_page = NULL;
385 int pages_in_vma = 0;
382 386
383 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; 387 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE;
384 // print vma flags 388 // print vma flags
@@ -399,9 +403,19 @@ asmlinkage long sys_set_page_color(int cpu)
399 continue; 403 continue;
400 } 404 }
401 405
402 TRACE_TASK(current, "addr: %08x, pfn: %x, _mapcount: %d, _count: %d\n", vma_itr->vm_start + PAGE_SIZE*i, __page_to_pfn(old_page), page_mapcount(old_page), page_count(old_page)); 406 TRACE_TASK(current, "addr: %08x, pfn: %ld, _mapcount: %d, _count: %d flags: %s%s%s\n", vma_itr->vm_start + PAGE_SIZE*i, page_to_pfn(old_page), page_mapcount(old_page), page_count(old_page), vma_itr->vm_flags&VM_READ?"r":"-", vma_itr->vm_flags&VM_WRITE?"w":"-", vma_itr->vm_flags&VM_EXEC?"x":"-");
407 pages_in_vma++;
403 408
404 //if (page_mapcount(old_page) == 1) { 409 if (page_count(old_page) > 2 && vma_itr->vm_file != NULL && !(vma_itr->vm_flags&VM_WRITE)) {
410 struct shared_lib_page *lib_page;
411 lib_page = kmalloc(sizeof(struct shared_lib_page), GFP_KERNEL);
412 lib_page->p_page = old_page;
413 lib_page->pfn = page_to_pfn(old_page);
414 list_add_tail(&lib_page->list, &shared_pagelist);
415 nr_shared_pages++;
416 TRACE_TASK(current, "SHARED\n");
417 }
418 else {
405 ret = isolate_lru_page(old_page); 419 ret = isolate_lru_page(old_page);
406 if (!ret) { 420 if (!ret) {
407 list_add_tail(&old_page->lru, &pagelist); 421 list_add_tail(&old_page->lru, &pagelist);
@@ -414,16 +428,10 @@ asmlinkage long sys_set_page_color(int cpu)
414 } 428 }
415 //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); 429 //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page));
416 put_page(old_page); 430 put_page(old_page);
417 //} 431 TRACE_TASK(current, "PRIVATE\n");
418 /*
419 else {
420 nr_shared_pages++;
421 //printk(KERN_INFO "SHARED _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page));
422 put_page(old_page);
423 } 432 }
424 */
425 } 433 }
426 434 TRACE_TASK(current, "PAGES_IN_VMA = %d size = %d KB\n", pages_in_vma, pages_in_vma*4);
427 vma_itr = vma_itr->vm_next; 435 vma_itr = vma_itr->vm_next;
428 } 436 }
429 437
@@ -466,15 +474,52 @@ asmlinkage long sys_set_page_color(int cpu)
466*/ 474*/
467 up_read(&mm->mmap_sem); 475 up_read(&mm->mmap_sem);
468 476
469/* 477
470 list_for_each_entry(page_itr, &shared_pagelist, lru) {
471 TRACE("S Anon=%d, pfn = %lu, _mapcount = %d, _count = %d\n", PageAnon(page_itr), __page_to_pfn(page_itr), page_mapcount(page_itr), page_count(page_itr));
472 }
473*/
474 TRACE_TASK(current, "nr_pages = %d nr_failed = %d\n", nr_pages, nr_failed); 478 TRACE_TASK(current, "nr_pages = %d nr_failed = %d\n", nr_pages, nr_failed);
475 printk(KERN_INFO "node = %ld, nr_migrated_pages = %d, nr_shared_pages = %d, nr_failed = %d\n", node, nr_pages-nr_not_migrated, nr_failed-2, nr_failed); 479 printk(KERN_INFO "node = %ld, nr_migrated_pages = %d, nr_shared_pages = %d, nr_failed = %d\n", node, nr_pages-nr_not_migrated, nr_shared_pages, nr_failed);
476 //printk(KERN_INFO "node = %d\n", cpu_to_node(smp_processor_id())); 480
477 flush_cache(1); 481 flush_cache(1);
482/* for debug START */
483 TRACE_TASK(current, "SHARED PAGES\n");
484 {
485 struct shared_lib_page *lpage;
486
487 rcu_read_lock();
488 list_for_each_entry(lpage, &shared_pagelist, list)
489 {
490 TRACE_TASK(current, "PFN = %ld\n", lpage->pfn);
491 }
492 rcu_read_unlock();
493 }
494
495 TRACE_TASK(current, "AFTER migration\n");
496 down_read(&mm->mmap_sem);
497 vma_itr = mm->mmap;
498 while (vma_itr != NULL) {
499 unsigned int num_pages = 0, i;
500 struct page *old_page = NULL;
501
502 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE;
503 for (i = 0; i < num_pages; i++) {
504 old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT);
505 if (IS_ERR(old_page))
506 continue;
507 if (!old_page)
508 continue;
509
510 if (PageReserved(old_page)) {
511 TRACE("Reserved Page!\n");
512 put_page(old_page);
513 continue;
514 }
515 TRACE_TASK(current, "addr: %08x, pfn: %ld, _mapcount: %d, _count: %d\n", vma_itr->vm_start + PAGE_SIZE*i, __page_to_pfn(old_page), page_mapcount(old_page), page_count(old_page));
516 put_page(old_page);
517 }
518
519 vma_itr = vma_itr->vm_next;
520 }
521 up_read(&mm->mmap_sem);
522/* for debug FIN. */
478 523
479 return ret; 524 return ret;
480} 525}