From 95d1cb634561b6716e6909b956d12177e508c1b0 Mon Sep 17 00:00:00 2001 From: Namhoon Kim Date: Thu, 31 Mar 2016 14:53:23 -0400 Subject: Add syscall defs. --- arch/arm/kernel/calls.S | 6 +- arch/x86/syscalls/syscall_32.tbl | 6 +- arch/x86/syscalls/syscall_64.tbl | 6 +- include/litmus/unistd_32.h | 8 +- litmus/litmus.c | 156 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 176 insertions(+), 6 deletions(-) diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index a272b84a2fe7..6c2ad82fd2c8 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S @@ -410,7 +410,11 @@ CALL(sys_release_ts) CALL(sys_null_call) /* 400 */ CALL(sys_get_current_budget) - CALL(sys_test_call) + CALL(sys_reservation_create) + CALL(sys_reservation_destroy) + CALL(sys_set_mc2_task_param) + CALL(sys_set_page_color) +/* 405 */ CALL(sys_test_call) #ifndef syscalls_counted diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index af5e3ccf8b31..075709a93d34 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl @@ -378,4 +378,8 @@ 369 i386 release_ts sys_release_ts 370 i386 null_call sys_null_call 371 i386 get_current_budget sys_get_current_budget -372 i386 test_call sys_test_call \ No newline at end of file +372 i386 reservation_create sys_reservation_create +373 i386 reservation_destroy sys_reservation_destroy +374 i386 set_mc2_task_param sys_set_mc2_task_param +375 i386 set_page_color sys_set_page_color +376 i386 test_call sys_test_call diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl index e87042d413e9..e8fdeecd3d21 100644 --- a/arch/x86/syscalls/syscall_64.tbl +++ b/arch/x86/syscalls/syscall_64.tbl @@ -343,7 +343,11 @@ 361 common release_ts sys_release_ts 362 common null_call sys_null_call 363 common get_current_budget sys_get_current_budget -364 common test_call sys_test_call +364 common reservation_create sys_reservation_create +365 common reservation_destroy sys_reservation_destroy +366 common set_mc2_task_param sys_set_mc2_task_param +367 common set_page_color sys_set_page_color +368 common test_call sys_test_call # diff --git a/include/litmus/unistd_32.h b/include/litmus/unistd_32.h index 43527ee2f6b6..0000010f7d95 100644 --- a/include/litmus/unistd_32.h +++ b/include/litmus/unistd_32.h @@ -18,6 +18,10 @@ #define __NR_release_ts __LSC(10) #define __NR_null_call __LSC(11) #define __NR_get_current_budget __LSC(12) -#define __NR_test_call __LSC(13) +#define __NR_reservation_create __LSC(13) +#define __NR_reservation_destroy __LSC(14) +#define __NR_set_mc2_task_param __LSC(15) +#define __NR_set_page_color __LSC(16) +#define __NR_test_call __LSC(17) -#define NR_litmus_syscalls 14 +#define NR_litmus_syscalls 18 diff --git a/litmus/litmus.c b/litmus/litmus.c index 27efb22d1d2f..6d5f317e7537 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -14,6 +14,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -21,6 +25,8 @@ #include #include #include +#include +#include #ifdef CONFIG_SCHED_CPU_AFFINITY #include @@ -316,6 +322,144 @@ asmlinkage long sys_null_call(cycles_t __user *ts) return ret; } +asmlinkage long sys_reservation_create(int type, void __user *config) +{ + return litmus->reservation_create(type, config); +} + +asmlinkage long sys_reservation_destroy(unsigned int reservation_id, int cpu) +{ + return litmus->reservation_destroy(reservation_id, cpu); +} + +static unsigned long color_mask; + +static inline unsigned long page_color(struct page *page) +{ + return ((page_to_phys(page) & color_mask) >> PAGE_SHIFT); +} + +extern int isolate_lru_page(struct page *page); +extern void putback_movable_page(struct page *page); +extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); + +asmlinkage long sys_set_page_color(int cpu) +{ + long ret = 0; + //struct page *page_itr = NULL; + struct vm_area_struct *vma_itr = NULL; + int nr_pages = 0, nr_shared_pages = 0, nr_failed = 0; + unsigned long node; + enum crit_level lv; + + LIST_HEAD(pagelist); + LIST_HEAD(shared_pagelist); + + + down_read(¤t->mm->mmap_sem); + TRACE_TASK(current, "SYSCALL set_page_color\n"); + vma_itr = current->mm->mmap; + while (vma_itr != NULL) { + unsigned int num_pages = 0, i; + struct page *old_page = NULL; + + num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; + // print vma flags + //printk(KERN_INFO "flags: 0x%lx\n", vma_itr->vm_flags); + //printk(KERN_INFO "start - end: 0x%lx - 0x%lx (%lu)\n", vma_itr->vm_start, vma_itr->vm_end, (vma_itr->vm_end - vma_itr->vm_start)/PAGE_SIZE); + //printk(KERN_INFO "vm_page_prot: 0x%lx\n", vma_itr->vm_page_prot); + + for (i = 0; i < num_pages; i++) { + old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); + + if (IS_ERR(old_page)) + continue; + if (!old_page) + continue; + + if (PageReserved(old_page)) { + TRACE("Reserved Page!\n"); + put_page(old_page); + continue; + } + + 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)); + + if (page_mapcount(old_page) == 1) { + ret = isolate_lru_page(old_page); + if (!ret) { + list_add_tail(&old_page->lru, &pagelist); + inc_zone_page_state(old_page, NR_ISOLATED_ANON + !PageSwapBacked(old_page)); + nr_pages++; + } else { + TRACE_TASK(current, "isolate_lru_page failed\n"); + TRACE_TASK(current, "page_lru = %d PageLRU = %d\n", page_lru(old_page), PageLRU(old_page)); + nr_failed++; + } + //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); + put_page(old_page); + } + else { + nr_shared_pages++; + //printk(KERN_INFO "SHARED _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); + put_page(old_page); + } + } + + vma_itr = vma_itr->vm_next; + } + + //list_for_each_entry(page_itr, &pagelist, lru) { +// printk(KERN_INFO "B _mapcount = %d, _count = %d\n", page_mapcount(page_itr), page_count(page_itr)); +// } + + ret = 0; + if (!is_realtime(current)) + lv = 1; + else { + lv = tsk_rt(current)->mc2_data->crit; + } + + if (cpu == -1) + node = 8; + else + node = cpu*2 + lv; + //node= 0; + + if (!list_empty(&pagelist)) { + ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_ASYNC, MR_SYSCALL); + TRACE_TASK(current, "%ld pages not migrated.\n", ret); + if (ret) { + putback_movable_pages(&pagelist); + } + } + + /* handle sigpage and litmus ctrl_page */ +/* vma_itr = current->mm->mmap; + while (vma_itr != NULL) { + if (vma_itr->vm_start == tsk_rt(current)->addr_ctrl_page) { + TRACE("litmus ctrl_page = %08x\n", vma_itr->vm_start); + vma_itr->vm_page_prot = PAGE_SHARED; + break; + } + vma_itr = vma_itr->vm_next; + } +*/ + up_read(¤t->mm->mmap_sem); + +/* + list_for_each_entry(page_itr, &shared_pagelist, lru) { + 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)); + } +*/ + TRACE_TASK(current, "nr_pages = %d nr_failed = %d\n", nr_pages, nr_failed); + printk(KERN_INFO "node = %ld, nr_pages = %d, nr_shared_pages = %d, nr_failed = %d\n", node, nr_pages, nr_shared_pages, nr_failed); + //printk(KERN_INFO "node = %d\n", cpu_to_node(smp_processor_id())); + flush_cache(1); + + return ret; +} + /* sys_test_call() is a test system call for developing */ asmlinkage long sys_test_call(unsigned int param) { @@ -690,6 +834,12 @@ static int __init _init_litmus(void) * mode change lock is used to enforce single mode change * operation. */ +#if defined(CONFIG_CPU_V7) + unsigned int line_size_log = 5; // 2^5 = 32 byte + unsigned int cache_info_sets = 2048; // 64KB (way_size) / 32B (line_size) = 2048 + printk("LITMIS^RT-ARM kernel\n"); +#endif + printk("Starting LITMUS^RT kernel\n"); register_sched_plugin(&linux_sched_plugin); @@ -704,11 +854,15 @@ static int __init _init_litmus(void) else printk("Could not register kill rt tasks magic sysrq.\n"); #endif - init_litmus_proc(); register_reboot_notifier(&shutdown_notifier); +#if defined(CONFIG_CPU_V7) + color_mask = ((cache_info_sets << line_size_log) - 1) ^ (PAGE_SIZE - 1); + printk("Page color mask %lx\n", color_mask); +#endif + return 0; } -- cgit v1.2.2