diff options
Diffstat (limited to 'litmus/litmus.c')
-rw-r--r-- | litmus/litmus.c | 81 |
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); | |||
351 | extern void putback_movable_page(struct page *page); | 352 | extern void putback_movable_page(struct page *page); |
352 | extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); | 353 | extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); |
353 | 354 | ||
355 | DECLARE_PER_CPU(struct list_head, shared_lib_page_list); | ||
356 | |||
354 | asmlinkage long sys_set_page_color(int cpu) | 357 | asmlinkage 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(¤t->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 | } |