aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamhoon Kim <namhoonk@cs.unc.edu>2016-09-09 16:18:12 -0400
committerNamhoon Kim <namhoonk@cs.unc.edu>2016-09-09 16:18:12 -0400
commit805c547ee3cdc2ef6a5f7556fdf449ced2e48680 (patch)
treeabeae409739a576291942281f9acf56725d73a1a
parent418e60bb6948a4cf6eb7c737bea21c2314619c73 (diff)
TODO: Fix condition checks in replicate_page_move_mapping()wip-shared-lib
-rw-r--r--include/linux/migrate.h8
-rw-r--r--include/litmus/replicate_lib.h6
-rw-r--r--kernel/sched/litmus.c5
-rw-r--r--litmus/litmus.c60
-rw-r--r--litmus/replicate_lib.c2
-rw-r--r--mm/migrate.c552
6 files changed, 618 insertions, 15 deletions
diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index cac1c0904d5f..b16047b82472 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -33,6 +33,8 @@ extern int migrate_page(struct address_space *,
33 struct page *, struct page *, enum migrate_mode); 33 struct page *, struct page *, enum migrate_mode);
34extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free, 34extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
35 unsigned long private, enum migrate_mode mode, int reason); 35 unsigned long private, enum migrate_mode mode, int reason);
36extern int replicate_pages(struct list_head *l, new_page_t new, free_page_t free,
37 unsigned long private, enum migrate_mode mode, int reason);
36 38
37extern int migrate_prep(void); 39extern int migrate_prep(void);
38extern int migrate_prep_local(void); 40extern int migrate_prep_local(void);
@@ -50,7 +52,11 @@ static inline int migrate_pages(struct list_head *l, new_page_t new,
50 free_page_t free, unsigned long private, enum migrate_mode mode, 52 free_page_t free, unsigned long private, enum migrate_mode mode,
51 int reason) 53 int reason)
52 { return -ENOSYS; } 54 { return -ENOSYS; }
53 55static inline int replicate_pages(struct list_head *l, new_page_t new,
56 free_page_t free, unsigned long private, enum migrate_mode mode,
57 int reason)
58 { return -ENOSYS; }
59
54static inline int migrate_prep(void) { return -ENOSYS; } 60static inline int migrate_prep(void) { return -ENOSYS; }
55static inline int migrate_prep_local(void) { return -ENOSYS; } 61static inline int migrate_prep_local(void) { return -ENOSYS; }
56 62
diff --git a/include/litmus/replicate_lib.h b/include/litmus/replicate_lib.h
index af2af36b6b79..480ce4631529 100644
--- a/include/litmus/replicate_lib.h
+++ b/include/litmus/replicate_lib.h
@@ -7,8 +7,12 @@
7 7
8struct shared_lib_page { 8struct shared_lib_page {
9 struct page *p_page; 9 struct page *p_page;
10 unsigned long pfn; 10 struct page *r_page;
11 unsigned long p_pfn;
12 unsigned long r_pfn;
11 struct list_head list; 13 struct list_head list;
12}; 14};
13 15
16extern struct list_head shared_lib_pages;
17
14#endif 18#endif
diff --git a/kernel/sched/litmus.c b/kernel/sched/litmus.c
index 9d58690cf51a..cd36358cee75 100644
--- a/kernel/sched/litmus.c
+++ b/kernel/sched/litmus.c
@@ -20,8 +20,9 @@ static void update_time_litmus(struct rq *rq, struct task_struct *p)
20 /* task counter */ 20 /* task counter */
21 p->se.sum_exec_runtime += delta; 21 p->se.sum_exec_runtime += delta;
22 if (delta) { 22 if (delta) {
23 TRACE_TASK(p, "charged %llu exec time (total:%llu, rem:%llu)\n", 23 //TRACE_TASK(p, "charged %llu exec time (total:%llu, rem:%llu)\n",
24 delta, p->rt_param.job_params.exec_time, budget_remaining(p)); 24 //delta, p->rt_param.job_params.exec_time, budget_remaining(p));
25 ;
25 } 26 }
26 /* sched_clock() */ 27 /* sched_clock() */
27 p->se.exec_start = rq->clock; 28 p->se.exec_start = rq->clock;
diff --git a/litmus/litmus.c b/litmus/litmus.c
index 402c495f62c6..8e7f5e2e68df 100644
--- a/litmus/litmus.c
+++ b/litmus/litmus.c
@@ -353,6 +353,10 @@ extern void putback_movable_page(struct page *page);
353extern 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);
354 354
355DECLARE_PER_CPU(struct list_head, shared_lib_page_list); 355DECLARE_PER_CPU(struct list_head, shared_lib_page_list);
356#define INVALID_PFN (0xffffffff)
357LIST_HEAD(shared_lib_pages);
358//struct list_head shared_lib_pages = LIST_HEAD_INIT(shared_lib_pages);
359EXPORT_SYMBOL(shared_lib_pages);
356 360
357asmlinkage long sys_set_page_color(int cpu) 361asmlinkage long sys_set_page_color(int cpu)
358{ 362{
@@ -366,8 +370,8 @@ asmlinkage long sys_set_page_color(int cpu)
366 //struct list_head *shared_pagelist = this_cpu_ptr(&shared_lib_page_list); 370 //struct list_head *shared_pagelist = this_cpu_ptr(&shared_lib_page_list);
367 371
368 LIST_HEAD(pagelist); 372 LIST_HEAD(pagelist);
369 LIST_HEAD(shared_pagelist); 373 LIST_HEAD(task_shared_pagelist);
370 374
371 migrate_prep(); 375 migrate_prep();
372 376
373 rcu_read_lock(); 377 rcu_read_lock();
@@ -408,10 +412,36 @@ asmlinkage long sys_set_page_color(int cpu)
408 412
409 if (page_count(old_page) > 2 && vma_itr->vm_file != NULL && !(vma_itr->vm_flags&VM_WRITE)) { 413 if (page_count(old_page) > 2 && vma_itr->vm_file != NULL && !(vma_itr->vm_flags&VM_WRITE)) {
410 struct shared_lib_page *lib_page; 414 struct shared_lib_page *lib_page;
411 lib_page = kmalloc(sizeof(struct shared_lib_page), GFP_KERNEL); 415 int is_exist = 0;
412 lib_page->p_page = old_page; 416
413 lib_page->pfn = page_to_pfn(old_page); 417 /* update PSL list */
414 list_add_tail(&lib_page->list, &shared_pagelist); 418 /* check if this page is in the PSL list */
419 rcu_read_lock();
420 list_for_each_entry(lib_page, &shared_lib_pages, list)
421 {
422 if (page_to_pfn(old_page) == lib_page->p_pfn) {
423 is_exist = 1;
424 break;
425 }
426 }
427 rcu_read_unlock();
428
429 if (is_exist == 0) {
430 lib_page = kmalloc(sizeof(struct shared_lib_page), GFP_KERNEL);
431 lib_page->p_page = old_page;
432 lib_page->r_page = NULL;
433 lib_page->p_pfn = page_to_pfn(old_page);
434 lib_page->r_pfn = INVALID_PFN;
435 list_add_tail(&lib_page->list, &shared_lib_pages);
436 TRACE_TASK(current, "NEW PAGE %ld ADDED.\n", lib_page->p_pfn);
437 }
438 else {
439 TRACE_TASK(current, "FOUND PAGE %ld in the list.\n", lib_page->p_pfn);
440 }
441
442 /* add to task_shared_pagelist */
443 list_add_tail(&old_page->lru, &task_shared_pagelist);
444
415 nr_shared_pages++; 445 nr_shared_pages++;
416 TRACE_TASK(current, "SHARED\n"); 446 TRACE_TASK(current, "SHARED\n");
417 } 447 }
@@ -428,7 +458,7 @@ asmlinkage long sys_set_page_color(int cpu)
428 } 458 }
429 //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); 459 //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page));
430 put_page(old_page); 460 put_page(old_page);
431 TRACE_TASK(current, "PRIVATE\n"); 461 //TRACE_TASK(current, "PRIVATE\n");
432 } 462 }
433 } 463 }
434 TRACE_TASK(current, "PAGES_IN_VMA = %d size = %d KB\n", pages_in_vma, pages_in_vma*4); 464 TRACE_TASK(current, "PAGES_IN_VMA = %d size = %d KB\n", pages_in_vma, pages_in_vma*4);
@@ -454,13 +484,21 @@ asmlinkage long sys_set_page_color(int cpu)
454 if (!list_empty(&pagelist)) { 484 if (!list_empty(&pagelist)) {
455 ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL); 485 ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL);
456 TRACE_TASK(current, "%ld pages not migrated.\n", ret); 486 TRACE_TASK(current, "%ld pages not migrated.\n", ret);
457 printk(KERN_INFO "%ld pages not migrated.\n", ret);
458 nr_not_migrated = ret; 487 nr_not_migrated = ret;
459 if (ret) { 488 if (ret) {
460 putback_movable_pages(&pagelist); 489 putback_movable_pages(&pagelist);
461 } 490 }
462 } 491 }
463 492
493 if (!list_empty(&task_shared_pagelist)) {
494 ret = replicate_pages(&task_shared_pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL);
495 TRACE_TASK(current, "%ld shared pages not migrated.\n", ret);
496 nr_not_migrated += ret;
497 if (ret) {
498 putback_movable_pages(&task_shared_pagelist);
499 }
500 }
501
464 /* handle sigpage and litmus ctrl_page */ 502 /* handle sigpage and litmus ctrl_page */
465/* vma_itr = current->mm->mmap; 503/* vma_itr = current->mm->mmap;
466 while (vma_itr != NULL) { 504 while (vma_itr != NULL) {
@@ -480,14 +518,14 @@ asmlinkage long sys_set_page_color(int cpu)
480 518
481 flush_cache(1); 519 flush_cache(1);
482/* for debug START */ 520/* for debug START */
483 TRACE_TASK(current, "SHARED PAGES\n"); 521 TRACE_TASK(current, "PSL PAGES\n");
484 { 522 {
485 struct shared_lib_page *lpage; 523 struct shared_lib_page *lpage;
486 524
487 rcu_read_lock();