diff options
author | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-09-25 16:31:19 -0400 |
---|---|---|
committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-09-25 16:31:19 -0400 |
commit | cbe4c29edb5e783a5839d72705c18e5a795c4e05 (patch) | |
tree | 5f1b36d0a82f82351fdfa3243ea769e8c83d65a5 /litmus | |
parent | ba1e5e20e2a3481b973244e84597ed246a04fed0 (diff) |
Fix isolrate_lru_page for shared pages
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/litmus.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/litmus/litmus.c b/litmus/litmus.c index ad3d50c78bb1..f88cd16ab86d 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c | |||
@@ -440,10 +440,16 @@ asmlinkage long sys_set_page_color(int cpu) | |||
440 | } | 440 | } |
441 | 441 | ||
442 | /* add to task_shared_pagelist */ | 442 | /* add to task_shared_pagelist */ |
443 | list_add_tail(&old_page->lru, &task_shared_pagelist); | 443 | ret = isolate_lru_page(old_page); |
444 | 444 | if (!ret) { | |
445 | nr_shared_pages++; | 445 | list_add_tail(&old_page->lru, &task_shared_pagelist); |
446 | TRACE_TASK(current, "SHARED\n"); | 446 | inc_zone_page_state(old_page, NR_ISOLATED_ANON + !PageSwapBacked(old_page)); |
447 | nr_shared_pages++; | ||
448 | TRACE_TASK(current, "SHARED isolate_lur_page success\n"); | ||
449 | } else { | ||
450 | TRACE_TASK(current, "SHARED isolate_lru_page failed\n"); | ||
451 | } | ||
452 | put_page(old_page); | ||
447 | } | 453 | } |
448 | else { | 454 | else { |
449 | ret = isolate_lru_page(old_page); | 455 | ret = isolate_lru_page(old_page); |
@@ -489,7 +495,7 @@ asmlinkage long sys_set_page_color(int cpu) | |||
489 | putback_movable_pages(&pagelist); | 495 | putback_movable_pages(&pagelist); |
490 | } | 496 | } |
491 | } | 497 | } |
492 | 498 | /* | |
493 | { | 499 | { |
494 | struct list_head *pos, *q; | 500 | struct list_head *pos, *q; |
495 | list_for_each_safe(pos, q, &task_shared_pagelist) { | 501 | list_for_each_safe(pos, q, &task_shared_pagelist) { |
@@ -504,7 +510,7 @@ asmlinkage long sys_set_page_color(int cpu) | |||
504 | } | 510 | } |
505 | } | 511 | } |
506 | } | 512 | } |
507 | 513 | */ | |
508 | if (!list_empty(&task_shared_pagelist)) { | 514 | if (!list_empty(&task_shared_pagelist)) { |
509 | ret = replicate_pages(&task_shared_pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL); | 515 | ret = replicate_pages(&task_shared_pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL); |
510 | TRACE_TASK(current, "%ld shared pages not migrated.\n", ret); | 516 | TRACE_TASK(current, "%ld shared pages not migrated.\n", ret); |
@@ -590,12 +596,14 @@ asmlinkage long sys_test_call(unsigned int param) | |||
590 | down_read(¤t->mm->mmap_sem); | 596 | down_read(¤t->mm->mmap_sem); |
591 | vma_itr = current->mm->mmap; | 597 | vma_itr = current->mm->mmap; |
592 | while (vma_itr != NULL) { | 598 | while (vma_itr != NULL) { |
593 | printk(KERN_INFO "--------------------------------------------\n"); | 599 | int i, num_pages; |
594 | printk(KERN_INFO "vm_start : %lx\n", vma_itr->vm_start); | 600 | struct page* old_page; |
595 | printk(KERN_INFO "vm_end : %lx\n", vma_itr->vm_end); | 601 | TRACE_TASK(current, "--------------------------------------------\n"); |
596 | printk(KERN_INFO "vm_flags : %lx\n", vma_itr->vm_flags); | 602 | TRACE_TASK(current, "vm_start : %lx\n", vma_itr->vm_start); |
597 | printk(KERN_INFO "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot)); | 603 | TRACE_TASK(current, "vm_end : %lx\n", vma_itr->vm_end); |
598 | printk(KERN_INFO "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED); | 604 | TRACE_TASK(current, "vm_flags : %lx\n", vma_itr->vm_flags); |
605 | TRACE_TASK(current, "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot)); | ||
606 | TRACE_TASK(current, "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED); | ||
599 | /* if (vma_itr->vm_file) { | 607 | /* if (vma_itr->vm_file) { |
600 | struct file *fp = vma_itr->vm_file; | 608 | struct file *fp = vma_itr->vm_file; |
601 | unsigned long fcount = atomic_long_read(&(fp->f_count)); | 609 | unsigned long fcount = atomic_long_read(&(fp->f_count)); |
@@ -606,14 +614,28 @@ asmlinkage long sys_test_call(unsigned int param) | |||
606 | } | 614 | } |
607 | printk(KERN_INFO "vm_prot2 : %x\n", pgprot_val(vma_itr->vm_page_prot)); | 615 | printk(KERN_INFO "vm_prot2 : %x\n", pgprot_val(vma_itr->vm_page_prot)); |
608 | */ | 616 | */ |
617 | num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; | ||
618 | for (i = 0; i < num_pages; i++) { | ||
619 | old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); | ||
620 | |||
621 | if (IS_ERR(old_page)) | ||
622 | continue; | ||
623 | if (!old_page) | ||
624 | continue; | ||
625 | |||
626 | if (PageReserved(old_page)) { | ||
627 | TRACE("Reserved Page!\n"); | ||
628 | put_page(old_page); | ||
629 | continue; | ||
630 | } | ||
631 | |||
632 | 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":"-"); | ||
633 | put_page(old_page); | ||
634 | } | ||
609 | vma_itr = vma_itr->vm_next; | 635 | vma_itr = vma_itr->vm_next; |
610 | } | 636 | } |
611 | printk(KERN_INFO "--------------------------------------------\n"); | 637 | printk(KERN_INFO "--------------------------------------------\n"); |
612 | up_read(¤t->mm->mmap_sem); | 638 | up_read(¤t->mm->mmap_sem); |
613 | |||
614 | local_irq_save(flags); | ||
615 | l2c310_flush_all(); | ||
616 | local_irq_restore(flags); | ||
617 | } | 639 | } |
618 | else if (param == 1) { | 640 | else if (param == 1) { |
619 | int i; | 641 | int i; |