diff options
author | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-03-31 14:53:23 -0400 |
---|---|---|
committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-03-31 14:53:23 -0400 |
commit | 95d1cb634561b6716e6909b956d12177e508c1b0 (patch) | |
tree | f03dd5e4b87d84c14ed50e43b1c8cc2646959593 | |
parent | a0039b91f779ab88e3c9acd6a2f237e24001c1e9 (diff) |
Add syscall defs.
-rw-r--r-- | arch/arm/kernel/calls.S | 6 | ||||
-rw-r--r-- | arch/x86/syscalls/syscall_32.tbl | 6 | ||||
-rw-r--r-- | arch/x86/syscalls/syscall_64.tbl | 6 | ||||
-rw-r--r-- | include/litmus/unistd_32.h | 8 | ||||
-rw-r--r-- | 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 @@ | |||
410 | CALL(sys_release_ts) | 410 | CALL(sys_release_ts) |
411 | CALL(sys_null_call) | 411 | CALL(sys_null_call) |
412 | /* 400 */ CALL(sys_get_current_budget) | 412 | /* 400 */ CALL(sys_get_current_budget) |
413 | CALL(sys_test_call) | 413 | CALL(sys_reservation_create) |
414 | CALL(sys_reservation_destroy) | ||
415 | CALL(sys_set_mc2_task_param) | ||
416 | CALL(sys_set_page_color) | ||
417 | /* 405 */ CALL(sys_test_call) | ||
414 | 418 | ||
415 | 419 | ||
416 | #ifndef syscalls_counted | 420 | #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 @@ | |||
378 | 369 i386 release_ts sys_release_ts | 378 | 369 i386 release_ts sys_release_ts |
379 | 370 i386 null_call sys_null_call | 379 | 370 i386 null_call sys_null_call |
380 | 371 i386 get_current_budget sys_get_current_budget | 380 | 371 i386 get_current_budget sys_get_current_budget |
381 | 372 i386 test_call sys_test_call \ No newline at end of file | 381 | 372 i386 reservation_create sys_reservation_create |
382 | 373 i386 reservation_destroy sys_reservation_destroy | ||
383 | 374 i386 set_mc2_task_param sys_set_mc2_task_param | ||
384 | 375 i386 set_page_color sys_set_page_color | ||
385 | 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 @@ | |||
343 | 361 common release_ts sys_release_ts | 343 | 361 common release_ts sys_release_ts |
344 | 362 common null_call sys_null_call | 344 | 362 common null_call sys_null_call |
345 | 363 common get_current_budget sys_get_current_budget | 345 | 363 common get_current_budget sys_get_current_budget |
346 | 364 common test_call sys_test_call | 346 | 364 common reservation_create sys_reservation_create |
347 | 365 common reservation_destroy sys_reservation_destroy | ||
348 | 366 common set_mc2_task_param sys_set_mc2_task_param | ||
349 | 367 common set_page_color sys_set_page_color | ||
350 | 368 common test_call sys_test_call | ||
347 | 351 | ||
348 | 352 | ||
349 | # | 353 | # |
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 @@ | |||
18 | #define __NR_release_ts __LSC(10) | 18 | #define __NR_release_ts __LSC(10) |
19 | #define __NR_null_call __LSC(11) | 19 | #define __NR_null_call __LSC(11) |
20 | #define __NR_get_current_budget __LSC(12) | 20 | #define __NR_get_current_budget __LSC(12) |
21 | #define __NR_test_call __LSC(13) | 21 | #define __NR_reservation_create __LSC(13) |
22 | #define __NR_reservation_destroy __LSC(14) | ||
23 | #define __NR_set_mc2_task_param __LSC(15) | ||
24 | #define __NR_set_page_color __LSC(16) | ||
25 | #define __NR_test_call __LSC(17) | ||
22 | 26 | ||
23 | #define NR_litmus_syscalls 14 | 27 | #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 @@ | |||
14 | #include <linux/sched/rt.h> | 14 | #include <linux/sched/rt.h> |
15 | #include <linux/rwsem.h> | 15 | #include <linux/rwsem.h> |
16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | #include <linux/migrate.h> | ||
18 | #include <linux/mm.h> | ||
19 | #include <linux/memcontrol.h> | ||
20 | #include <linux/mm_inline.h> | ||
17 | 21 | ||
18 | #include <litmus/litmus.h> | 22 | #include <litmus/litmus.h> |
19 | #include <litmus/bheap.h> | 23 | #include <litmus/bheap.h> |
@@ -21,6 +25,8 @@ | |||
21 | #include <litmus/rt_domain.h> | 25 | #include <litmus/rt_domain.h> |
22 | #include <litmus/litmus_proc.h> | 26 | #include <litmus/litmus_proc.h> |
23 | #include <litmus/sched_trace.h> | 27 | #include <litmus/sched_trace.h> |
28 | #include <litmus/cache_proc.h> | ||
29 | #include <litmus/mc2_common.h> | ||
24 | 30 | ||
25 | #ifdef CONFIG_SCHED_CPU_AFFINITY | 31 | #ifdef CONFIG_SCHED_CPU_AFFINITY |
26 | #include <litmus/affinity.h> | 32 | #include <litmus/affinity.h> |
@@ -316,6 +322,144 @@ asmlinkage long sys_null_call(cycles_t __user *ts) | |||
316 | return ret; | 322 | return ret; |
317 | } | 323 | } |
318 | 324 | ||
325 | asmlinkage long sys_reservation_create(int type, void __user *config) | ||
326 | { | ||
327 | return litmus->reservation_create(type, config); | ||
328 | } | ||
329 | |||
330 | asmlinkage long sys_reservation_destroy(unsigned int reservation_id, int cpu) | ||
331 | { | ||
332 | return litmus->reservation_destroy(reservation_id, cpu); | ||
333 | } | ||
334 | |||
335 | static unsigned long color_mask; | ||
336 | |||
337 | static inline unsigned long page_color(struct page *page) | ||
338 | { | ||
339 | return ((page_to_phys(page) & color_mask) >> PAGE_SHIFT); | ||
340 | } | ||
341 | |||
342 | extern int isolate_lru_page(struct page *page); | ||
343 | extern void putback_movable_page(struct page *page); | ||
344 | extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); | ||
345 | |||
346 | asmlinkage long sys_set_page_color(int cpu) | ||
347 | { | ||
348 | long ret = 0; | ||
349 | //struct page *page_itr = NULL; | ||
350 | struct vm_area_struct *vma_itr = NULL; | ||
351 | int nr_pages = 0, nr_shared_pages = 0, nr_failed = 0; | ||
352 | unsigned long node; | ||
353 | enum crit_level lv; | ||
354 | |||
355 | LIST_HEAD(pagelist); | ||
356 | LIST_HEAD(shared_pagelist); | ||
357 | |||
358 | |||
359 | down_read(¤t->mm->mmap_sem); | ||
360 | TRACE_TASK(current, "SYSCALL set_page_color\n"); | ||
361 | vma_itr = current->mm->mmap; | ||
362 | while (vma_itr != NULL) { | ||
363 | unsigned int num_pages = 0, i; | ||
364 | struct page *old_page = NULL; | ||
365 | |||
366 | num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; | ||
367 | // print vma flags | ||
368 | //printk(KERN_INFO "flags: 0x%lx\n", vma_itr->vm_flags); | ||
369 | //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); | ||
370 | //printk(KERN_INFO "vm_page_prot: 0x%lx\n", vma_itr->vm_page_prot); | ||
371 | |||
372 | for (i = 0; i < num_pages; i++) { | ||
373 | old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); | ||
374 | |||
375 | if (IS_ERR(old_page)) | ||
376 | continue; | ||
377 | if (!old_page) | ||
378 | continue; | ||
379 | |||
380 | if (PageReserved(old_page)) { | ||
381 | TRACE("Reserved Page!\n"); | ||
382 | put_page(old_page); | ||
383 | continue; | ||
384 | } | ||
385 | |||
386 | 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)); | ||
387 | |||
388 | if (page_mapcount(old_page) == 1) { | ||
389 | ret = isolate_lru_page(old_page); | ||
390 | if (!ret) { | ||
391 | list_add_tail(&old_page->lru, &pagelist); | ||
392 | inc_zone_page_state(old_page, NR_ISOLATED_ANON + !PageSwapBacked(old_page)); | ||
393 | nr_pages++; | ||
394 | } else { | ||
395 | TRACE_TASK(current, "isolate_lru_page failed\n"); | ||
396 | TRACE_TASK(current, "page_lru = %d PageLRU = %d\n", page_lru(old_page), PageLRU(old_page)); | ||
397 | nr_failed++; | ||
398 | } | ||
399 | //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); | ||
400 | put_page(old_page); | ||
401 | } | ||
402 | else { | ||
403 | nr_shared_pages++; | ||
404 | //printk(KERN_INFO "SHARED _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); | ||
405 | put_page(old_page); | ||
406 | } | ||
407 | } | ||
408 | |||
409 | vma_itr = vma_itr->vm_next; | ||
410 | } | ||
411 | |||
412 | //list_for_each_entry(page_itr, &pagelist, lru) { | ||
413 | // printk(KERN_INFO "B _mapcount = %d, _count = %d\n", page_mapcount(page_itr), page_count(page_itr)); | ||
414 | // } | ||
415 | |||
416 | ret = 0; | ||
417 | if (!is_realtime(current)) | ||
418 | lv = 1; | ||
419 | else { | ||
420 | lv = tsk_rt(current)->mc2_data->crit; | ||
421 | } | ||
422 | |||
423 | if (cpu == -1) | ||
424 | node = 8; | ||
425 | else | ||
426 | node = cpu*2 + lv; | ||
427 | //node= 0; | ||
428 | |||
429 | if (!list_empty(&pagelist)) { | ||
430 | ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_ASYNC, MR_SYSCALL); | ||
431 | TRACE_TASK(current, "%ld pages not migrated.\n", ret); | ||
432 | if (ret) { | ||
433 | putback_movable_pages(&pagelist); | ||
434 | } | ||
435 | } | ||
436 | |||
437 | /* handle sigpage and litmus ctrl_page */ | ||
438 | /* vma_itr = current->mm->mmap; | ||
439 | while (vma_itr != NULL) { | ||
440 | if (vma_itr->vm_start == tsk_rt(current)->addr_ctrl_page) { | ||
441 | TRACE("litmus ctrl_page = %08x\n", vma_itr->vm_start); | ||
442 | vma_itr->vm_page_prot = PAGE_SHARED; | ||
443 | break; | ||
444 | } | ||
445 | vma_itr = vma_itr->vm_next; | ||
446 | } | ||
447 | */ | ||
448 | up_read(¤t->mm->mmap_sem); | ||
449 | |||
450 | /* | ||
451 | list_for_each_entry(page_itr, &shared_pagelist, lru) { | ||
452 | 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)); | ||
453 | } | ||
454 | */ | ||
455 | TRACE_TASK(current, "nr_pages = %d nr_failed = %d\n", nr_pages, nr_failed); | ||
456 | printk(KERN_INFO "node = %ld, nr_pages = %d, nr_shared_pages = %d, nr_failed = %d\n", node, nr_pages, nr_shared_pages, nr_failed); | ||
457 | //printk(KERN_INFO "node = %d\n", cpu_to_node(smp_processor_id())); | ||
458 | flush_cache(1); | ||
459 | |||
460 | return ret; | ||
461 | } | ||
462 | |||
319 | /* sys_test_call() is a test system call for developing */ | 463 | /* sys_test_call() is a test system call for developing */ |
320 | asmlinkage long sys_test_call(unsigned int param) | 464 | asmlinkage long sys_test_call(unsigned int param) |
321 | { | 465 | { |
@@ -690,6 +834,12 @@ static int __init _init_litmus(void) | |||
690 | * mode change lock is used to enforce single mode change | 834 | * mode change lock is used to enforce single mode change |
691 | * operation. | 835 | * operation. |
692 | */ | 836 | */ |
837 | #if defined(CONFIG_CPU_V7) | ||
838 | unsigned int line_size_log = 5; // 2^5 = 32 byte | ||
839 | unsigned int cache_info_sets = 2048; // 64KB (way_size) / 32B (line_size) = 2048 | ||
840 | printk("LITMIS^RT-ARM kernel\n"); | ||
841 | #endif | ||
842 | |||
693 | printk("Starting LITMUS^RT kernel\n"); | 843 | printk("Starting LITMUS^RT kernel\n"); |
694 | 844 | ||
695 | register_sched_plugin(&linux_sched_plugin); | 845 | register_sched_plugin(&linux_sched_plugin); |
@@ -704,11 +854,15 @@ static int __init _init_litmus(void) | |||
704 | else | 854 | else |
705 | printk("Could not register kill rt tasks magic sysrq.\n"); | 855 | printk("Could not register kill rt tasks magic sysrq.\n"); |
706 | #endif | 856 | #endif |
707 | |||
708 | init_litmus_proc(); | 857 | init_litmus_proc(); |
709 | 858 | ||
710 | register_reboot_notifier(&shutdown_notifier); | 859 | register_reboot_notifier(&shutdown_notifier); |
711 | 860 | ||
861 | #if defined(CONFIG_CPU_V7) | ||
862 | color_mask = ((cache_info_sets << line_size_log) - 1) ^ (PAGE_SIZE - 1); | ||
863 | printk("Page color mask %lx\n", color_mask); | ||
864 | #endif | ||
865 | |||
712 | return 0; | 866 | return 0; |
713 | } | 867 | } |
714 | 868 | ||