diff options
| author | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-09-09 16:18:12 -0400 |
|---|---|---|
| committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-09-09 16:18:12 -0400 |
| commit | 805c547ee3cdc2ef6a5f7556fdf449ced2e48680 (patch) | |
| tree | abeae409739a576291942281f9acf56725d73a1a | |
| parent | 418e60bb6948a4cf6eb7c737bea21c2314619c73 (diff) | |
TODO: Fix condition checks in replicate_page_move_mapping()wip-shared-lib
| -rw-r--r-- | include/linux/migrate.h | 8 | ||||
| -rw-r--r-- | include/litmus/replicate_lib.h | 6 | ||||
| -rw-r--r-- | kernel/sched/litmus.c | 5 | ||||
| -rw-r--r-- | litmus/litmus.c | 60 | ||||
| -rw-r--r-- | litmus/replicate_lib.c | 2 | ||||
| -rw-r--r-- | mm/migrate.c | 552 |
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); |
| 34 | extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free, | 34 | extern 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); |
| 36 | extern 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 | ||
| 37 | extern int migrate_prep(void); | 39 | extern int migrate_prep(void); |
| 38 | extern int migrate_prep_local(void); | 40 | extern 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 | 55 | static 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 | |||
| 54 | static inline int migrate_prep(void) { return -ENOSYS; } | 60 | static inline int migrate_prep(void) { return -ENOSYS; } |
| 55 | static inline int migrate_prep_local(void) { return -ENOSYS; } | 61 | static 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 | ||
| 8 | struct shared_lib_page { | 8 | struct 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 | ||
| 16 | extern 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); | |||
| 353 | 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); |
| 354 | 354 | ||
| 355 | DECLARE_PER_CPU(struct list_head, shared_lib_page_list); | 355 | DECLARE_PER_CPU(struct list_head, shared_lib_page_list); |
| 356 | #define INVALID_PFN (0xffffffff) | ||
| 357 | LIST_HEAD(shared_lib_pages); | ||
| 358 | //struct list_head shared_lib_pages = LIST_HEAD_INIT(shared_lib_pages); | ||
| 359 | EXPORT_SYMBOL(shared_lib_pages); | ||
| 356 | 360 | ||
| 357 | asmlinkage long sys_set_page_color(int cpu) | 361 | asmlinkage 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(); | ||
