aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/litmus.c
diff options
context:
space:
mode:
authorNamhoon Kim <namhoonk@cs.unc.edu>2016-10-12 19:13:30 -0400
committerNamhoon Kim <namhoonk@cs.unc.edu>2016-10-12 19:13:30 -0400
commita53078ec5cc167413bad6dd7ce3c1fc8ec97d39e (patch)
tree00d403a486ddbdb6425fd5fe7141c98c08169417 /litmus/litmus.c
parent2bed3116318647479e14aa22ff762bed16c066b4 (diff)
RTAS 2017 Submission ver.wip-shared-lib2
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r--litmus/litmus.c110
1 files changed, 25 insertions, 85 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c
index 1f5e49114b2c..7fbabcee64d5 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -385,7 +385,7 @@ asmlinkage long sys_set_page_color(int cpu)
385 put_task_struct(current); 385 put_task_struct(current);
386 386
387 down_read(&mm->mmap_sem); 387 down_read(&mm->mmap_sem);
388 TRACE_TASK(current, "SYSCALL set_page_color\n"); 388
389 vma_itr = mm->mmap; 389 vma_itr = mm->mmap;
390 /* Iterate all vm_area_struct */ 390 /* Iterate all vm_area_struct */
391 while (vma_itr != NULL) { 391 while (vma_itr != NULL) {
@@ -439,10 +439,6 @@ asmlinkage long sys_set_page_color(int cpu)
439 lib_page->r_pfn[cpu_i] = INVALID_PFN; 439 lib_page->r_pfn[cpu_i] = INVALID_PFN;
440 } 440 }
441 list_add_tail(&lib_page->list, &shared_lib_pages); 441 list_add_tail(&lib_page->list, &shared_lib_pages);
442 TRACE_TASK(current, "NEW PAGE %05lx ADDED.\n", lib_page->master_pfn);
443 }
444 else {
445 TRACE_TASK(current, "FOUND PAGE %05lx in the list.\n", lib_page->master_pfn);
446 } 442 }
447 443
448 /* add to task_shared_pagelist */ 444 /* add to task_shared_pagelist */
@@ -475,15 +471,11 @@ asmlinkage long sys_set_page_color(int cpu)
475 } 471 }
476 472
477 ret = 0; 473 ret = 0;
478 if (!is_realtime(current)) 474 lv = tsk_rt(current)->mc2_data->crit;
475 if (cpu == -1)
479 node = 8; 476 node = 8;
480 else { 477 else
481 lv = tsk_rt(current)->mc2_data->crit; 478 node = cpu*2 + lv;
482 if (cpu == -1)
483 node = 8;
484 else
485 node = cpu*2 + lv;
486 }
487 479
488 /* Migrate private pages */ 480 /* Migrate private pages */
489 if (!list_empty(&pagelist)) { 481 if (!list_empty(&pagelist)) {
@@ -511,60 +503,11 @@ asmlinkage long sys_set_page_color(int cpu)
511 printk(KERN_INFO "node = %ld, nr_private_pages = %d, nr_shared_pages = %d, nr_failed_to_isolate_lru = %d, nr_not_migrated = %d\n", node, nr_pages, nr_shared_pages, nr_failed, nr_not_migrated); 503 printk(KERN_INFO "node = %ld, nr_private_pages = %d, nr_shared_pages = %d, nr_failed_to_isolate_lru = %d, nr_not_migrated = %d\n", node, nr_pages, nr_shared_pages, nr_failed, nr_not_migrated);
512 504
513 flush_cache(1); 505 flush_cache(1);
514
515/* for debug START */
516 TRACE_TASK(current, "PSL PAGES\n");
517 {
518 struct shared_lib_page *lpage;
519
520 rcu_read_lock();
521 list_for_each_entry(lpage, &shared_lib_pages, list)
522 {
523 TRACE_TASK(current, "master_PFN = %05lx r_PFN = %05lx, %05lx, %05lx, %05lx, %05lx\n", lpage->master_pfn, lpage->r_pfn[0], lpage->r_pfn[1], lpage->r_pfn[2], lpage->r_pfn[3], lpage->r_pfn[4]);
524 }
525 rcu_read_unlock();
526 }
527#if 0
528 TRACE_TASK(current, "AFTER migration\n");
529 down_read(&mm->mmap_sem);
530 vma_itr = mm->mmap;
531 while (vma_itr != NULL) {
532 unsigned int num_pages = 0, i;
533 struct page *old_page = NULL;
534
535 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE;
536 for (i = 0; i < num_pages; i++) {
537 old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT);
538 if (IS_ERR(old_page))
539 continue;
540 if (!old_page)
541 continue;
542
543 if (PageReserved(old_page)) {
544 TRACE("Reserved Page!\n");
545 put_page(old_page);
546 continue;
547 }
548
549 if (page_count(old_page) - page_mapcount(old_page) == 1) {
550 put_page(old_page);
551 continue;
552 }
553
554 TRACE_TASK(current, "addr: %08x, pfn: %05lx, _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));
555 put_page(old_page);
556 }
557
558 vma_itr = vma_itr->vm_next;
559 }
560 up_read(&mm->mmap_sem);
561/* for debug FIN. */
562#endif
563 506
564 return nr_not_migrated; 507 return nr_not_migrated;
565} 508}
566 509
567/* sys_test_call() is a test system call for developing */ 510/* sys_test_call() is a test system call for debugging */
568asmlinkage long sys_test_call(unsigned int param) 511asmlinkage long sys_test_call(unsigned int param)
569{ 512{
570 long ret = 0; 513 long ret = 0;
@@ -572,6 +515,12 @@ asmlinkage long sys_test_call(unsigned int param)
572 515
573 TRACE_CUR("test_call param = %d\n", param); 516 TRACE_CUR("test_call param = %d\n", param);
574 517
518 /* if param == 0,
519 * show vm regions and the page frame numbers
520 * associated with the vm region.
521 * if param == 1,
522 * print the master list.
523 */
575 if (param == 0) { 524 if (param == 0) {
576 down_read(&current->mm->mmap_sem); 525 down_read(&current->mm->mmap_sem);
577 vma_itr = current->mm->mmap; 526 vma_itr = current->mm->mmap;
@@ -584,16 +533,7 @@ asmlinkage long sys_test_call(unsigned int param)
584 TRACE_TASK(current, "vm_flags : %lx\n", vma_itr->vm_flags); 533 TRACE_TASK(current, "vm_flags : %lx\n", vma_itr->vm_flags);
585 TRACE_TASK(current, "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot)); 534 TRACE_TASK(current, "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot));
586 TRACE_TASK(current, "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED); 535 TRACE_TASK(current, "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED);
587 /* if (vma_itr->vm_file) { 536
588 struct file *fp = vma_itr->vm_file;
589 unsigned long fcount = atomic_long_read(&(fp->f_count));
590 printk(KERN_INFO "f_count : %ld\n", fcount);
591 if (fcount > 1) {
592 vma_itr->vm_page_prot = pgprot_noncached(vma_itr->vm_page_prot);
593 }
594 }
595 printk(KERN_INFO "vm_prot2 : %x\n", pgprot_val(vma_itr->vm_page_prot));
596 */
597 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; 537 num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE;
598 for (i = 0; i < num_pages; i++) { 538 for (i = 0; i < num_pages; i++) {
599 old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); 539 old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT);
@@ -616,20 +556,20 @@ asmlinkage long sys_test_call(unsigned int param)
616 } 556 }
617 TRACE_TASK(current, "------------------------------------------------------\n"); 557 TRACE_TASK(current, "------------------------------------------------------\n");
618 up_read(&current->mm->mmap_sem); 558 up_read(&current->mm->mmap_sem);
619 } 559 } else if (param == 1) {
620 else if (param == 1) { 560 TRACE_TASK(current, "Shared pages and replicas.\n");
621 int i; 561 {
622 flush_cache(1); 562 struct shared_lib_page *lpage;
623 for (i = 0; i < 4; i++) { 563
624 lock_cache(i, 0x00003fff); 564 rcu_read_lock();
625 } 565 list_for_each_entry(lpage, &shared_lib_pages, list)
626 } 566 {
627 else if (param == 2) { 567 TRACE_TASK(current, "master_PFN = %05lx r_PFN = %05lx, %05lx, %05lx, %05lx, %05lx\n", lpage->master_pfn, lpage->r_pfn[0], lpage->r_pfn[1], lpage->r_pfn[2], lpage->r_pfn[3], lpage->r_pfn[4]);
628 int i; 568 }
629 for (i = 0; i < 4; i++) { 569 rcu_read_unlock();
630 lock_cache(i, 0xffffffff);
631 } 570 }
632 } 571 }
572
633 return ret; 573 return ret;
634} 574}
635 575