From 4172fff1a3870af7d65675e05eb0b7aba3804ea8 Mon Sep 17 00:00:00 2001 From: Namhoon Kim Date: Fri, 30 Sep 2016 04:15:27 -0400 Subject: Support Multiple replica --- include/litmus/replicate_lib.h | 4 ++-- litmus/litmus.c | 11 ++++++++--- mm/migrate.c | 18 +++++++++--------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/litmus/replicate_lib.h b/include/litmus/replicate_lib.h index 16db7d81b66b..773468497416 100644 --- a/include/litmus/replicate_lib.h +++ b/include/litmus/replicate_lib.h @@ -7,9 +7,9 @@ struct shared_lib_page { struct page *master_page; - struct page *r_page; + struct page *r_page[NR_CPUS]; unsigned long int master_pfn; - unsigned long int r_pfn; + unsigned long int r_pfn[NR_CPUS]; struct list_head list; }; diff --git a/litmus/litmus.c b/litmus/litmus.c index 652e70df69bb..11e4c5da9c10 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -429,11 +429,16 @@ asmlinkage long sys_set_page_color(int cpu) rcu_read_unlock(); if (is_exist == 0) { + int cpu_i; lib_page = kmalloc(sizeof(struct shared_lib_page), GFP_KERNEL); lib_page->master_page = old_page; - lib_page->r_page = NULL; + //lib_page->r_page = NULL; lib_page->master_pfn = page_to_pfn(old_page); - lib_page->r_pfn = INVALID_PFN; + //lib_page->r_pfn = INVALID_PFN; + for (cpu_i = 0; cpu_i < NR_CPUS; cpu_i++) { + lib_page->r_page[cpu_i] = NULL; + lib_page->r_pfn[cpu_i] = INVALID_PFN; + } list_add_tail(&lib_page->list, &shared_lib_pages); TRACE_TASK(current, "NEW PAGE %05lx ADDED.\n", lib_page->master_pfn); } @@ -551,7 +556,7 @@ asmlinkage long sys_set_page_color(int cpu) rcu_read_lock(); list_for_each_entry(lpage, &shared_lib_pages, list) { - TRACE_TASK(current, "master_PFN = %05lx r_PFN = %05lx PageSwapCache=%d\n", lpage->master_pfn, lpage->r_pfn, PageSwapCache(lpage->master_page)); + TRACE_TASK(current, "master_PFN = %05lx r_PFN = %05lx, %05lx, %05lx, %05lx\n", lpage->master_pfn, lpage->r_pfn[0], lpage->r_pfn[1], lpage->r_pfn[2], lpage->r_pfn[3]); } rcu_read_unlock(); } diff --git a/mm/migrate.c b/mm/migrate.c index 0df1841282eb..d25cc2c2736d 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1398,29 +1398,29 @@ static ICE_noinline int unmap_and_copy(new_page_t get_new_page, int *result = NULL; struct page *newpage; struct shared_lib_page *lib_page; - int is_exist_in_psl = 0, has_replica = 0; - + int master_exist_in_psl = 0, has_replica = 0, cpu = private/2; + /* check if this page is in the PSL list */ rcu_read_lock(); list_for_each_entry(lib_page, &shared_lib_pages, list) { if (page_to_pfn(page) == lib_page->master_pfn) { - is_exist_in_psl = 1; + master_exist_in_psl = 1; break; } } rcu_read_unlock(); - if (is_exist_in_psl) - TRACE_TASK(current, "Page %x exists in PSL list\n", lib_page->master_pfn); + if (master_exist_in_psl) + TRACE_TASK(current, "Page %05lx exists in PSL list\n", lib_page->master_pfn); - if (lib_page->r_page == NULL) { + if (lib_page->r_page[cpu] == NULL) { newpage = get_new_page(page, private, &result); if (!newpage) return -ENOMEM; //printk(KERN_ERR "Page %lx allocated\n", page_to_pfn(newpage)); } else { - newpage = lib_page->r_page; + newpage = lib_page->r_page[cpu]; has_replica = 1; //printk(KERN_ERR "Page %lx found\n", page_to_pfn(newpage)); } @@ -1438,8 +1438,8 @@ static ICE_noinline int unmap_and_copy(new_page_t get_new_page, rc = __unmap_and_copy(page, newpage, force, mode, has_replica); if (has_replica == 0 && rc == MIGRATEPAGE_SUCCESS) { - lib_page->r_page = newpage; - lib_page->r_pfn = page_to_pfn(newpage); + lib_page->r_page[cpu] = newpage; + lib_page->r_pfn[cpu] = page_to_pfn(newpage); } out: -- cgit v1.2.2