diff options
author | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-10-12 19:13:30 -0400 |
---|---|---|
committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-10-12 19:13:30 -0400 |
commit | a53078ec5cc167413bad6dd7ce3c1fc8ec97d39e (patch) | |
tree | 00d403a486ddbdb6425fd5fe7141c98c08169417 /litmus/litmus.c | |
parent | 2bed3116318647479e14aa22ff762bed16c066b4 (diff) |
RTAS 2017 Submission ver.wip-shared-lib2
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r-- | litmus/litmus.c | 110 |
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 */ |
568 | asmlinkage long sys_test_call(unsigned int param) | 511 | asmlinkage 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(¤t->mm->mmap_sem); | 525 | down_read(¤t->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(¤t->mm->mmap_sem); | 558 | up_read(¤t->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 | ||