diff options
author | Namhoon Kim <namhoonk@cs.unc.edu> | 2017-05-01 14:13:05 -0400 |
---|---|---|
committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2017-05-01 14:13:05 -0400 |
commit | d97c84a58867f481fede002fbd1510fc51b34e9e (patch) | |
tree | e38052cab5dc4fb81207e979d56e53aeb55029c1 | |
parent | b388244876da9dbb2b7449bcc467fe4378ce1009 (diff) |
RTSS 2017 submissionwip-modechange
-rw-r--r-- | include/litmus/trace.h | 1 | ||||
-rw-r--r-- | litmus/bank_proc.c | 80 | ||||
-rw-r--r-- | litmus/jobs.c | 3 | ||||
-rw-r--r-- | litmus/litmus.c | 111 | ||||
-rw-r--r-- | litmus/sched_mc2.c | 458 |
5 files changed, 96 insertions, 557 deletions
diff --git a/include/litmus/trace.h b/include/litmus/trace.h index eb0a07f4ba04..4dbb39ea8a14 100644 --- a/include/litmus/trace.h +++ b/include/litmus/trace.h | |||
@@ -3,7 +3,6 @@ | |||
3 | 3 | ||
4 | #ifdef CONFIG_SCHED_OVERHEAD_TRACE | 4 | #ifdef CONFIG_SCHED_OVERHEAD_TRACE |
5 | 5 | ||
6 | |||
7 | #include <litmus/feather_trace.h> | 6 | #include <litmus/feather_trace.h> |
8 | #include <litmus/feather_buffer.h> | 7 | #include <litmus/feather_buffer.h> |
9 | 8 | ||
diff --git a/litmus/bank_proc.c b/litmus/bank_proc.c index 08b58f94c391..097cff177a2d 100644 --- a/litmus/bank_proc.c +++ b/litmus/bank_proc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * bank_proc.c -- Implementation of the page coloring for cache and bank partition. | 2 | * bank_proc.c -- Implementation of the page coloring for cache and bank partition. |
3 | * The file will keep a pool of colored pages. Users can require pages with | 3 | * The file will keep a pool of colored pages. Users can require pages with |
4 | * specific color or bank number. | 4 | * specific color or bank number. |
5 | * Part of the code is modified from Jonathan Herman's code | 5 | * Part of the code is modified from Jonathan Herman's code |
6 | */ | 6 | */ |
7 | #include <linux/init.h> | 7 | #include <linux/init.h> |
@@ -19,9 +19,6 @@ | |||
19 | #include <litmus/sched_trace.h> | 19 | #include <litmus/sched_trace.h> |
20 | #include <litmus/litmus.h> | 20 | #include <litmus/litmus.h> |
21 | 21 | ||
22 | //#define TRACE(fmt, args...) do {} while (false) | ||
23 | //#define TRACE_TASK(fmt, args...) do {} while (false) | ||
24 | |||
25 | #define LITMUS_LOCKDEP_NAME_MAX_LEN 50 | 22 | #define LITMUS_LOCKDEP_NAME_MAX_LEN 50 |
26 | 23 | ||
27 | // This Address Decoding is used in imx6-sabredsd platform | 24 | // This Address Decoding is used in imx6-sabredsd platform |
@@ -86,7 +83,6 @@ int node_index[9] = { | |||
86 | 83 | ||
87 | struct mutex void_lockdown_proc; | 84 | struct mutex void_lockdown_proc; |
88 | 85 | ||
89 | |||
90 | /* | 86 | /* |
91 | * Every page list should contain a lock, a list, and a number recording how many pages it store | 87 | * Every page list should contain a lock, a list, and a number recording how many pages it store |
92 | */ | 88 | */ |
@@ -105,7 +101,6 @@ static struct color_group *color_groups; | |||
105 | */ | 101 | */ |
106 | unsigned int counting_one_set(unsigned int v) | 102 | unsigned int counting_one_set(unsigned int v) |
107 | { | 103 | { |
108 | // unsigned int v; // count the number of bits set in v | ||
109 | unsigned int c; // c accumulates the total bits set in v | 104 | unsigned int c; // c accumulates the total bits set in v |
110 | 105 | ||
111 | for (c = 0; v; v >>= 1) | 106 | for (c = 0; v; v >>= 1) |
@@ -257,8 +252,6 @@ static inline unsigned int page_list_index(struct page *page) | |||
257 | { | 252 | { |
258 | unsigned int idx; | 253 | unsigned int idx; |
259 | idx = (page_color(page) + page_bank(page)*(number_cachecolors)); | 254 | idx = (page_color(page) + page_bank(page)*(number_cachecolors)); |
260 | // printk("address = %lx, ", page_to_phys(page)); | ||
261 | // printk("color(%d), bank(%d), indx = %d\n", page_color(page), page_bank(page), idx); | ||
262 | 255 | ||
263 | return idx; | 256 | return idx; |
264 | } | 257 | } |
@@ -289,10 +282,10 @@ static void show_nr_pages(void) | |||
289 | printk("show nr pages***************************************\n"); | 282 | printk("show nr pages***************************************\n"); |
290 | for (i = 0; i < NUM_PAGE_LIST; ++i) { | 283 | for (i = 0; i < NUM_PAGE_LIST; ++i) { |
291 | cgroup = &color_groups[i]; | 284 | cgroup = &color_groups[i]; |
292 | printk("(%03d) = %03d, ", i, atomic_read(&cgroup->nr_pages)); | 285 | printk("(%03ld) = %03d, ", i, atomic_read(&cgroup->nr_pages)); |
293 | if((i % 8) ==7){ | 286 | if((i % 8) ==7) { |
294 | printk("\n"); | 287 | printk("\n"); |
295 | } | 288 | } |
296 | } | 289 | } |
297 | } | 290 | } |
298 | 291 | ||
@@ -316,6 +309,7 @@ void add_page_to_color_list(struct page *page) | |||
316 | * Replenish the page pool. | 309 | * Replenish the page pool. |
317 | * If the newly allocate page is what we want, it will be pushed to the correct page list | 310 | * If the newly allocate page is what we want, it will be pushed to the correct page list |
318 | * otherwise, it will be freed. | 311 | * otherwise, it will be freed. |
312 | * A user needs to invoke this function until the page pool has enough pages. | ||
319 | */ | 313 | */ |
320 | static int do_add_pages(void) | 314 | static int do_add_pages(void) |
321 | { | 315 | { |
@@ -329,8 +323,6 @@ static int do_add_pages(void) | |||
329 | 323 | ||
330 | // until all the page lists contain enough pages | 324 | // until all the page lists contain enough pages |
331 | for (i=0; i< 1024*20;i++) { | 325 | for (i=0; i< 1024*20;i++) { |
332 | //while (smallest_nr_pages() < PAGES_PER_COLOR) { | ||
333 | // printk("smallest = %d\n", smallest_nr_pages()); | ||
334 | page = alloc_page(GFP_HIGHUSER_MOVABLE); | 326 | page = alloc_page(GFP_HIGHUSER_MOVABLE); |
335 | 327 | ||
336 | if (unlikely(!page)) { | 328 | if (unlikely(!page)) { |
@@ -340,55 +332,20 @@ static int do_add_pages(void) | |||
340 | } | 332 | } |
341 | color = page_list_index(page); | 333 | color = page_list_index(page); |
342 | counter[color]++; | 334 | counter[color]++; |
343 | // printk("page(%d) = color %x, bank %x, [color] =%d \n", color, page_color(page), page_bank(page), atomic_read(&color_groups[color].nr_pages)); | 335 | if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR && color>=0) { |
344 | //show_nr_pages(); | ||
345 | //if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR && color>=16) { | ||
346 | if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR) { | ||
347 | //if ( PAGES_PER_COLOR && color>=16*2) { | ||
348 | add_page_to_color_list(page); | 336 | add_page_to_color_list(page); |
349 | // printk("add page(%d) = color %x, bank %x\n", color, page_color(page), page_bank(page)); | 337 | } else { |
350 | } else{ | ||
351 | // Pages here will be freed later | 338 | // Pages here will be freed later |
352 | list_add_tail(&page->lru, &free_later); | 339 | list_add_tail(&page->lru, &free_later); |
353 | free_counter++; | 340 | free_counter++; |
354 | //list_del(&page->lru); | ||
355 | // __free_page(page); | ||
356 | // printk("useless page(%d) = color %x, bank %x\n", color, page_color(page), page_bank(page)); | ||
357 | } | 341 | } |
358 | //show_nr_pages(); | 342 | } |
359 | /* | ||
360 | if(free_counter >= PAGES_PER_COLOR) | ||
361 | { | ||
362 | printk("free unwanted page list eariler"); | ||
363 | free_counter = 0; | ||
364 | list_for_each_entry_safe(page, page_tmp, &free_later, lru) { | ||
365 | list_del(&page->lru); | ||
366 | __free_page(page); | ||
367 | } | ||
368 | |||
369 | show_nr_pages(); | ||
370 | } | ||
371 | */ | ||
372 | } | ||
373 | /* printk("page counter = \n"); | ||
374 | for (i=0; i<128; i++) | ||
375 | { | ||
376 | printk("(%03d) = %4d, ", i , counter[i]); | ||
377 | if(i%8 == 7){ | ||
378 | printk("\n"); | ||
379 | } | ||
380 | 343 | ||
381 | } | ||
382 | */ | ||
383 | //printk("After refill : \n"); | ||
384 | //show_nr_pages(); | ||
385 | #if 1 | ||
386 | // Free the unwanted pages | 344 | // Free the unwanted pages |
387 | list_for_each_entry_safe(page, page_tmp, &free_later, lru) { | 345 | list_for_each_entry_safe(page, page_tmp, &free_later, lru) { |
388 | list_del(&page->lru); | 346 | list_del(&page->lru); |
389 | __free_page(page); | 347 | __free_page(page); |
390 | } | 348 | } |
391 | #endif | ||
392 | out: | 349 | out: |
393 | return ret; | 350 | return ret; |
394 | } | 351 | } |
@@ -407,7 +364,6 @@ static struct page *new_alloc_page_color( unsigned long color) | |||
407 | 364 | ||
408 | if( (color <0) || (color)>(number_cachecolors*number_banks -1)) { | 365 | if( (color <0) || (color)>(number_cachecolors*number_banks -1)) { |
409 | TRACE_CUR("Wrong color %lu\n", color); | 366 | TRACE_CUR("Wrong color %lu\n", color); |
410 | // printk(KERN_WARNING "Wrong color %lu\n", color); | ||
411 | goto out; | 367 | goto out; |
412 | } | 368 | } |
413 | 369 | ||
@@ -416,7 +372,6 @@ static struct page *new_alloc_page_color( unsigned long color) | |||
416 | spin_lock(&cgroup->lock); | 372 | spin_lock(&cgroup->lock); |
417 | if (unlikely(!atomic_read(&cgroup->nr_pages))) { | 373 | if (unlikely(!atomic_read(&cgroup->nr_pages))) { |
418 | TRACE_CUR("No free %lu colored pages.\n", color); | 374 | TRACE_CUR("No free %lu colored pages.\n", color); |
419 | // printk(KERN_WARNING "no free %lu colored pages.\n", color); | ||
420 | goto out_unlock; | 375 | goto out_unlock; |
421 | } | 376 | } |
422 | rPage = list_first_entry(&cgroup->list, struct page, lru); | 377 | rPage = list_first_entry(&cgroup->list, struct page, lru); |
@@ -428,12 +383,6 @@ static struct page *new_alloc_page_color( unsigned long color) | |||
428 | out_unlock: | 383 | out_unlock: |
429 | spin_unlock(&cgroup->lock); | 384 | spin_unlock(&cgroup->lock); |
430 | out: | 385 | out: |
431 | /* | ||
432 | if( smallest_nr_pages() == 0) { | ||
433 | //do_add_pages(); | ||
434 | //printk(KERN_ALERT "ERROR(bank_proc.c) = We don't have enough pages in bank_proc.c\n"); | ||
435 | } | ||
436 | */ | ||
437 | return rPage; | 386 | return rPage; |
438 | } | 387 | } |
439 | 388 | ||
@@ -456,9 +405,7 @@ struct page* get_colored_page(unsigned long color) | |||
456 | */ | 405 | */ |
457 | struct page *new_alloc_page(struct page *page, unsigned long node, int **x) | 406 | struct page *new_alloc_page(struct page *page, unsigned long node, int **x) |
458 | { | 407 | { |
459 | struct color_group *cgroup; | ||
460 | struct page *rPage = NULL; | 408 | struct page *rPage = NULL; |
461 | unsigned int color; | ||
462 | int try = 0; | 409 | int try = 0; |
463 | unsigned int idx; | 410 | unsigned int idx; |
464 | 411 | ||
@@ -479,7 +426,7 @@ struct page *new_alloc_page(struct page *page, unsigned long node, int **x) | |||
479 | if (try>=256) | 426 | if (try>=256) |
480 | break; | 427 | break; |
481 | idx = get_next_index(node, idx); | 428 | idx = get_next_index(node, idx); |
482 | printk(KERN_ALERT "try = %d out of page! requesting node = %d, idx = %d\n", try, node, idx); | 429 | printk(KERN_ALERT "try = %d out of page! requesting node = %ld, idx = %d\n", try, node, idx); |
483 | BUG_ON(idx<0 || idx>127); | 430 | BUG_ON(idx<0 || idx>127); |
484 | rPage = new_alloc_page_color(idx); | 431 | rPage = new_alloc_page_color(idx); |
485 | } | 432 | } |
@@ -494,20 +441,19 @@ struct page *new_alloc_page(struct page *page, unsigned long node, int **x) | |||
494 | void reclaim_page(struct page *page) | 441 | void reclaim_page(struct page *page) |
495 | { | 442 | { |
496 | const unsigned long color = page_list_index(page); | 443 | const unsigned long color = page_list_index(page); |
497 | unsigned long nr_reclaimed = 0; | ||
498 | spin_lock(&reclaim_lock); | 444 | spin_lock(&reclaim_lock); |
499 | put_page(page); | 445 | put_page(page); |
500 | add_page_to_color_list(page); | 446 | add_page_to_color_list(page); |
501 | 447 | ||
502 | spin_unlock(&reclaim_lock); | 448 | spin_unlock(&reclaim_lock); |
503 | printk("Reclaimed page(%d) = color %x, bank %x, [color] =%d \n", color, page_color(page), page_bank(page), atomic_read(&color_groups[color].nr_pages)); | 449 | printk("Reclaimed page(%ld) = color %x, bank %x, [color] =%d \n", color, page_color(page), page_bank(page), atomic_read(&color_groups[color].nr_pages)); |
504 | } | 450 | } |
505 | 451 | ||
506 | 452 | ||
507 | /* | 453 | /* |
508 | * Initialize the numbers of banks and cache colors | 454 | * Initialize the numbers of banks and cache colors |
509 | */ | 455 | */ |
510 | static int __init init_variables(void) | 456 | static void __init init_variables(void) |
511 | { | 457 | { |
512 | number_banks = counting_one_set(BANK_MASK); | 458 | number_banks = counting_one_set(BANK_MASK); |
513 | number_banks = two_exp(number_banks); | 459 | number_banks = two_exp(number_banks); |
@@ -592,7 +538,7 @@ out: | |||
592 | int show_page_pool_handler(struct ctl_table *table, int write, void __user *buffer, | 538 | int show_page_pool_handler(struct ctl_table *table, int write, void __user *buffer, |
593 | size_t *lenp, loff_t *ppos) | 539 | size_t *lenp, loff_t *ppos) |
594 | { | 540 | { |
595 | int ret = 0, i = 0; | 541 | int ret = 0; |
596 | mutex_lock(&void_lockdown_proc); | 542 | mutex_lock(&void_lockdown_proc); |
597 | ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); | 543 | ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); |
598 | if (ret) | 544 | if (ret) |
@@ -608,7 +554,7 @@ out: | |||
608 | int refill_page_pool_handler(struct ctl_table *table, int write, void __user *buffer, | 554 | int refill_page_pool_handler(struct ctl_table *table, int write, void __user *buffer, |
609 | size_t *lenp, loff_t *ppos) | 555 | size_t *lenp, loff_t *ppos) |
610 | { | 556 | { |
611 | int ret = 0, i = 0; | 557 | int ret = 0; |
612 | mutex_lock(&void_lockdown_proc); | 558 | mutex_lock(&void_lockdown_proc); |
613 | ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); | 559 | ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); |
614 | if (ret) | 560 | if (ret) |
diff --git a/litmus/jobs.c b/litmus/jobs.c index 59c29d517074..368e0b308f3f 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c | |||
@@ -21,6 +21,7 @@ static inline void setup_release(struct task_struct *t, lt_t release) | |||
21 | /* update job sequence number */ | 21 | /* update job sequence number */ |
22 | t->rt_param.job_params.job_no++; | 22 | t->rt_param.job_params.job_no++; |
23 | } | 23 | } |
24 | |||
24 | #define INIT_PHASE_LENGTH_NS (1000000000) | 25 | #define INIT_PHASE_LENGTH_NS (1000000000) |
25 | 26 | ||
26 | void prepare_for_next_period(struct task_struct *t) | 27 | void prepare_for_next_period(struct task_struct *t) |
@@ -34,6 +35,8 @@ void prepare_for_next_period(struct task_struct *t) | |||
34 | (long long)litmus_clock() - | 35 | (long long)litmus_clock() - |
35 | (long long)t->rt_param.job_params.deadline; | 36 | (long long)t->rt_param.job_params.deadline; |
36 | 37 | ||
38 | /* Mode 0 is used for initializations * | ||
39 | * Use sporadic releases for all tasks not to overutilize cpus in mode 0 */ | ||
37 | if (tsk_rt(t)->sporadic_release) { | 40 | if (tsk_rt(t)->sporadic_release) { |
38 | TRACE_TASK(t, "sporadic release at %llu\n", | 41 | TRACE_TASK(t, "sporadic release at %llu\n", |
39 | tsk_rt(t)->sporadic_release_time + INIT_PHASE_LENGTH_NS*(tsk_rt(t)->job_params.job_no)); | 42 | tsk_rt(t)->sporadic_release_time + INIT_PHASE_LENGTH_NS*(tsk_rt(t)->job_params.job_no)); |
diff --git a/litmus/litmus.c b/litmus/litmus.c index 90e21eeadabb..400fd1472705 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c | |||
@@ -37,9 +37,6 @@ | |||
37 | #include <trace/events/litmus.h> | 37 | #include <trace/events/litmus.h> |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | //#define TRACE(fmt, args...) do {} while (false) | ||
41 | //#define TRACE_TASK(fmt, args...) do {} while (false) | ||
42 | |||
43 | extern void l2c310_flush_all(void); | 40 | extern void l2c310_flush_all(void); |
44 | 41 | ||
45 | /* Number of RT tasks that exist in the system */ | 42 | /* Number of RT tasks that exist in the system */ |
@@ -354,12 +351,24 @@ extern int isolate_lru_page(struct page *page); | |||
354 | extern void putback_movable_page(struct page *page); | 351 | extern void putback_movable_page(struct page *page); |
355 | extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); | 352 | extern struct page *new_alloc_page(struct page *page, unsigned long node, int **x); |
356 | 353 | ||
354 | /* | ||
355 | * sys_set_page_color | ||
356 | * @cpu: CPU number to assign page colors. | ||
357 | * Syscall for recoloring pages | ||
358 | * Returns -1 on error. | ||
359 | * N on success. N is the number of pages that could not | ||
360 | * be moved. A return of zero means that all pages | ||
361 | * were successfully moved. Currently, two pages | ||
362 | * cannot be moved, signal handler and litmus ctrl | ||
363 | * pages. | ||
364 | * Only mc2 tasks may be configured with this system call. | ||
365 | * Use static linking to isolate all pages. | ||
366 | */ | ||
357 | asmlinkage long sys_set_page_color(int cpu) | 367 | asmlinkage long sys_set_page_color(int cpu) |
358 | { | 368 | { |
359 | long ret = 0; | 369 | long ret = 0; |
360 | //struct page *page_itr = NULL; | ||
361 | struct vm_area_struct *vma_itr = NULL; | 370 | struct vm_area_struct *vma_itr = NULL; |
362 | int nr_pages = 0, nr_shared_pages = 0, nr_failed = 0, nr_not_migrated = 0; | 371 | int nr_pages = 0, nr_failed = 0, nr_not_migrated = 0; |
363 | unsigned long node; | 372 | unsigned long node; |
364 | enum crit_level lv; | 373 | enum crit_level lv; |
365 | struct mm_struct *mm; | 374 | struct mm_struct *mm; |
@@ -375,19 +384,13 @@ asmlinkage long sys_set_page_color(int cpu) | |||
375 | mm = get_task_mm(current); | 384 | mm = get_task_mm(current); |
376 | put_task_struct(current); | 385 | put_task_struct(current); |
377 | 386 | ||
378 | //down_read(¤t->mm->mmap_sem); | ||
379 | down_read(&mm->mmap_sem); | 387 | down_read(&mm->mmap_sem); |
380 | //TRACE_TASK(current, "SYSCALL set_page_color\n"); | ||
381 | vma_itr = mm->mmap; | 388 | vma_itr = mm->mmap; |
382 | while (vma_itr != NULL) { | 389 | while (vma_itr != NULL) { |
383 | unsigned int num_pages = 0, i; | 390 | unsigned int num_pages = 0, i; |
384 | struct page *old_page = NULL; | 391 | struct page *old_page = NULL; |
385 | 392 | ||
386 | num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; | 393 | num_pages = (vma_itr->vm_end - vma_itr->vm_start) / PAGE_SIZE; |
387 | // print vma flags | ||
388 | //printk(KERN_INFO "flags: 0x%lx\n", vma_itr->vm_flags); | ||
389 | //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); | ||
390 | //printk(KERN_INFO "vm_page_prot: 0x%lx\n", vma_itr->vm_page_prot); | ||
391 | for (i = 0; i < num_pages; i++) { | 394 | for (i = 0; i < num_pages; i++) { |
392 | old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); | 395 | old_page = follow_page(vma_itr, vma_itr->vm_start + PAGE_SIZE*i, FOLL_GET|FOLL_SPLIT); |
393 | 396 | ||
@@ -401,30 +404,15 @@ asmlinkage long sys_set_page_color(int cpu) | |||
401 | put_page(old_page); | 404 | put_page(old_page); |
402 | continue; | 405 | continue; |
403 | } | 406 | } |
404 | 407 | ret = isolate_lru_page(old_page); | |
405 | //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)); | 408 | if (!ret) { |
406 | 409 | list_add_tail(&old_page->lru, &pagelist); | |
407 | //if (page_mapcount(old_page) == 1) { | 410 | inc_zone_page_state(old_page, NR_ISOLATED_ANON + !PageSwapBacked(old_page)); |
408 | ret = isolate_lru_page(old_page); | 411 | nr_pages++; |
409 | if (!ret) { | 412 | } else { |
410 | list_add_tail(&old_page->lru, &pagelist); | 413 | nr_failed++; |
411 | inc_zone_page_state(old_page, NR_ISOLATED_ANON + !PageSwapBacked(old_page)); | ||
412 | nr_pages++; | ||
413 | } else { | ||
414 | //TRACE_TASK(current, "isolate_lru_page failed\n"); | ||
415 | //TRACE_TASK(current, "page_lru = %d PageLRU = %d\n", page_lru(old_page), PageLRU(old_page)); | ||
416 | nr_failed++; | ||
417 | } | ||
418 | //printk(KERN_INFO "PRIVATE _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); | ||
419 | put_page(old_page); | ||
420 | //} | ||
421 | /* | ||
422 | else { | ||
423 | nr_shared_pages++; | ||
424 | //printk(KERN_INFO "SHARED _mapcount = %d, _count = %d\n", page_mapcount(old_page), page_count(old_page)); | ||
425 | put_page(old_page); | ||
426 | } | 414 | } |
427 | */ | 415 | put_page(old_page); |
428 | } | 416 | } |
429 | 417 | ||
430 | vma_itr = vma_itr->vm_next; | 418 | vma_itr = vma_itr->vm_next; |
@@ -434,7 +422,7 @@ asmlinkage long sys_set_page_color(int cpu) | |||
434 | if (tsk_rt(current)->mc2_data) | 422 | if (tsk_rt(current)->mc2_data) |
435 | lv = tsk_rt(current)->mc2_data->crit; | 423 | lv = tsk_rt(current)->mc2_data->crit; |
436 | else | 424 | else |
437 | BUG();//lv = 0; | 425 | BUG(); //lv = 0; |
438 | 426 | ||
439 | if (cpu == -1) | 427 | if (cpu == -1) |
440 | node = 8; | 428 | node = 8; |
@@ -444,34 +432,16 @@ asmlinkage long sys_set_page_color(int cpu) | |||
444 | if (!list_empty(&pagelist)) { | 432 | if (!list_empty(&pagelist)) { |
445 | ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL); | 433 | ret = migrate_pages(&pagelist, new_alloc_page, NULL, node, MIGRATE_SYNC, MR_SYSCALL); |
446 | TRACE_TASK(current, "%ld pages not migrated.\n", ret); | 434 | TRACE_TASK(current, "%ld pages not migrated.\n", ret); |
447 | printk(KERN_INFO "%ld pages not migrated.\n", ret); | ||
448 | nr_not_migrated = ret; | 435 | nr_not_migrated = ret; |
449 | if (ret) { | 436 | if (ret) { |
450 | putback_movable_pages(&pagelist); | 437 | putback_movable_pages(&pagelist); |
451 | } | 438 | } |
452 | } | 439 | } |
453 | 440 | ||
454 | /* handle sigpage and litmus ctrl_page */ | ||
455 | /* vma_itr = current->mm->mmap; | ||
456 | while (vma_itr != NULL) { | ||
457 | if (vma_itr->vm_start == tsk_rt(current)->addr_ctrl_page) { | ||
458 | TRACE("litmus ctrl_page = %08x\n", vma_itr->vm_start); | ||
459 | vma_itr->vm_page_prot = PAGE_SHARED; | ||
460 | break; | ||
461 | } | ||
462 | vma_itr = vma_itr->vm_next; | ||
463 | } | ||
464 | */ | ||
465 | up_read(&mm->mmap_sem); | 441 | up_read(&mm->mmap_sem); |
466 | 442 | ||
467 | /* | 443 | TRACE_TASK(current, "node = %ld, nr_migrated_pages = %d, nr_pages = %d nr_failed = %d\n", node, nr_pages-nr_not_migrated, nr_pages, nr_failed); |
468 | list_for_each_entry(page_itr, &shared_pagelist, lru) { | 444 | |
469 | 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)); | ||
470 | } | ||
471 | */ | ||
472 | TRACE_TASK(current, "nr_pages = %d nr_failed = %d\n", nr_pages, nr_failed); | ||
473 | printk(KERN_INFO "node = %ld, nr_migrated_pages = %d, nr_shared_pages = %d, nr_failed = %d\n", node, nr_pages-nr_not_migrated, nr_failed-2, nr_failed); | ||
474 | //printk(KERN_INFO "node = %d\n", cpu_to_node(smp_processor_id())); | ||
475 | return ret; | 445 | return ret; |
476 | } | 446 | } |
477 | 447 | ||
@@ -479,12 +449,12 @@ asmlinkage long sys_set_page_color(int cpu) | |||
479 | asmlinkage long sys_test_call(unsigned int param) | 449 | asmlinkage long sys_test_call(unsigned int param) |
480 | { | 450 | { |
481 | long ret = 0; | 451 | long ret = 0; |
482 | unsigned long flags; | ||
483 | struct vm_area_struct *vma_itr = NULL; | 452 | struct vm_area_struct *vma_itr = NULL; |
484 | 453 | ||
485 | TRACE_CUR("test_call param = %d\n", param); | 454 | TRACE_CUR("test_call param = %d\n", param); |
486 | 455 | ||
487 | if (param == 0) { | 456 | if (param == 0) { |
457 | /* Print page information */ | ||
488 | down_read(¤t->mm->mmap_sem); | 458 | down_read(¤t->mm->mmap_sem); |
489 | vma_itr = current->mm->mmap; | 459 | vma_itr = current->mm->mmap; |
490 | while (vma_itr != NULL) { | 460 | while (vma_itr != NULL) { |
@@ -494,37 +464,12 @@ asmlinkage long sys_test_call(unsigned int param) | |||
494 | printk(KERN_INFO "vm_flags : %lx\n", vma_itr->vm_flags); | 464 | printk(KERN_INFO "vm_flags : %lx\n", vma_itr->vm_flags); |
495 | printk(KERN_INFO "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot)); | 465 | printk(KERN_INFO "vm_prot : %x\n", pgprot_val(vma_itr->vm_page_prot)); |
496 | printk(KERN_INFO "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED); | 466 | printk(KERN_INFO "VM_SHARED? %ld\n", vma_itr->vm_flags & VM_SHARED); |
497 | /* if (vma_itr->vm_file) { | ||
498 | struct file *fp = vma_itr->vm_file; | ||
499 | unsigned long fcount = atomic_long_read(&(fp->f_count)); | ||
500 | printk(KERN_INFO "f_count : %ld\n", fcount); | ||
501 | if (fcount > 1) { | ||
502 | vma_itr->vm_page_prot = pgprot_noncached(vma_itr->vm_page_prot); | ||
503 | } | ||
504 | } | ||
505 | printk(KERN_INFO "vm_prot2 : %x\n", pgprot_val(vma_itr->vm_page_prot)); | ||
506 | */ | ||
507 | vma_itr = vma_itr->vm_next; | 467 | vma_itr = vma_itr->vm_next; |
508 | } | 468 | } |
509 | printk(KERN_INFO "--------------------------------------------\n"); | 469 | printk(KERN_INFO "--------------------------------------------\n"); |
510 | up_read(¤t->mm->mmap_sem); | 470 | up_read(¤t->mm->mmap_sem); |
511 | |||
512 | local_irq_save(flags); | ||
513 | l2c310_flush_all(); | ||
514 | local_irq_restore(flags); | ||
515 | } | ||
516 | else if (param == 1) { | ||
517 | int i; | ||
518 | for (i = 0; i < 4; i++) { | ||
519 | lock_cache(i, 0x00003fff); | ||
520 | } | ||
521 | } | ||
522 | else if (param == 2) { | ||
523 | int i; | ||
524 | for (i = 0; i < 4; i++) { | ||
525 | lock_cache(i, 0xffffffff); | ||
526 | } | ||
527 | } | 471 | } |
472 | |||
528 | return ret; | 473 | return ret; |
529 | } | 474 | } |
530 | 475 | ||
diff --git a/litmus/sched_mc2.c b/litmus/sched_mc2.c index 7f6fefff0a3b..d7cf3fb83296 100644 --- a/litmus/sched_mc2.c +++ b/litmus/sched_mc2.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Implementation of the Mixed-Criticality on MultiCore scheduler | 4 | * Implementation of the Mixed-Criticality on MultiCore scheduler |
5 | * | 5 | * |
6 | * Thus plugin implements a scheduling algorithm proposed in | 6 | * This plugin implements a scheduling algorithm proposed in |
7 | * "Mixed-Criticality Real-Time Scheduling for Multicore System" paper. | 7 | * "Mixed-Criticality Real-Time Scheduling for Multicore System" paper. |
8 | */ | 8 | */ |
9 | 9 | ||
@@ -29,19 +29,12 @@ | |||
29 | #include <litmus/reservation.h> | 29 | #include <litmus/reservation.h> |
30 | #include <litmus/polling_reservations.h> | 30 | #include <litmus/polling_reservations.h> |
31 | 31 | ||
32 | #ifdef CONFIG_PGMRT_SUPPORT | ||
33 | #include <litmus/pgm.h> | ||
34 | #endif | ||
35 | |||
36 | //#define TRACE(fmt, args...) do {} while (false) | ||
37 | //#define TRACE_TASK(fmt, args...) do {} while (false) | ||
38 | |||
39 | #define BUDGET_ENFORCEMENT_AT_C 0 | 32 | #define BUDGET_ENFORCEMENT_AT_C 0 |
40 | 33 | ||
41 | extern atomic_t num_sync_released; | 34 | extern atomic_t num_sync_released; |
42 | extern void do_partition(enum crit_level lv, int cpu); | 35 | extern void do_partition(enum crit_level lv, int cpu); |
43 | 36 | ||
44 | /* _global_env - reservation container for level-C tasks*/ | 37 | /* _global_env - reservation container for level-C tasks */ |
45 | struct gmp_reservation_environment _global_env_modes[NR_MODES]; | 38 | struct gmp_reservation_environment _global_env_modes[NR_MODES]; |
46 | struct gmp_reservation_environment *_global_env; | 39 | struct gmp_reservation_environment *_global_env; |
47 | raw_spinlock_t global_lock; | 40 | raw_spinlock_t global_lock; |
@@ -55,7 +48,7 @@ struct cpu_entry { | |||
55 | int cpu; | 48 | int cpu; |
56 | enum crit_level lv; | 49 | enum crit_level lv; |
57 | /* if will_schedule is true, this cpu is already selected and | 50 | /* if will_schedule is true, this cpu is already selected and |
58 | call mc2_schedule() soon. */ | 51 | mc2_schedule() will be executed soon. */ |
59 | bool will_schedule; | 52 | bool will_schedule; |
60 | }; | 53 | }; |
61 | 54 | ||
@@ -69,6 +62,7 @@ struct cpu_priority _lowest_prio_cpu; | |||
69 | 62 | ||
70 | /* mc2_task_state - a task state structure */ | 63 | /* mc2_task_state - a task state structure */ |
71 | struct mc2_task_state { | 64 | struct mc2_task_state { |
65 | /* A task can be shared by multiple modes */ | ||
72 | struct task_client res_info[NR_MODES]; | 66 | struct task_client res_info[NR_MODES]; |
73 | /* if cpu == -1, this task is a global task (level C) */ | 67 | /* if cpu == -1, this task is a global task (level C) */ |
74 | int cpu; | 68 | int cpu; |
@@ -78,7 +72,6 @@ struct mc2_task_state { | |||
78 | 72 | ||
79 | /* mc2_cpu_state - maintain the scheduled state and ghost jobs | 73 | /* mc2_cpu_state - maintain the scheduled state and ghost jobs |
80 | * timer : timer for partitioned tasks (level A and B) | 74 | * timer : timer for partitioned tasks (level A and B) |
81 | * g_timer : timer for global tasks (level C) | ||
82 | */ | 75 | */ |
83 | struct mc2_cpu_state { | 76 | struct mc2_cpu_state { |
84 | raw_spinlock_t lock; | 77 | raw_spinlock_t lock; |
@@ -89,21 +82,16 @@ struct mc2_cpu_state { | |||
89 | 82 | ||
90 | int cpu; | 83 | int cpu; |
91 | struct task_struct* scheduled; | 84 | struct task_struct* scheduled; |
92 | //struct crit_entry crit_entries[NUM_CRIT_LEVELS]; | ||
93 | //bool spin_flag; //not used on cpu 0 | ||
94 | }; | 85 | }; |
95 | 86 | ||
96 | static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state); | 87 | static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state); |
97 | 88 | ||
98 | static int resched_cpu[NR_CPUS]; | 89 | static int resched_cpu[NR_CPUS]; |
99 | static DEFINE_PER_CPU(struct mc2_cpu_state, mc2_cpu_state); | 90 | static DEFINE_PER_CPU(struct mc2_cpu_state, mc2_cpu_state); |
100 | //level_a_priorities unused | ||
101 | //static int level_a_priorities[NR_CPUS]; | ||
102 | 91 | ||
103 | #define cpu_state_for(cpu_id) (&per_cpu(mc2_cpu_state, cpu_id)) | 92 | #define cpu_state_for(cpu_id) (&per_cpu(mc2_cpu_state, cpu_id)) |
104 | #define local_cpu_state() (this_cpu_ptr(&mc2_cpu_state)) | 93 | #define local_cpu_state() (this_cpu_ptr(&mc2_cpu_state)) |
105 | 94 | ||
106 | |||
107 | unsigned int mode; //currently executing mode, from 0 to NR_MODES-1 | 95 | unsigned int mode; //currently executing mode, from 0 to NR_MODES-1 |
108 | unsigned int requested_mode; //The pending mode | 96 | unsigned int requested_mode; //The pending mode |
109 | /* Prevent multiple requests from entering and prevent request from entering while old | 97 | /* Prevent multiple requests from entering and prevent request from entering while old |
@@ -118,6 +106,8 @@ bool cpu_0_task_exist; | |||
118 | bool mode_changed; | 106 | bool mode_changed; |
119 | bool mode_poll_exited; | 107 | bool mode_poll_exited; |
120 | static DEFINE_PER_CPU(unsigned long, mode_counter); | 108 | static DEFINE_PER_CPU(unsigned long, mode_counter); |
109 | |||
110 | /* Mode change macros */ | ||
121 | #define local_mode_counter() (this_cpu_ptr(&mode_counter)) | 111 | #define local_mode_counter() (this_cpu_ptr(&mode_counter)) |
122 | #define cpu_0_mode_counter() (&per_cpu(mode_counter, 0)) | 112 | #define cpu_0_mode_counter() (&per_cpu(mode_counter, 0)) |
123 | #define in_mode(t, modenum) (tsk_mc2_data(t)->mode_mask & (1 << modenum)) | 113 | #define in_mode(t, modenum) (tsk_mc2_data(t)->mode_mask & (1 << modenum)) |
@@ -135,7 +125,6 @@ asmlinkage long sys_enact_mode(void) | |||
135 | struct reservation *res; | 125 | struct reservation *res; |
136 | struct list_head *pos; | 126 | struct list_head *pos; |
137 | unsigned long flags; | 127 | unsigned long flags; |
138 | TRACE_TASK(current, "ENACTING SYSCALL\n"); | ||
139 | if (state->cpu == 0 && !mode_poll_exited){ | 128 | if (state->cpu == 0 && !mode_poll_exited){ |
140 | unsigned long *other_cpu_counter; | 129 | unsigned long *other_cpu_counter; |
141 | unsigned long cpu0_val = this_cpu_read(mode_counter); | 130 | unsigned long cpu0_val = this_cpu_read(mode_counter); |
@@ -149,7 +138,6 @@ asmlinkage long sys_enact_mode(void) | |||
149 | mode_changed = false; | 138 | mode_changed = false; |
150 | if (pending){ //MCR has entered | 139 | if (pending){ //MCR has entered |
151 | raw_spin_lock_irqsave(&state->lock, flags); | 140 | raw_spin_lock_irqsave(&state->lock, flags); |
152 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
153 | raw_spin_lock(&global_lock); | 141 | raw_spin_lock(&global_lock); |
154 | raw_spin_lock(&mode_lock); | 142 | raw_spin_lock(&mode_lock); |
155 | 143 | ||
@@ -208,13 +196,11 @@ asmlinkage long sys_enact_mode(void) | |||
208 | } | 196 | } |
209 | if( ready ){ //C is throttled | 197 | if( ready ){ //C is throttled |
210 | lt_t new_mode_basetime = get_release(current); | 198 | lt_t new_mode_basetime = get_release(current); |
211 | //TRACE("Timer canceled\n"); | ||
212 | //hrtimer_cancel(&state->timer);//stop listening to old mode timers | ||
213 | mode = requested_mode; | 199 | mode = requested_mode; |
214 | TRACE("Mode has been changed.\n"); | 200 | TRACE("Mode has been changed.\n"); |
215 | mode_changed = true; | 201 | mode_changed = true; |
216 | _global_env = &_global_env_modes[mode]; | 202 | _global_env = &_global_env_modes[mode]; |
217 | //set res->reported for new global tasks | 203 | /* set res->reported for new global tasks */ |
218 | list_for_each(pos, &_global_env->active_reservations){ | 204 | list_for_each(pos, &_global_env->active_reservations){ |
219 | res = list_entry(pos, struct reservation, list); | 205 | res = list_entry(pos, struct reservation, list); |
220 | release_at(res->tsk, new_mode_basetime); | 206 | release_at(res->tsk, new_mode_basetime); |
@@ -231,7 +217,6 @@ asmlinkage long sys_enact_mode(void) | |||
231 | res->reported = 0; | 217 | res->reported = 0; |
232 | } | 218 | } |
233 | gmp_update_time(_global_env, litmus_clock()); | 219 | gmp_update_time(_global_env, litmus_clock()); |
234 | //raw_spin_lock(&state->lock); | ||
235 | 220 | ||
236 | state->sup_env = &state->sup_env_modes[mode]; | 221 | state->sup_env = &state->sup_env_modes[mode]; |
237 | list_for_each(pos, &state->sup_env->active_reservations){ | 222 | list_for_each(pos, &state->sup_env->active_reservations){ |
@@ -247,57 +232,33 @@ asmlinkage long sys_enact_mode(void) | |||
247 | release_at(res->tsk, new_mode_basetime); | 232 | release_at(res->tsk, new_mode_basetime); |
248 | } | 233 | } |
249 | sup_update_time(state->sup_env, litmus_clock()); | 234 | sup_update_time(state->sup_env, litmus_clock()); |
250 | //raw_spin_unlock(&state->lock); | ||
251 | sched_trace_enact_mode(current); | 235 | sched_trace_enact_mode(current); |
252 | TRACE("ENACT\n"); | 236 | TRACE("ENACT\n"); |
253 | } | 237 | } |
254 | raw_spin_unlock(&mode_lock); | 238 | raw_spin_unlock(&mode_lock); |
255 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
256 | raw_spin_unlock(&global_lock); | 239 | raw_spin_unlock(&global_lock); |
257 | //raw_spin_unlock(&state->lock); | ||
258 | raw_spin_unlock_irqrestore(&state->lock, flags); | 240 | raw_spin_unlock_irqrestore(&state->lock, flags); |
259 | 241 | ||
260 | raw_spin_lock(&state->lock); | 242 | raw_spin_lock(&state->lock); |
261 | mc2_update_timer_and_unlock(state); | 243 | mc2_update_timer_and_unlock(state); |
262 | } | 244 | } |
263 | this_cpu_inc(mode_counter); | 245 | this_cpu_inc(mode_counter); |
264 | //local_irq_restore(flags); | ||
265 | //cpu_0_spin_flag = !cpu_0_spin_flag; | ||
266 | } | 246 | } |
267 | else if (!mode_poll_exited) { | 247 | else if (!mode_poll_exited) { |
268 | unsigned long *cpu0_counter = cpu_0_mode_counter(); | 248 | unsigned long *cpu0_counter = cpu_0_mode_counter(); |
269 | unsigned long my_val; | 249 | unsigned long my_val; |
270 | //int timeout = 0; | ||
271 | this_cpu_inc(mode_counter); | 250 | this_cpu_inc(mode_counter); |
272 | my_val = this_cpu_read(mode_counter); | 251 | my_val = this_cpu_read(mode_counter); |
273 | //spin, wait for CPU 0 to stabilize mode decision | 252 | //spin, wait for CPU 0 to stabilize mode decision |
274 | //before scheduling next hyperperiod | 253 | //before scheduling next hyperperiod |
275 | //TRACE("CPU%d start spinning. %d\n",state->cpu, mode_changed); | 254 | |
276 | /* | ||
277 | if (state->spin_flag) { | ||
278 | while(cpu_0_spin_flag) | ||
279 | udelay(1); | ||
280 | } | ||
281 | else { | ||
282 | while(!cpu_0_spin_flag) | ||
283 | udelay(1); | ||
284 | } | ||
285 | */ | ||
286 | //TRACE("CPU%d flag check. %d\n",state->cpu, mode_changed); | ||
287 | while (*cpu0_counter < my_val && !mode_poll_exited){ | 255 | while (*cpu0_counter < my_val && !mode_poll_exited){ |
288 | udelay(1); | 256 | udelay(1); |
289 | //if (timeout++ > 1000){ | ||
290 | // if (!cpu_0_task_exist){ | ||
291 | // break; | ||
292 | // } | ||
293 | // timeout = 0; | ||
294 | //} | ||
295 | } | 257 | } |
296 | TRACE("CPU%d counter check. %d\n",state->cpu, this_cpu_read(mode_counter)); | 258 | TRACE("CPU%d counter check. %d\n",state->cpu, this_cpu_read(mode_counter)); |
297 | //local_irq_save(flags); | ||
298 | if (mode_changed) { | 259 | if (mode_changed) { |
299 | lt_t new_mode_basetime = get_release(current); | 260 | lt_t new_mode_basetime = get_release(current); |
300 | //TRACE("CPU%d mode changed\n",state->cpu); | 261 | TRACE("CPU%d mode changed\n",state->cpu); |
301 | hrtimer_cancel(&state->timer); //stop listening to old mode timers | 262 | hrtimer_cancel(&state->timer); //stop listening to old mode timers |
302 | TRACE("Timer is cancelled at %llu. mode-change\n", litmus_clock()); | 263 | TRACE("Timer is cancelled at %llu. mode-change\n", litmus_clock()); |
303 | raw_spin_lock_irqsave(&state->lock, flags); | 264 | raw_spin_lock_irqsave(&state->lock, flags); |
@@ -319,24 +280,13 @@ asmlinkage long sys_enact_mode(void) | |||
319 | 280 | ||
320 | raw_spin_lock(&state->lock); | 281 | raw_spin_lock(&state->lock); |
321 | mc2_update_timer_and_unlock(state); | 282 | mc2_update_timer_and_unlock(state); |
322 | //local_irq_restore(flags); | ||
323 | 283 | ||
324 | } | 284 | } |
325 | //state->spin_flag = !state->spin_flag; | ||
326 | } | 285 | } |
327 | else { | 286 | else { |
328 | //TRACE("CPU%d no cpu_0_task_exist.%d\n",state->cpu, mode_changed); | 287 | TRACE("CPU%d exits sys_enact_mode(). No cpu_0_task_exist.%d\n",state->cpu, mode_changed); |
329 | return 0; | 288 | return 0; |
330 | } | 289 | } |
331 | TRACE("CPU%d enact syscall ends m_c? %d new_mode %d\n",state->cpu, mode_changed, mode); | ||
332 | //if mode didn't change this has no effect on what's being scheduled | ||
333 | //raw_spin_lock(&state->lock); | ||
334 | //state->sup_env = &state->sup_env_modes[mode]; | ||
335 | //raw_spin_unlock(&state->lock); | ||
336 | //sup_update_time(state->sup_env, litmus_clock()); | ||
337 | //raw_spin_lock(&state->lock); | ||
338 | //mc2_update_timer_and_unlock(state); | ||
339 | TRACE("is timer active? %d remaining %llu\n",hrtimer_active(&state->timer), hrtimer_get_remaining(&state->timer)); | ||
340 | 290 | ||
341 | return 0; | 291 | return 0; |
342 | } | 292 | } |
@@ -426,21 +376,6 @@ static enum crit_level get_task_crit_level(struct task_struct *tsk) | |||
426 | return mp->crit; | 376 | return mp->crit; |
427 | } | 377 | } |
428 | 378 | ||
429 | static int is_init_finished(struct task_struct *tsk) | ||
430 | { | ||
431 | struct mc2_task *mp; | ||
432 | |||
433 | if (!tsk || !is_realtime(tsk)) | ||
434 | return 0; | ||
435 | |||
436 | mp = tsk_rt(tsk)->mc2_data; | ||
437 | |||
438 | if (!mp) | ||
439 | return 0; | ||
440 | else | ||
441 | return mp->init_finished; | ||
442 | } | ||
443 | |||
444 | /* task_depart - remove a task from its reservation | 379 | /* task_depart - remove a task from its reservation |
445 | * If the job has remaining budget, convert it to a ghost job | 380 | * If the job has remaining budget, convert it to a ghost job |
446 | * and update crit_entries[] | 381 | * and update crit_entries[] |
@@ -450,7 +385,6 @@ static int is_init_finished(struct task_struct *tsk) | |||
450 | static void task_departs(struct task_struct *tsk, int job_complete) | 385 | static void task_departs(struct task_struct *tsk, int job_complete) |
451 | { | 386 | { |
452 | struct mc2_task_state* tinfo = get_mc2_state(tsk); | 387 | struct mc2_task_state* tinfo = get_mc2_state(tsk); |
453 | //struct mc2_cpu_state* state = local_cpu_state(); | ||
454 | struct reservation* res = NULL; | 388 | struct reservation* res = NULL; |
455 | struct reservation_client *client = NULL; | 389 | struct reservation_client *client = NULL; |
456 | int i; | 390 | int i; |
@@ -470,14 +404,6 @@ static void task_departs(struct task_struct *tsk, int job_complete) | |||
470 | res->ops->client_departs(res, client, job_complete); | 404 | res->ops->client_departs(res, client, job_complete); |
471 | } | 405 | } |
472 | 406 | ||
473 | /* 9/18/2015 fix start - no ghost job handling, empty remaining budget */ | ||
474 | /* | ||
475 | if (job_complete) { | ||
476 | //res->cur_budget = 0; | ||
477 | } | ||
478 | */ | ||
479 | /* fix end */ | ||
480 | |||
481 | tinfo->has_departed = true; | 407 | tinfo->has_departed = true; |
482 | TRACE_TASK(tsk, "CLIENT DEPART with budget %llu at %llu\n", res->cur_budget, litmus_clock()); | 408 | TRACE_TASK(tsk, "CLIENT DEPART with budget %llu at %llu\n", res->cur_budget, litmus_clock()); |
483 | } | 409 | } |
@@ -557,12 +483,7 @@ static int get_lowest_prio_cpu(lt_t priority) | |||
557 | ce = &_lowest_prio_cpu.cpu_entries[cpu]; | 483 | ce = &_lowest_prio_cpu.cpu_entries[cpu]; |
558 | /* If a CPU will call schedule() in the near future, we don't | 484 | /* If a CPU will call schedule() in the near future, we don't |
559 | return that CPU. */ | 485 | return that CPU. */ |
560 | /* | 486 | |
561 | TRACE("CPU %d will_schedule=%d, scheduled=(%s/%d:%d)\n", cpu, ce->will_schedule, | ||
562 | ce->scheduled ? (ce->scheduled)->comm : "null", | ||
563 | ce->scheduled ? (ce->scheduled)->pid : 0, | ||
564 | ce->scheduled ? (ce->scheduled)->rt_param.job_params.job_no : 0); | ||
565 | */ | ||
566 | if (!ce->will_schedule) { | 487 | if (!ce->will_schedule) { |
567 | if (!ce->scheduled) { | 488 | if (!ce->scheduled) { |
568 | /* Idle cpu, return this. */ | 489 | /* Idle cpu, return this. */ |
@@ -599,7 +520,6 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
599 | { | 520 | { |
600 | int local, cpus; | 521 | int local, cpus; |
601 | lt_t update, now; | 522 | lt_t update, now; |
602 | //enum crit_level lv = get_task_crit_level(state->scheduled); | ||
603 | struct next_timer_event *event, *next; | 523 | struct next_timer_event *event, *next; |
604 | int reschedule[NR_CPUS]; | 524 | int reschedule[NR_CPUS]; |
605 | unsigned long flags; | 525 | unsigned long flags; |
@@ -618,7 +538,6 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
618 | */ | 538 | */ |
619 | local = local_cpu_state() == state; | 539 | local = local_cpu_state() == state; |
620 | 540 | ||
621 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
622 | raw_spin_lock(&global_lock); | 541 | raw_spin_lock(&global_lock); |
623 | 542 | ||
624 | list_for_each_entry_safe(event, next, &_global_env->next_events, list) { | 543 | list_for_each_entry_safe(event, next, &_global_env->next_events, list) { |
@@ -632,18 +551,11 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
632 | if (event->timer_armed_on == NO_CPU) { | 551 | if (event->timer_armed_on == NO_CPU) { |
633 | struct reservation *res = gmp_find_by_id(_global_env, event->id); | 552 | struct reservation *res = gmp_find_by_id(_global_env, event->id); |
634 | int cpu = get_lowest_prio_cpu(res?res->priority:LITMUS_NO_PRIORITY); | 553 | int cpu = get_lowest_prio_cpu(res?res->priority:LITMUS_NO_PRIORITY); |
635 | //TRACE("GLOBAL EVENT PASSED!! poking CPU %d to reschedule\n", cpu); | ||
636 | list_del(&event->list); | 554 | list_del(&event->list); |
637 | kfree(event); | 555 | kfree(event); |
638 | if (cpu != NO_CPU) { | 556 | if (cpu != NO_CPU) { |
639 | //raw_spin_lock(&_lowest_prio_cpu.lock); | ||
640 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; | 557 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; |
641 | //raw_spin_unlock(&_lowest_prio_cpu.lock); | 558 | reschedule[cpu] = 1; |
642 | |||
643 | //if (cpu == local_cpu_state()->cpu) | ||
644 | // litmus_reschedule_local(); | ||
645 | //else | ||
646 | reschedule[cpu] = 1; | ||
647 | } | 559 | } |
648 | } | 560 | } |
649 | } else if (event->next_update < update && (event->timer_armed_on == NO_CPU || event->timer_armed_on == state->cpu)) { | 561 | } else if (event->next_update < update && (event->timer_armed_on == NO_CPU || event->timer_armed_on == state->cpu)) { |
@@ -655,7 +567,7 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
655 | 567 | ||
656 | /* Must drop state lock before calling into hrtimer_start(), which | 568 | /* Must drop state lock before calling into hrtimer_start(), which |
657 | * may raise a softirq, which in turn may wake ksoftirqd. */ | 569 | * may raise a softirq, which in turn may wake ksoftirqd. */ |
658 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | 570 | |
659 | raw_spin_unlock(&global_lock); | 571 | raw_spin_unlock(&global_lock); |
660 | local_irq_restore(flags); | 572 | local_irq_restore(flags); |
661 | raw_spin_unlock(&state->lock); | 573 | raw_spin_unlock(&state->lock); |
@@ -663,11 +575,6 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
663 | if ((update <= now) || reschedule[state->cpu]) { | 575 | if ((update <= now) || reschedule[state->cpu]) { |
664 | reschedule[state->cpu] = 0; | 576 | reschedule[state->cpu] = 0; |
665 | litmus_reschedule(state->cpu); | 577 | litmus_reschedule(state->cpu); |
666 | /* | ||
667 | raw_spin_lock(&state->lock); | ||
668 | preempt_if_preemptable(state->scheduled, state->cpu); | ||
669 | raw_spin_unlock(&state->lock); | ||
670 | */ | ||
671 | } else if (likely(local && update != SUP_NO_SCHEDULER_UPDATE)) { | 578 | } else if (likely(local && update != SUP_NO_SCHEDULER_UPDATE)) { |
672 | /* Reprogram only if not already set correctly. */ | 579 | /* Reprogram only if not already set correctly. */ |
673 | if (!hrtimer_active(&state->timer) || | 580 | if (!hrtimer_active(&state->timer) || |
@@ -708,22 +615,8 @@ static void mc2_update_timer_and_unlock(struct mc2_cpu_state *state) | |||
708 | state->cpu, | 615 | state->cpu, |
709 | hrtimer_active(&state->timer), | 616 | hrtimer_active(&state->timer), |
710 | ktime_to_ns(hrtimer_get_expires(&state->timer))); | 617 | ktime_to_ns(hrtimer_get_expires(&state->timer))); |
711 | //litmus_reschedule(state->cpu); | ||
712 | /* | ||
713 | raw_spin_lock(&state->lock); | ||
714 | preempt_if_preemptable(state->scheduled, state->cpu); | ||
715 | raw_spin_unlock(&state->lock); | ||
716 | reschedule[state->cpu] = 0; | ||
717 | */ | ||
718 | } | ||
719 | } | ||
720 | /* | ||
721 | for (cpus = 0; cpus<NR_CPUS; cpus++) { | ||
722 | if (reschedule[cpus]) { | ||
723 | litmus_reschedule(cpus); | ||
724 | } | 618 | } |
725 | } | 619 | } |
726 | */ | ||
727 | } | 620 | } |
728 | 621 | ||
729 | /* update_cpu_prio - Update cpu's priority | 622 | /* update_cpu_prio - Update cpu's priority |
@@ -762,7 +655,6 @@ static enum hrtimer_restart on_scheduling_timer(struct hrtimer *timer) | |||
762 | struct mc2_cpu_state *state; | 655 | struct mc2_cpu_state *state; |
763 | lt_t update, now; | 656 | lt_t update, now; |
764 | int global_schedule_now; | 657 | int global_schedule_now; |
765 | //lt_t remain_budget; // no ghost jobs | ||
766 | int reschedule[NR_CPUS]; | 658 | int reschedule[NR_CPUS]; |
767 | int cpus; | 659 | int cpus; |
768 | 660 | ||
@@ -786,18 +678,12 @@ static enum hrtimer_restart on_scheduling_timer(struct hrtimer *timer) | |||
786 | 678 | ||
787 | TRACE("Timer fired at %llu\n", litmus_clock()); | 679 | TRACE("Timer fired at %llu\n", litmus_clock()); |
788 | raw_spin_lock_irqsave(&state->lock, flags); | 680 | raw_spin_lock_irqsave(&state->lock, flags); |
789 | //raw_spin_lock(&state->lock); | ||
790 | //local_irq_save(flags); | ||
791 | now = litmus_clock(); | 681 | now = litmus_clock(); |
792 | sup_update_time(state->sup_env, now); | 682 | sup_update_time(state->sup_env, now); |
793 | 683 | ||
794 | /* 9/20/2015 fix - no ghost job | ||
795 | remain_budget = mc2_update_ghost_state(state); | ||
796 | */ | ||
797 | update = state->sup_env->next_scheduler_update; | 684 | update = state->sup_env->next_scheduler_update; |
798 | now = state->sup_env->env.current_time; | 685 | now = state->sup_env->env.current_time; |
799 | 686 | ||
800 | |||
801 | if (update <= now) { | 687 | if (update <= now) { |
802 | litmus_reschedule_local(); | 688 | litmus_reschedule_local(); |
803 | } else if (update != SUP_NO_SCHEDULER_UPDATE) { | 689 | } else if (update != SUP_NO_SCHEDULER_UPDATE) { |
@@ -805,7 +691,6 @@ static enum hrtimer_restart on_scheduling_timer(struct hrtimer *timer) | |||
805 | restart = HRTIMER_RESTART; | 691 | restart = HRTIMER_RESTART; |
806 | } | 692 | } |
807 | 693 | ||
808 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
809 | raw_spin_lock(&global_lock); | 694 | raw_spin_lock(&global_lock); |
810 | global_schedule_now = gmp_update_time(_global_env, litmus_clock()); | 695 | global_schedule_now = gmp_update_time(_global_env, litmus_clock()); |
811 | BUG_ON(global_schedule_now < 0 || global_schedule_now > 4); | 696 | BUG_ON(global_schedule_now < 0 || global_schedule_now > 4); |
@@ -814,39 +699,24 @@ static enum hrtimer_restart on_scheduling_timer(struct hrtimer *timer) | |||
814 | while (global_schedule_now--) { | 699 | while (global_schedule_now--) { |
815 | int cpu = get_lowest_prio_cpu(0); | 700 | int cpu = get_lowest_prio_cpu(0); |
816 | if (cpu != NO_CPU && _lowest_prio_cpu.cpu_entries[cpu].will_schedule == false) { | 701 | if (cpu != NO_CPU && _lowest_prio_cpu.cpu_entries[cpu].will_schedule == false) { |
817 | //raw_spin_lock(&_lowest_prio_cpu.lock); | ||
818 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; | 702 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; |
819 | //raw_spin_unlock(&_lowest_prio_cpu.lock); | ||
820 | TRACE("LOWEST CPU = P%d\n", cpu); | ||
821 | if (cpu == state->cpu && update > now) | 703 | if (cpu == state->cpu && update > now) |
822 | ;//litmus_reschedule_local(); | 704 | ; |
823 | else | 705 | else |
824 | reschedule[cpu] = 1; | 706 | reschedule[cpu] = 1; |
825 | } | 707 | } |
826 | } | 708 | } |
827 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
828 | raw_spin_unlock(&global_lock); | 709 | raw_spin_unlock(&global_lock); |
829 | raw_spin_unlock_irqrestore(&state->lock, flags); | 710 | raw_spin_unlock_irqrestore(&state->lock, flags); |
830 | //raw_spin_unlock(&state->lock); | ||
831 | //local_irq_restore(flags); | ||
832 | 711 | ||
833 | TS_ISR_END; | 712 | TS_ISR_END; |
834 | 713 | ||
835 | for (cpus = 0; cpus<NR_CPUS; cpus++) { | 714 | for (cpus = 0; cpus<NR_CPUS; cpus++) { |
836 | if (reschedule[cpus]) { | 715 | if (reschedule[cpus]) { |
837 | litmus_reschedule(cpus); | 716 | litmus_reschedule(cpus); |
838 | /* | ||
839 | struct mc2_cpu_state *remote_state; | ||
840 | |||
841 | remote_state = cpu_state_for(cpus); | ||
842 | raw_spin_lock(&remote_state->lock); | ||
843 | preempt_if_preemptable(remote_state->scheduled, remote_state->cpu); | ||
844 | raw_spin_unlock(&remote_state->lock); | ||
845 | */ | ||
846 | } | 717 | } |
847 | } | 718 | } |
848 | 719 | ||
849 | |||
850 | return restart; | 720 | return restart; |
851 | } | 721 | } |
852 | 722 | ||
@@ -898,7 +768,6 @@ static long mc2_complete_job(void) | |||
898 | int i; | 768 | int i; |
899 | state = local_cpu_state(); | 769 | state = local_cpu_state(); |
900 | raw_spin_lock(&state->lock); | 770 | raw_spin_lock(&state->lock); |
901 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
902 | raw_spin_lock(&global_lock); | 771 | raw_spin_lock(&global_lock); |
903 | for (i = 0; i < NR_MODES; i++) { | 772 | for (i = 0; i < NR_MODES; i++) { |
904 | if (in_mode(current,i) || i == 0) { | 773 | if (in_mode(current,i) || i == 0) { |
@@ -956,10 +825,6 @@ static long mc2_complete_job(void) | |||
956 | res_reported--; | 825 | res_reported--; |
957 | TRACE_CUR("RES_REPORTED = %d\n", res_reported); | 826 | TRACE_CUR("RES_REPORTED = %d\n", res_reported); |
958 | res->reported = 1; | 827 | res->reported = 1; |
959 | //Current task doesn't exist in new mode | ||
960 | //if ( !in_mode(current, requested_mode) ){ | ||
961 | // litmus_reschedule_local(); | ||
962 | //} | ||
963 | } | 828 | } |
964 | raw_spin_unlock(&mode_lock); | 829 | raw_spin_unlock(&mode_lock); |
965 | } | 830 | } |
@@ -993,17 +858,8 @@ struct task_struct* mc2_dispatch(struct sup_reservation_environment* sup_env, st | |||
993 | { | 858 | { |
994 | struct reservation *res, *next; | 859 | struct reservation *res, *next; |
995 | struct task_struct *tsk = NULL; | 860 | struct task_struct *tsk = NULL; |
996 | //struct crit_entry *ce; | ||
997 | enum crit_level lv; | 861 | enum crit_level lv; |
998 | lt_t time_slice; | 862 | lt_t time_slice; |
999 | |||
1000 | |||
1001 | list_for_each_entry_safe(res, next, &sup_env->active_reservations, list) { | ||
1002 | if (res->state == RESERVATION_ACTIVE) { | ||
1003 | struct task_struct *t = res->ops->dispatch_client(res, &time_slice); | ||
1004 | TRACE_TASK(tsk, "CPU%d ACT_LIST R%d cur.mode = %d, res->mode = %d budget = %llu next_repl. = %llu, deadline = %llu\n", state->cpu, res->id, mode, res->mode, res->cur_budget, res->next_replenishment, get_deadline(t)); | ||
1005 | } | ||
1006 | } | ||
1007 | 863 | ||
1008 | list_for_each_entry_safe(res, next, &sup_env->active_reservations, list) { | 864 | list_for_each_entry_safe(res, next, &sup_env->active_reservations, list) { |
1009 | if (res->state == RESERVATION_ACTIVE) { | 865 | if (res->state == RESERVATION_ACTIVE) { |
@@ -1014,22 +870,10 @@ struct task_struct* mc2_dispatch(struct sup_reservation_environment* sup_env, st | |||
1014 | sup_scheduler_update_after(sup_env, res->cur_budget); | 870 | sup_scheduler_update_after(sup_env, res->cur_budget); |
1015 | return tsk; | 871 | return tsk; |
1016 | } else { | 872 | } else { |
1017 | //if (!is_init_finished(tsk)) { | ||
1018 | // TRACE_TASK(tsk, "num_sync_released = %d, mode = %d\n", num_sync_released, mode); | ||
1019 | // if (num_sync_released != 0 && mode == 0) { | ||
1020 | //ce = &state->crit_entries[lv]; | ||
1021 | sup_scheduler_update_after(sup_env, res->cur_budget); | 873 | sup_scheduler_update_after(sup_env, res->cur_budget); |
1022 | res->blocked_by_ghost = 0; | 874 | res->blocked_by_ghost = 0; |
1023 | res->is_ghost = NO_CPU; | 875 | res->is_ghost = NO_CPU; |
1024 | return tsk; | 876 | return tsk; |
1025 | /* | ||
1026 | } else if (res->mode == mode) { | ||
1027 | sup_scheduler_update_after(sup_env, res->cur_budget); | ||
1028 | res->blocked_by_ghost = 0; | ||
1029 | res->is_ghost = NO_CPU; | ||
1030 | return tsk; | ||
1031 | } | ||
1032 | */ | ||
1033 | } | 877 | } |
1034 | } | 878 | } |
1035 | } | 879 | } |
@@ -1042,19 +886,10 @@ struct task_struct* mc2_global_dispatch(struct mc2_cpu_state* state) | |||
1042 | { | 886 | { |
1043 | struct reservation *res, *next; | 887 | struct reservation *res, *next; |
1044 | struct task_struct *tsk = NULL; | 888 | struct task_struct *tsk = NULL; |
1045 | //struct crit_entry *ce; | ||
1046 | enum crit_level lv; | 889 | enum crit_level lv; |
1047 | lt_t time_slice; | 890 | lt_t time_slice; |
1048 | 891 | ||
1049 | list_for_each_entry_safe(res, next, &_global_env->active_reservations, list) { | 892 | list_for_each_entry_safe(res, next, &_global_env->active_reservations, list) { |
1050 | if (res->state == RESERVATION_ACTIVE) { | ||
1051 | struct task_struct *t = res->ops->dispatch_client(res, &time_slice); | ||
1052 | TRACE_TASK(tsk, "GLOBAL ACT_LIST R%d cur.mode = %d, res->mode = %d budget = %llu next_repl. = %llu, deadline = %llu\n", res->id, mode, res->mode, res->cur_budget, res->next_replenishment, get_deadline(t)); | ||
1053 | } | ||
1054 | } | ||
1055 | |||
1056 | //raw_spin_lock(&mode_lock); | ||
1057 | list_for_each_entry_safe(res, next, &_global_env->active_reservations, list) { | ||
1058 | BUG_ON(!res); | 893 | BUG_ON(!res); |
1059 | if (res->state == RESERVATION_ACTIVE && res->scheduled_on == NO_CPU) { | 894 | if (res->state == RESERVATION_ACTIVE && res->scheduled_on == NO_CPU) { |
1060 | tsk = res->ops->dispatch_client(res, &time_slice); | 895 | tsk = res->ops->dispatch_client(res, &time_slice); |
@@ -1074,12 +909,10 @@ struct task_struct* mc2_global_dispatch(struct mc2_cpu_state* state) | |||
1074 | res->is_ghost = NO_CPU; | 909 | res->is_ghost = NO_CPU; |
1075 | TRACE_TASK(res->tsk, "R%d global dispatched on %d\n", res->id, state->cpu); | 910 | TRACE_TASK(res->tsk, "R%d global dispatched on %d\n", res->id, state->cpu); |
1076 | res->scheduled_on = state->cpu; | 911 | res->scheduled_on = state->cpu; |
1077 | //raw_spin_unlock(&mode_lock); | ||
1078 | return tsk; | 912 | return tsk; |
1079 | } | 913 | } |
1080 | } | 914 | } |
1081 | } | 915 | } |
1082 | //raw_spin_unlock(&mode_lock); | ||
1083 | return NULL; | 916 | return NULL; |
1084 | } | 917 | } |
1085 | 918 | ||
@@ -1126,7 +959,7 @@ static inline void post_schedule(struct task_struct *next, int cpu) | |||
1126 | */ | 959 | */ |
1127 | static struct task_struct* mc2_schedule(struct task_struct * prev) | 960 | static struct task_struct* mc2_schedule(struct task_struct * prev) |
1128 | { | 961 | { |
1129 | int np, blocks, exists, to_schedule; | 962 | int np, blocks, exists; |
1130 | /* next == NULL means "schedule background work". */ | 963 | /* next == NULL means "schedule background work". */ |
1131 | lt_t now = litmus_clock(); | 964 | lt_t now = litmus_clock(); |
1132 | struct mc2_cpu_state *state = local_cpu_state(); | 965 | struct mc2_cpu_state *state = local_cpu_state(); |
@@ -1138,11 +971,6 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1138 | BUG_ON(state->scheduled && state->scheduled != prev); | 971 | BUG_ON(state->scheduled && state->scheduled != prev); |
1139 | BUG_ON(state->scheduled && !is_realtime(prev)); | 972 | BUG_ON(state->scheduled && !is_realtime(prev)); |
1140 | 973 | ||
1141 | //if (state->scheduled && state->scheduled != prev) | ||
1142 | // printk(KERN_ALERT "BUG1!!!!!!!! %s %s\n", state->scheduled ? (state->scheduled)->comm : "null", prev ? (prev)->comm : "null"); | ||
1143 | //if (state->scheduled && !is_realtime(prev)) | ||
1144 | // printk(KERN_ALERT "BUG2!!!!!!!! \n"); | ||
1145 | |||
1146 | /* (0) Determine state */ | 974 | /* (0) Determine state */ |
1147 | exists = state->scheduled != NULL; | 975 | exists = state->scheduled != NULL; |
1148 | blocks = exists && !is_current_running(); | 976 | blocks = exists && !is_current_running(); |
@@ -1151,32 +979,13 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1151 | /* update time */ | 979 | /* update time */ |
1152 | state->sup_env->will_schedule = true; | 980 | state->sup_env->will_schedule = true; |
1153 | sup_update_time(state->sup_env, now); | 981 | sup_update_time(state->sup_env, now); |
1154 | /* 9/20/2015 fix */ | 982 | |
1155 | //raw_spin_lock(&_global_env.lock); | ||
1156 | //to_schedule = gmp_update_time(&_global_env, now); | ||
1157 | //raw_spin_unlock(&_global_env.lock); | ||
1158 | |||
1159 | /* 9/20/2015 fix | ||
1160 | mc2_update_ghost_state(state); | ||
1161 | */ | ||
1162 | |||
1163 | /* remove task from reservation if it blocks */ | ||
1164 | /* | ||
1165 | if (is_realtime(prev) && !is_running(prev)) { | ||
1166 | if (get_task_crit_level(prev) == CRIT_LEVEL_C) | ||
1167 | raw_spin_lock(&_global_env.lock); | ||
1168 | task_departs(prev, is_completed(prev)); | ||
1169 | if (get_task_crit_level(prev) == CRIT_LEVEL_C) | ||
1170 | raw_spin_unlock(&_global_env.lock); | ||
1171 | }*/ | ||
1172 | if (is_realtime(current) && blocks) { | 983 | if (is_realtime(current) && blocks) { |
1173 | if (get_task_crit_level(current) == CRIT_LEVEL_C){ | 984 | if (get_task_crit_level(current) == CRIT_LEVEL_C){ |
1174 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1175 | raw_spin_lock(&global_lock); | 985 | raw_spin_lock(&global_lock); |
1176 | } | 986 | } |
1177 | task_departs(current, is_completed(current)); | 987 | task_departs(current, is_completed(current)); |
1178 | if (get_task_crit_level(current) == CRIT_LEVEL_C){ | 988 | if (get_task_crit_level(current) == CRIT_LEVEL_C){ |
1179 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1180 | raw_spin_unlock(&global_lock); | 989 | raw_spin_unlock(&global_lock); |
1181 | } | 990 | } |
1182 | } | 991 | } |
@@ -1186,7 +995,6 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1186 | state->scheduled = mc2_dispatch(state->sup_env, state); | 995 | state->scheduled = mc2_dispatch(state->sup_env, state); |
1187 | 996 | ||
1188 | if (!state->scheduled) { | 997 | if (!state->scheduled) { |
1189 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1190 | raw_spin_lock(&global_lock); | 998 | raw_spin_lock(&global_lock); |
1191 | if (is_realtime(prev)) | 999 | if (is_realtime(prev)) |
1192 | gmp_update_time(_global_env, now); | 1000 | gmp_update_time(_global_env, now); |
@@ -1200,26 +1008,6 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1200 | update_cpu_prio(state); | 1008 | update_cpu_prio(state); |
1201 | raw_spin_unlock(&global_lock); | 1009 | raw_spin_unlock(&global_lock); |
1202 | } | 1010 | } |
1203 | /* | ||
1204 | if (!state->scheduled) { | ||
1205 | TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n");raw_spin_lock(&global_lock); | ||
1206 | //to_schedule = gmp_update_time(_global_env, now); | ||
1207 | state->scheduled = mc2_global_dispatch(state); | ||
1208 | _lowest_prio_cpu.cpu_entries[state->cpu].will_schedule = false; | ||
1209 | update_cpu_prio(state); | ||
1210 | TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n");raw_spin_unlock(&global_lock); | ||
1211 | } else { | ||
1212 | TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n");raw_spin_lock(&global_lock); | ||
1213 | _lowest_prio_cpu.cpu_entries[state->cpu].will_schedule = false; | ||
1214 | update_cpu_prio(state); | ||
1215 | TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n");raw_spin_unlock(&global_lock); | ||
1216 | } | ||
1217 | */ | ||
1218 | |||
1219 | //raw_spin_lock(&_lowest_prio_cpu.lock); | ||
1220 | //_lowest_prio_cpu.cpu_entries[state->cpu].will_schedule = false; | ||
1221 | //update_cpu_prio(state); | ||
1222 | //raw_spin_unlock(&_lowest_prio_cpu.lock); | ||
1223 | 1011 | ||
1224 | /* Notify LITMUS^RT core that we've arrived at a scheduling decision. */ | 1012 | /* Notify LITMUS^RT core that we've arrived at a scheduling decision. */ |
1225 | sched_state_task_picked(); | 1013 | sched_state_task_picked(); |
@@ -1235,41 +1023,22 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1235 | struct mc2_task_state* tinfo = get_mc2_state(prev); | 1023 | struct mc2_task_state* tinfo = get_mc2_state(prev); |
1236 | struct reservation* res = tinfo->res_info[mode].client.reservation; | 1024 | struct reservation* res = tinfo->res_info[mode].client.reservation; |
1237 | if (res) { | 1025 | if (res) { |
1238 | TRACE_TASK(prev, "PREV JOB of mode %d was scheduled_on = P%d\n", mode, res->scheduled_on); | ||
1239 | res->scheduled_on = NO_CPU; | 1026 | res->scheduled_on = NO_CPU; |
1240 | } | 1027 | } |
1241 | TRACE_TASK(prev, "descheduled at %llu.\n", litmus_clock()); | 1028 | TRACE_TASK(prev, "descheduled at %llu.\n", litmus_clock()); |
1242 | /* if prev is preempted and a global task, find the lowest cpu and reschedule */ | 1029 | /* if prev is preempted and a global task, find the lowest cpu and reschedule */ |
1243 | if (tinfo->has_departed == false && get_task_crit_level(prev) == CRIT_LEVEL_C) { | 1030 | if (tinfo->has_departed == false && get_task_crit_level(prev) == CRIT_LEVEL_C) { |
1244 | int cpu; | 1031 | int cpu; |
1245 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1246 | raw_spin_lock(&global_lock); | 1032 | raw_spin_lock(&global_lock); |
1247 | cpu = get_lowest_prio_cpu(res?res->priority:LITMUS_NO_PRIORITY); | 1033 | cpu = get_lowest_prio_cpu(res?res->priority:LITMUS_NO_PRIORITY); |
1248 | if (cpu != NO_CPU && _lowest_prio_cpu.cpu_entries[cpu].will_schedule == false) { | 1034 | if (cpu != NO_CPU && _lowest_prio_cpu.cpu_entries[cpu].will_schedule == false) { |
1249 | //raw_spin_lock(&_lowest_prio_cpu.lock); | ||
1250 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; | 1035 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; |
1251 | resched_cpu[cpu] = 1; | 1036 | resched_cpu[cpu] = 1; |
1252 | //raw_spin_unlock(&_lowest_prio_cpu.lock); | ||
1253 | TRACE("LEVEL-C TASK PREEMPTED!! poking CPU %d to reschedule\n", cpu); | ||
1254 | } | 1037 | } |
1255 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1256 | raw_spin_unlock(&global_lock); | 1038 | raw_spin_unlock(&global_lock); |
1257 | } | 1039 | } |
1258 | } | 1040 | } |
1259 | 1041 | ||
1260 | /* | ||
1261 | if (to_schedule != 0) { | ||
1262 | TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n");raw_spin_lock(&global_lock); | ||
1263 | while (to_schedule--) { | ||
1264 | int cpu = get_lowest_prio_cpu(0); | ||
1265 | if (cpu != NO_CPU && _lowest_prio_cpu.cpu_entries[cpu].will_schedule == false) { | ||
1266 | _lowest_prio_cpu.cpu_entries[cpu].will_schedule = true; | ||
1267 | resched_cpu[cpu] = 1; | ||
1268 | } | ||
1269 | } | ||
1270 | TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n");raw_spin_unlock(&global_lock); | ||
1271 | } | ||
1272 | */ | ||
1273 | post_schedule(state->scheduled, state->cpu); | 1042 | post_schedule(state->scheduled, state->cpu); |
1274 | 1043 | ||
1275 | raw_spin_unlock(&state->lock); | 1044 | raw_spin_unlock(&state->lock); |
@@ -1277,7 +1046,6 @@ static struct task_struct* mc2_schedule(struct task_struct * prev) | |||
1277 | TRACE_TASK(state->scheduled, "scheduled.\n"); | 1046 | TRACE_TASK(state->scheduled, "scheduled.\n"); |
1278 | } | 1047 | } |
1279 | 1048 | ||
1280 | |||
1281 | return state->scheduled; | 1049 | return state->scheduled; |
1282 | } | 1050 | } |
1283 | 1051 | ||
@@ -1308,7 +1076,6 @@ static void mc2_task_resume(struct task_struct *tsk) | |||
1308 | 1076 | ||
1309 | TRACE_TASK(tsk, "thread wakes up at %llu\n", litmus_clock()); | 1077 | TRACE_TASK(tsk, "thread wakes up at %llu\n", litmus_clock()); |
1310 | 1078 | ||
1311 | //local_irq_save(flags); | ||
1312 | preempt_disable(); | 1079 | preempt_disable(); |
1313 | tinfo = get_mc2_state(tsk); | 1080 | tinfo = get_mc2_state(tsk); |
1314 | if (tinfo->cpu != -1) | 1081 | if (tinfo->cpu != -1) |
@@ -1317,41 +1084,36 @@ static void mc2_task_resume(struct task_struct *tsk) | |||
1317 | state = local_cpu_state(); | 1084 | state = local_cpu_state(); |
1318 | preempt_enable(); | 1085 | preempt_enable(); |
1319 | 1086 | ||
1320 | /* 9/20/2015 fix | ||
1321 | raw_spin_lock(&_global_env.lock); | ||
1322 | */ | ||
1323 | /* Requeue only if self-suspension was already processed. */ | 1087 | /* Requeue only if self-suspension was already processed. */ |
1324 | if (tinfo->has_departed) | 1088 | if (tinfo->has_departed) |
1325 | { | 1089 | { |
1326 | /* We don't want to consider jobs before synchronous releases */ | 1090 | #ifdef CONFIG_SCHED_OVERHEAD_TRACE |
1091 | switch(get_task_crit_level(tsk)) { | ||
1092 | case CRIT_LEVEL_A: | ||
1093 | TS_RELEASE_LATENCY_A(get_release(tsk)); | ||
1094 | break; | ||
1095 | case CRIT_LEVEL_B: | ||
1096 | TS_RELEASE_LATENCY_B(get_release(tsk)); | ||
1097 | break; | ||
1098 | case CRIT_LEVEL_C: | ||
1099 | TS_RELEASE_LATENCY_C(get_release(tsk)); | ||
1100 | break; | ||
1101 | default: | ||
1102 | break; | ||
1103 | } | ||
1104 | #endif | ||
1105 | /* We don't want to consider jobs in the initialization mode */ | ||
1327 | if (tsk_rt(tsk)->job_params.job_no == 2) { | 1106 | if (tsk_rt(tsk)->job_params.job_no == 2) { |
1328 | /* | ||
1329 | switch(get_task_crit_level(tsk)) { | ||
1330 | case CRIT_LEVEL_A: | ||
1331 | TS_RELEASE_LATENCY_A(get_release(tsk)); | ||
1332 | break; | ||
1333 | case CRIT_LEVEL_B: | ||
1334 | TS_RELEASE_LATENCY_B(get_release(tsk)); | ||
1335 | break; | ||
1336 | case CRIT_LEVEL_C: | ||
1337 | TS_RELEASE_LATENCY_C(get_release(tsk)); | ||
1338 | break; | ||
1339 | default: | ||
1340 | break; | ||
1341 | } | ||
1342 | */ | ||
1343 | TRACE_TASK(tsk, "INIT_FINISHED is SET\n"); | ||
1344 | tsk_mc2_data(tsk)->init_finished = 1; | 1107 | tsk_mc2_data(tsk)->init_finished = 1; |
1345 | atomic_dec(&num_sync_released); | 1108 | atomic_dec(&num_sync_released); |
1346 | 1109 | ||
1347 | if (atomic_read(&num_sync_released) == 0) { | 1110 | if (atomic_read(&num_sync_released) == 0) { |
1348 | lt_t start = tsk_rt(tsk)->sporadic_release_time + INIT_PHASE_LENGTH_NS*(tsk_rt(tsk)->job_params.job_no); | 1111 | lt_t start = tsk_rt(tsk)->sporadic_release_time + INIT_PHASE_LENGTH_NS*(tsk_rt(tsk)->job_params.job_no); |
1349 | TRACE("INIT_PHASE FINISHED. CHANGE TO MODE 1\n"); | ||
1350 | sys_request_mode(1); | 1112 | sys_request_mode(1); |
1351 | sched_trace_sys_start(&start); | 1113 | sched_trace_sys_start(&start); |
1352 | } | 1114 | } |
1353 | TRACE_TASK(tsk, "INIT_FINISHED is SET, num_sync_released decreased to %d\n", atomic_read(&num_sync_released)); | ||
1354 | } | 1115 | } |
1116 | |||
1355 | raw_spin_lock_irqsave(&state->lock, flags); | 1117 | raw_spin_lock_irqsave(&state->lock, flags); |
1356 | 1118 | ||
1357 | /* Assumption: litmus_clock() is synchronized across cores, | 1119 | /* Assumption: litmus_clock() is synchronized across cores, |
@@ -1361,18 +1123,12 @@ static void mc2_task_resume(struct task_struct *tsk) | |||
1361 | sup_update_time(state->sup_env, litmus_clock()); | 1123 | sup_update_time(state->sup_env, litmus_clock()); |
1362 | task_arrives(state, tsk); | 1124 | task_arrives(state, tsk); |
1363 | } else { | 1125 | } else { |
1364 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1365 | raw_spin_lock(&global_lock); | 1126 | raw_spin_lock(&global_lock); |
1366 | gmp_update_time(_global_env, litmus_clock()); | 1127 | gmp_update_time(_global_env, litmus_clock()); |
1367 | task_arrives(state, tsk); | 1128 | task_arrives(state, tsk); |
1368 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1369 | raw_spin_unlock(&global_lock); | 1129 | raw_spin_unlock(&global_lock); |
1370 | } | 1130 | } |
1371 | 1131 | ||
1372 | /* 9/20/2015 fix | ||
1373 | mc2_update_ghost_state(state); | ||
1374 | */ | ||
1375 | //task_arrives(state, tsk); | ||
1376 | /* NOTE: drops state->lock */ | 1132 | /* NOTE: drops state->lock */ |
1377 | TRACE_TASK(tsk, "mc2_resume()\n"); | 1133 | TRACE_TASK(tsk, "mc2_resume()\n"); |
1378 | raw_spin_unlock_irqrestore(&state->lock, flags); | 1134 | raw_spin_unlock_irqrestore(&state->lock, flags); |
@@ -1381,12 +1137,8 @@ static void mc2_task_resume(struct task_struct *tsk) | |||
1381 | mc2_update_timer_and_unlock(state); | 1137 | mc2_update_timer_and_unlock(state); |
1382 | } else { | 1138 | } else { |
1383 | TRACE_TASK(tsk, "resume event ignored, still scheduled\n"); | 1139 | TRACE_TASK(tsk, "resume event ignored, still scheduled\n"); |
1384 | //raw_spin_unlock(&_global_env.lock); | ||
1385 | } | 1140 | } |
1386 | 1141 | ||
1387 | //local_irq_restore(flags); | ||
1388 | |||
1389 | //gmp_free_passed_event(); | ||
1390 | resume_legacy_task_model_updates(tsk); | 1142 | resume_legacy_task_model_updates(tsk); |
1391 | } | 1143 | } |
1392 | 1144 | ||
@@ -1417,8 +1169,6 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1417 | 1169 | ||
1418 | if (lv < CRIT_LEVEL_C) { | 1170 | if (lv < CRIT_LEVEL_C) { |
1419 | state = cpu_state_for(task_cpu(tsk)); | 1171 | state = cpu_state_for(task_cpu(tsk)); |
1420 | //local_irq_save(flags); | ||
1421 | //raw_spin_lock(&state->lock); | ||
1422 | raw_spin_lock_irqsave(&state->lock, flags); | 1172 | raw_spin_lock_irqsave(&state->lock, flags); |
1423 | 1173 | ||
1424 | tinfo->mc2_param.crit = mp->crit; | 1174 | tinfo->mc2_param.crit = mp->crit; |
@@ -1427,15 +1177,11 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1427 | tinfo->mc2_param.res_id = mp->res_id; | 1177 | tinfo->mc2_param.res_id = mp->res_id; |
1428 | tinfo->mc2_param.mode_mask = mp->mode_mask; | 1178 | tinfo->mc2_param.mode_mask = mp->mode_mask; |
1429 | tinfo->mc2_param.init_finished = 0; | 1179 | tinfo->mc2_param.init_finished = 0; |
1430 | // TRACE_TASK(tsk, "mode_mask = %x\n", mp->mode_mask); | 1180 | |
1431 | |||
1432 | // TRACE_TASK(tsk, "Mode 0\n"); | ||
1433 | res = sup_find_by_id(&(state->sup_env_modes[0]), mp->res_id); | 1181 | res = sup_find_by_id(&(state->sup_env_modes[0]), mp->res_id); |
1434 | 1182 | ||
1435 | /* found the appropriate reservation */ | 1183 | /* found the appropriate reservation */ |
1436 | if (res) { | 1184 | if (res) { |
1437 | // TRACE_TASK(tsk, "SUP FOUND RES ID in mode 0\n"); | ||
1438 | |||
1439 | /* initial values */ | 1185 | /* initial values */ |
1440 | err = err? err:mc2_task_client_init(&tinfo->res_info[0], &tinfo->mc2_param, tsk, res); | 1186 | err = err? err:mc2_task_client_init(&tinfo->res_info[0], &tinfo->mc2_param, tsk, res); |
1441 | } | 1187 | } |
@@ -1446,16 +1192,13 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1446 | 1192 | ||
1447 | for(i = 1; i < NR_MODES; i++){ | 1193 | for(i = 1; i < NR_MODES; i++){ |
1448 | if (!in_mode(tsk, i)){ | 1194 | if (!in_mode(tsk, i)){ |
1449 | //task not present in mode | 1195 | // task not present in mode |
1450 | continue; | 1196 | continue; |
1451 | } | 1197 | } |
1452 | // TRACE_TASK(tsk, "Mode %d\n",i); | ||
1453 | res = sup_find_by_id(&(state->sup_env_modes[i]), mp->res_id); | 1198 | res = sup_find_by_id(&(state->sup_env_modes[i]), mp->res_id); |
1454 | 1199 | ||
1455 | /* found the appropriate reservation */ | 1200 | /* found the appropriate reservation */ |
1456 | if (res) { | 1201 | if (res) { |
1457 | // TRACE_TASK(tsk, "SUP FOUND RES ID in mode %d\n", i); | ||
1458 | |||
1459 | /* initial values */ | 1202 | /* initial values */ |
1460 | err = err? err:mc2_task_client_init(&tinfo->res_info[i], &tinfo->mc2_param, tsk, res); | 1203 | err = err? err:mc2_task_client_init(&tinfo->res_info[i], &tinfo->mc2_param, tsk, res); |
1461 | } | 1204 | } |
@@ -1475,18 +1218,10 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1475 | cpu_0_task_exist = true; | 1218 | cpu_0_task_exist = true; |
1476 | } | 1219 | } |
1477 | atomic_inc(&num_sync_released); | 1220 | atomic_inc(&num_sync_released); |
1478 | //raw_spin_unlock(&state->lock); | ||
1479 | //local_irq_restore(flags); | ||
1480 | raw_spin_unlock_irqrestore(&state->lock, flags); | 1221 | raw_spin_unlock_irqrestore(&state->lock, flags); |
1481 | } else if (lv == CRIT_LEVEL_C) { | 1222 | } else if (lv == CRIT_LEVEL_C) { |
1482 | // TRACE_TASK(tsk, "Task being admitted is Level C\n"); | ||
1483 | state = local_cpu_state(); | 1223 | state = local_cpu_state(); |
1484 | raw_spin_lock_irqsave(&state->lock, flags); | 1224 | raw_spin_lock_irqsave(&state->lock, flags); |
1485 | //local_irq_save(flags); | ||
1486 | //raw_spin_lock(&state->lock); | ||
1487 | //state = local_cpu_state(); | ||
1488 | |||
1489 | //raw_spin_lock(&state->lock); | ||
1490 | 1225 | ||
1491 | tinfo->mc2_param.crit = mp->crit; | 1226 | tinfo->mc2_param.crit = mp->crit; |
1492 | tinfo->cpu = -1; | 1227 | tinfo->cpu = -1; |
@@ -1495,18 +1230,11 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1495 | tinfo->mc2_param.mode_mask = mp->mode_mask; | 1230 | tinfo->mc2_param.mode_mask = mp->mode_mask; |
1496 | tinfo->mc2_param.init_finished = 0; | 1231 | tinfo->mc2_param.init_finished = 0; |
1497 | 1232 | ||
1498 | // TRACE_TASK(tsk, "mode_mask = %x\n", mp->mode_mask); | ||
1499 | |||
1500 | // TRACE_TASK(tsk, "Mode 0\n"); | ||
1501 | |||
1502 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1503 | raw_spin_lock(&global_lock); | 1233 | raw_spin_lock(&global_lock); |
1504 | res = gmp_find_by_id(&(_global_env_modes[0]), mp->res_id); | 1234 | res = gmp_find_by_id(&(_global_env_modes[0]), mp->res_id); |
1505 | 1235 | ||
1506 | /* found the appropriate reservation */ | 1236 | /* found the appropriate reservation */ |
1507 | if (res) { | 1237 | if (res) { |
1508 | // TRACE_TASK(tsk, "GMP FOUND RES ID in mode 0\n"); | ||
1509 | |||
1510 | /* initial values */ | 1238 | /* initial values */ |
1511 | err = err? err:mc2_task_client_init(&tinfo->res_info[0], &tinfo->mc2_param, tsk, res); | 1239 | err = err? err:mc2_task_client_init(&tinfo->res_info[0], &tinfo->mc2_param, tsk, res); |
1512 | } | 1240 | } |
@@ -1522,8 +1250,6 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1522 | 1250 | ||
1523 | /* found the appropriate reservation (or vCPU) */ | 1251 | /* found the appropriate reservation (or vCPU) */ |
1524 | if (res) { | 1252 | if (res) { |
1525 | TRACE_TASK(tsk, "GMP FOUND RES ID in mode %d\n", i); | ||
1526 | |||
1527 | /* initial values */ | 1253 | /* initial values */ |
1528 | err = err? err:mc2_task_client_init(&tinfo->res_info[i], &tinfo->mc2_param, tsk, res); | 1254 | err = err? err:mc2_task_client_init(&tinfo->res_info[i], &tinfo->mc2_param, tsk, res); |
1529 | 1255 | ||
@@ -1548,10 +1274,7 @@ static long mc2_admit_task(struct task_struct *tsk) | |||
1548 | 1274 | ||
1549 | atomic_inc(&num_sync_released); | 1275 | atomic_inc(&num_sync_released); |
1550 | raw_spin_unlock_irqrestore(&state->lock, flags); | 1276 | raw_spin_unlock_irqrestore(&state->lock, flags); |
1551 | //raw_spin_unlock(&state->lock); | ||
1552 | //local_irq_restore(flags); | ||
1553 | } | 1277 | } |
1554 | |||
1555 | 1278 | ||
1556 | if (err) | 1279 | if (err) |
1557 | kfree(tinfo); | 1280 | kfree(tinfo); |
@@ -1568,7 +1291,7 @@ static void mc2_task_new(struct task_struct *tsk, int on_runqueue, | |||
1568 | { | 1291 | { |
1569 | unsigned long flags; | 1292 | unsigned long flags; |
1570 | struct mc2_task_state* tinfo = get_mc2_state(tsk); | 1293 | struct mc2_task_state* tinfo = get_mc2_state(tsk); |
1571 | struct mc2_cpu_state *state; // = cpu_state_for(tinfo->cpu); | 1294 | struct mc2_cpu_state *state; |
1572 | struct reservation *res; | 1295 | struct reservation *res; |
1573 | enum crit_level lv = get_task_crit_level(tsk); | 1296 | enum crit_level lv = get_task_crit_level(tsk); |
1574 | lt_t release = 0; | 1297 | lt_t release = 0; |
@@ -1584,54 +1307,42 @@ static void mc2_task_new(struct task_struct *tsk, int on_runqueue, | |||
1584 | state = cpu_state_for(tinfo->cpu); | 1307 | state = cpu_state_for(tinfo->cpu); |
1585 | 1308 | ||
1586 | 1309 | ||
1587 | /* acquire the lock protecting the state and disable interrupts */ | ||
1588 | //raw_spin_lock(&_global_env.lock); | ||
1589 | //raw_spin_lock(&state->lock); | ||
1590 | if (is_running) { | 1310 | if (is_running) { |
1591 | state->scheduled = tsk; | 1311 | state->scheduled = tsk; |
1592 | /* make sure this task should actually be running */ | 1312 | /* make sure this task should actually be running */ |
1593 | litmus_reschedule_local(); | 1313 | litmus_reschedule_local(); |
1594 | } | 1314 | } |
1595 | 1315 | ||
1316 | /* acquire the lock protecting the state and disable interrupts */ | ||
1596 | local_irq_save(flags); | 1317 | local_irq_save(flags); |
1597 | raw_spin_lock(&state->lock); | 1318 | raw_spin_lock(&state->lock); |
1598 | 1319 | ||
1599 | if (lv == CRIT_LEVEL_C) { | 1320 | if (lv == CRIT_LEVEL_C) { |
1600 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1601 | raw_spin_lock(&global_lock); | 1321 | raw_spin_lock(&global_lock); |
1602 | res = gmp_find_by_id(_global_env, tinfo->mc2_param.res_id); | 1322 | res = gmp_find_by_id(_global_env, tinfo->mc2_param.res_id); |
1603 | } | 1323 | } |
1604 | else { | 1324 | else { |
1605 | res = sup_find_by_id(state->sup_env, tinfo->mc2_param.res_id); | 1325 | res = sup_find_by_id(state->sup_env, tinfo->mc2_param.res_id); |
1606 | } | 1326 | } |
1607 | 1327 | BUG_ON(!res); | |
1608 | //BUG_ON(!res); | 1328 | |
1609 | // the current mode doesn't have this task. | 1329 | // the current mode doesn't have this task. |
1610 | // do not update timer and set the next release time. | 1330 | // do not update timer and set the next release time. |
1611 | 1331 | ||
1612 | //res = res_find_by_id(state, tinfo->mc2_param.res_id); | ||
1613 | BUG_ON(!res); | ||
1614 | |||
1615 | if (on_runqueue || is_running) { | 1332 | if (on_runqueue || is_running) { |
1616 | /* Assumption: litmus_clock() is synchronized across cores | 1333 | /* Assumption: litmus_clock() is synchronized across cores |
1617 | * [see comment in pres_task_resume()] */ | 1334 | * [see comment in pres_task_resume()] */ |
1618 | if (lv == CRIT_LEVEL_C) { | 1335 | if (lv == CRIT_LEVEL_C) { |
1619 | gmp_update_time(_global_env, litmus_clock()); | 1336 | gmp_update_time(_global_env, litmus_clock()); |
1620 | //raw_spin_unlock(&_global_env.lock); | ||
1621 | } | 1337 | } |
1622 | else | 1338 | else |
1623 | sup_update_time(state->sup_env, litmus_clock()); | 1339 | sup_update_time(state->sup_env, litmus_clock()); |
1624 | //mc2_update_time(lv, state, litmus_clock()); | 1340 | |
1625 | /* 9/20/2015 fix | ||
1626 | mc2_update_ghost_state(state); | ||
1627 | */ | ||
1628 | task_arrives(state, tsk); | 1341 | task_arrives(state, tsk); |
1629 | if (lv == CRIT_LEVEL_C){ | 1342 | if (lv == CRIT_LEVEL_C){ |
1630 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1631 | raw_spin_unlock(&global_lock); | 1343 | raw_spin_unlock(&global_lock); |
1632 | } | 1344 | } |
1633 | /* NOTE: drops state->lock */ | 1345 | /* NOTE: drops state->lock */ |
1634 | TRACE("mc2_new()\n"); | ||
1635 | raw_spin_unlock(&state->lock); | 1346 | raw_spin_unlock(&state->lock); |
1636 | local_irq_restore(flags); | 1347 | local_irq_restore(flags); |
1637 | 1348 | ||
@@ -1639,7 +1350,6 @@ static void mc2_task_new(struct task_struct *tsk, int on_runqueue, | |||
1639 | mc2_update_timer_and_unlock(state); | 1350 | mc2_update_timer_and_unlock(state); |
1640 | } else { | 1351 | } else { |
1641 | if (lv == CRIT_LEVEL_C){ | 1352 | if (lv == CRIT_LEVEL_C){ |
1642 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1643 | raw_spin_unlock(&global_lock); | 1353 | raw_spin_unlock(&global_lock); |
1644 | } | 1354 | } |
1645 | raw_spin_unlock(&state->lock); | 1355 | raw_spin_unlock(&state->lock); |
@@ -1647,14 +1357,7 @@ static void mc2_task_new(struct task_struct *tsk, int on_runqueue, | |||
1647 | } | 1357 | } |
1648 | release = res->next_replenishment; | 1358 | release = res->next_replenishment; |
1649 | 1359 | ||
1650 | //local_irq_restore(flags); | ||
1651 | |||
1652 | if (!release) { | 1360 | if (!release) { |
1653 | /*TRACE_TASK(tsk, "mc2_task_new() next_release = NULL\n"); | ||
1654 | release = res->next_replenishment; | ||
1655 | TRACE_TASK(tsk, "mc2_task_new() next_release SET! = %llu\n", release); | ||
1656 | release_at(tsk, release); | ||
1657 | */ | ||
1658 | BUG(); | 1361 | BUG(); |
1659 | } | 1362 | } |
1660 | else | 1363 | else |
@@ -1670,22 +1373,17 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1670 | struct reservation *res = NULL, *next; | 1373 | struct reservation *res = NULL, *next; |
1671 | struct sup_reservation_environment *sup_env; | 1374 | struct sup_reservation_environment *sup_env; |
1672 | int found = 0; | 1375 | int found = 0; |
1673 | //enum crit_level lv = get_task_crit_level(current); | ||
1674 | unsigned long flags; | 1376 | unsigned long flags; |
1675 | int i; | 1377 | int i; |
1676 | 1378 | ||
1677 | if (cpu == -1) { | 1379 | if (cpu == -1) { |
1678 | struct next_timer_event *event, *e_next; | 1380 | struct next_timer_event *event, *e_next; |
1679 | local_irq_save(flags); | 1381 | local_irq_save(flags); |
1680 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1681 | raw_spin_lock(&global_lock); | 1382 | raw_spin_lock(&global_lock); |
1682 | 1383 | ||
1683 | /* if the reservation is global reservation */ | 1384 | /* if the reservation is global reservation, |
1684 | //state = local_cpu_state(); | 1385 | * delete reservation id in all modes */ |
1685 | //delete reservation id in all modes | ||
1686 | for(i = 0; i < NR_MODES; i++) { | 1386 | for(i = 0; i < NR_MODES; i++) { |
1687 | //raw_spin_lock(&state->lock); | ||
1688 | |||
1689 | list_for_each_entry_safe(res, next, &_global_env_modes[i].depleted_reservations, list) { | 1387 | list_for_each_entry_safe(res, next, &_global_env_modes[i].depleted_reservations, list) { |
1690 | if (res->id == reservation_id) { | 1388 | if (res->id == reservation_id) { |
1691 | list_del(&res->list); | 1389 | list_del(&res->list); |
@@ -1715,17 +1413,14 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1715 | } | 1413 | } |
1716 | } | 1414 | } |
1717 | 1415 | ||
1718 | //raw_spin_unlock(&state->lock); | ||
1719 | list_for_each_entry_safe(event, e_next, &_global_env_modes[i].next_events, list) { | 1416 | list_for_each_entry_safe(event, e_next, &_global_env_modes[i].next_events, list) { |
1720 | if (event->id == reservation_id) { | 1417 | if (event->id == reservation_id) { |
1721 | list_del(&event->list); | 1418 | list_del(&event->list); |
1722 | TRACE("EVENT id %d deleted\n", event->id); | ||
1723 | kfree(event); | 1419 | kfree(event); |
1724 | } | 1420 | } |
1725 | } | 1421 | } |
1726 | } | 1422 | } |
1727 | 1423 | ||
1728 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1729 | raw_spin_unlock(&global_lock); | 1424 | raw_spin_unlock(&global_lock); |
1730 | local_irq_restore(flags); | 1425 | local_irq_restore(flags); |
1731 | } else { | 1426 | } else { |
@@ -1734,8 +1429,6 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1734 | for (i = 0; i < NR_MODES; i++){ | 1429 | for (i = 0; i < NR_MODES; i++){ |
1735 | local_irq_save(flags); | 1430 | local_irq_save(flags); |
1736 | raw_spin_lock(&state->lock); | 1431 | raw_spin_lock(&state->lock); |
1737 | |||
1738 | // res = sup_find_by_id(state->sup_env, reservation_id); | ||
1739 | sup_env = &(state->sup_env_modes[i]); | 1432 | sup_env = &(state->sup_env_modes[i]); |
1740 | list_for_each_entry_safe(res, next, &sup_env->depleted_reservations, list) { | 1433 | list_for_each_entry_safe(res, next, &sup_env->depleted_reservations, list) { |
1741 | if (res->id == reservation_id) { | 1434 | if (res->id == reservation_id) { |
@@ -1750,7 +1443,6 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1750 | kfree(res); | 1443 | kfree(res); |
1751 | found = 1; | 1444 | found = 1; |
1752 | ret = 0; | 1445 | ret = 0; |
1753 | TRACE_CUR("FOUND id %d mode %d\n",res->id, res->mode); | ||
1754 | } | 1446 | } |
1755 | } | 1447 | } |
1756 | if (!found) { | 1448 | if (!found) { |
@@ -1766,7 +1458,6 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1766 | kfree(res); | 1458 | kfree(res); |
1767 | found = 1; | 1459 | found = 1; |
1768 | ret = 0; | 1460 | ret = 0; |
1769 | TRACE_CUR("FOUND id %d mode %d\n",res->id, res->mode); | ||
1770 | } | 1461 | } |
1771 | } | 1462 | } |
1772 | } | 1463 | } |
@@ -1783,7 +1474,6 @@ static long mc2_reservation_destroy(unsigned int reservation_id, int cpu) | |||
1783 | kfree(res); | 1474 | kfree(res); |
1784 | found = 1; | 1475 | found = 1; |
1785 | ret = 0; | 1476 | ret = 0; |
1786 | TRACE_CUR("FOUND id %d mode %d\n",res->id, res->mode); | ||
1787 | } | 1477 | } |
1788 | } | 1478 | } |
1789 | } | 1479 | } |
@@ -1805,9 +1495,7 @@ static void mc2_task_exit(struct task_struct *tsk) | |||
1805 | struct mc2_task_state* tinfo = get_mc2_state(tsk); | 1495 | struct mc2_task_state* tinfo = get_mc2_state(tsk); |
1806 | struct mc2_cpu_state *state; | 1496 | struct mc2_cpu_state *state; |
1807 | enum crit_level lv = tinfo->mc2_param.crit; | 1497 | enum crit_level lv = tinfo->mc2_param.crit; |
1808 | //struct crit_entry* ce; | 1498 | int cpu, i; |
1809 | int cpu; | ||
1810 | int i; | ||
1811 | 1499 | ||
1812 | local_irq_save(flags); | 1500 | local_irq_save(flags); |
1813 | if (tinfo->cpu != -1) | 1501 | if (tinfo->cpu != -1) |
@@ -1819,10 +1507,6 @@ static void mc2_task_exit(struct task_struct *tsk) | |||
1819 | 1507 | ||
1820 | if (state->scheduled == tsk) | 1508 | if (state->scheduled == tsk) |
1821 | state->scheduled = NULL; | 1509 | state->scheduled = NULL; |
1822 | |||
1823 | //ce = &state->crit_entries[lv]; | ||
1824 | //if (ce->running == tsk) | ||
1825 | // ce->running = NULL; | ||
1826 | 1510 | ||
1827 | /* remove from queues */ | 1511 | /* remove from queues */ |
1828 | if (is_running(tsk)) { | 1512 | if (is_running(tsk)) { |
@@ -1832,37 +1516,24 @@ static void mc2_task_exit(struct task_struct *tsk) | |||
1832 | /* update both global and partitioned */ | 1516 | /* update both global and partitioned */ |
1833 | if (lv < CRIT_LEVEL_C) { | 1517 | if (lv < CRIT_LEVEL_C) { |
1834 | sup_update_time(state->sup_env, litmus_clock()); | 1518 | sup_update_time(state->sup_env, litmus_clock()); |
1835 | /* TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n");raw_spin_lock(&global_lock); | 1519 | } |
1836 | gmp_update_time(_global_env, litmus_clock()); | ||
1837 | TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n");raw_spin_unlock(&global_lock); | ||
1838 | */ } | ||
1839 | else if (lv == CRIT_LEVEL_C) { | 1520 | else if (lv == CRIT_LEVEL_C) { |
1840 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
1841 | raw_spin_lock(&global_lock); | 1521 | raw_spin_lock(&global_lock); |
1842 | gmp_update_time(_global_env, litmus_clock()); | 1522 | gmp_update_time(_global_env, litmus_clock()); |
1843 | //raw_spin_unlock(&_global_env.lock); | ||
1844 | } | 1523 | } |
1845 | /* 9/20/2015 fix | ||
1846 | mc2_update_ghost_state(state); | ||
1847 | */ | ||
1848 | task_departs(tsk, 0); | 1524 | task_departs(tsk, 0); |
1849 | if (lv == CRIT_LEVEL_C){ | 1525 | if (lv == CRIT_LEVEL_C){ |
1850 | //TRACE_CUR("LOCK_MSG: GLOBAL UNLOCK\n"); | ||
1851 | raw_spin_unlock(&global_lock); | 1526 | raw_spin_unlock(&global_lock); |
1852 | } | 1527 | } |
1853 | /* NOTE: drops state->lock */ | ||
1854 | TRACE("mc2_exit()\n"); | ||
1855 | |||
1856 | atomic_dec(&num_sync_released); | 1528 | atomic_dec(&num_sync_released); |
1857 | 1529 | ||
1530 | /* NOTE: drops state->lock */ | ||
1858 | mc2_update_timer_and_unlock(state); | 1531 | mc2_update_timer_and_unlock(state); |
1859 | } else { | 1532 | } else { |
1860 | raw_spin_unlock(&state->lock); | 1533 | raw_spin_unlock(&state->lock); |
1861 | |||
1862 | } | 1534 | } |
1863 | 1535 | ||
1864 | if (lv == CRIT_LEVEL_C) { | 1536 | if (lv == CRIT_LEVEL_C) { |
1865 | //raw_spin_lock(&global_lock); | ||
1866 | raw_spin_lock(&mode_lock); | 1537 | raw_spin_lock(&mode_lock); |
1867 | for(i = 1; i < NR_MODES; i++){ | 1538 | for(i = 1; i < NR_MODES; i++){ |
1868 | if ( !(tsk_mc2_data(tsk)->mode_mask & (1<<i)) ) | 1539 | if ( !(tsk_mc2_data(tsk)->mode_mask & (1<<i)) ) |
@@ -1871,7 +1542,6 @@ static void mc2_task_exit(struct task_struct *tsk) | |||
1871 | } | 1542 | } |
1872 | mode_sizes[0]--; | 1543 | mode_sizes[0]--; |
1873 | raw_spin_unlock(&mode_lock); | 1544 | raw_spin_unlock(&mode_lock); |
1874 | //raw_spin_unlock(&global_lock); | ||
1875 | 1545 | ||
1876 | for_each_online_cpu(cpu) { | 1546 | for_each_online_cpu(cpu) { |
1877 | state = cpu_state_for(cpu); | 1547 | state = cpu_state_for(cpu); |
@@ -1881,20 +1551,14 @@ static void mc2_task_exit(struct task_struct *tsk) | |||
1881 | 1551 | ||
1882 | if (state->scheduled == tsk) | 1552 | if (state->scheduled == tsk) |
1883 | state->scheduled = NULL; | 1553 | state->scheduled = NULL; |
1884 | 1554 | ||
1885 | //ce = &state->crit_entries[lv]; | ||
1886 | //if (ce->running == tsk) | ||
1887 | // ce->running = NULL; | ||
1888 | |||
1889 | raw_spin_unlock(&state->lock); | 1555 | raw_spin_unlock(&state->lock); |
1890 | } | 1556 | } |
1891 | } | 1557 | } |
1892 | 1558 | ||
1893 | local_irq_restore(flags); | 1559 | local_irq_restore(flags); |
1894 | 1560 | ||
1895 | if (is_mode_poll_task(tsk)){// && (tinfo->cpu == 0)) { | 1561 | if (is_mode_poll_task(tsk)) { |
1896 | //cpu_0_spin_flag = !cpu_0_spin_flag; // release other cpu before exit. | ||
1897 | //cpu_0_task_exist = false; | ||
1898 | mode_poll_exited = true; | 1562 | mode_poll_exited = true; |
1899 | } | 1563 | } |
1900 | 1564 | ||
@@ -1911,7 +1575,6 @@ static long create_polling_reservation( | |||
1911 | struct reservation_config *config) | 1575 | struct reservation_config *config) |
1912 | { | 1576 | { |
1913 | struct mc2_cpu_state *state = NULL; | 1577 | struct mc2_cpu_state *state = NULL; |
1914 | //struct reservation* res = NULL; | ||
1915 | struct polling_reservation *pres; | 1578 | struct polling_reservation *pres; |
1916 | unsigned long flags; | 1579 | unsigned long flags; |
1917 | int use_edf = config->priority == LITMUS_NO_PRIORITY; | 1580 | int use_edf = config->priority == LITMUS_NO_PRIORITY; |
@@ -1955,7 +1618,7 @@ static long create_polling_reservation( | |||
1955 | TRACE("CREATE_POLLING_RESERVATION id %d mode %d\n", config->id, config->mode); | 1618 | TRACE("CREATE_POLLING_RESERVATION id %d mode %d\n", config->id, config->mode); |
1956 | if (config->cpu != -1) { | 1619 | if (config->cpu != -1) { |
1957 | int i, is_exist = 0; | 1620 | int i, is_exist = 0; |
1958 | //raw_spin_lock_irqsave(&_global_env.lock, flags); | 1621 | |
1959 | state = cpu_state_for(config->cpu); | 1622 | state = cpu_state_for(config->cpu); |
1960 | raw_spin_lock_irqsave(&state->lock, flags); | 1623 | raw_spin_lock_irqsave(&state->lock, flags); |
1961 | 1624 | ||
@@ -2007,10 +1670,6 @@ static long create_polling_reservation( | |||
2007 | pres->res.blocked_by_ghost = 0; | 1670 | pres->res.blocked_by_ghost = 0; |
2008 | pres->res.is_ghost = NO_CPU; | 1671 | pres->res.is_ghost = NO_CPU; |
2009 | pres->res.mode = config->mode; | 1672 | pres->res.mode = config->mode; |
2010 | /*if (config->priority == LITMUS_MAX_PRIORITY) { | ||
2011 | level_a_priorities[config->cpu]++; | ||
2012 | pres->res.priority = level_a_priorities[config->cpu]; | ||
2013 | }*/ | ||
2014 | if (!use_edf) | 1673 | if (!use_edf) |
2015 | pres->res.priority = config->priority; | 1674 | pres->res.priority = config->priority; |
2016 | sup_add_new_reservation(&(state->sup_env_modes[config->mode]), &pres->res); | 1675 | sup_add_new_reservation(&(state->sup_env_modes[config->mode]), &pres->res); |
@@ -2021,7 +1680,6 @@ static long create_polling_reservation( | |||
2021 | } | 1680 | } |
2022 | 1681 | ||
2023 | raw_spin_unlock_irqrestore(&state->lock, flags); | 1682 | raw_spin_unlock_irqrestore(&state->lock, flags); |
2024 | //raw_spin_unlock_irqrestore(&_global_env.lock, flags); | ||
2025 | 1683 | ||
2026 | } else { | 1684 | } else { |
2027 | int i, is_exist = 0; | 1685 | int i, is_exist = 0; |
@@ -2062,7 +1720,6 @@ static long create_polling_reservation( | |||
2062 | pres_0->res.tsk = current; | 1720 | pres_0->res.tsk = current; |
2063 | } | 1721 | } |
2064 | 1722 | ||
2065 | |||
2066 | //force id's unique within desired mode | 1723 | //force id's unique within desired mode |
2067 | if (gmp_find_by_id(&(_global_env_modes[config->mode]), config->id)){ | 1724 | if (gmp_find_by_id(&(_global_env_modes[config->mode]), config->id)){ |
2068 | resExist = true; | 1725 | resExist = true; |
@@ -2293,18 +1950,16 @@ static void mc2_setup_domain_proc(void) | |||
2293 | 1950 | ||
2294 | static long mc2_activate_plugin(void) | 1951 | static long mc2_activate_plugin(void) |
2295 | { | 1952 | { |
2296 | int cpu;//, lv; | 1953 | int cpu; |
2297 | struct mc2_cpu_state *state; | 1954 | struct mc2_cpu_state *state; |
2298 | struct cpu_entry *ce; | 1955 | struct cpu_entry *ce; |
2299 | int i; | 1956 | int i; |
2300 | //unsigned long *cpu_counter; | ||
2301 | 1957 | ||
2302 | for(i = 0; i < NR_MODES; i++){ | 1958 | for(i = 0; i < NR_MODES; i++){ |
2303 | gmp_init(&(_global_env_modes[i])); | 1959 | gmp_init(&(_global_env_modes[i])); |
2304 | } | 1960 | } |
2305 | _global_env = &_global_env_modes[0]; | 1961 | _global_env = &_global_env_modes[0]; |
2306 | 1962 | ||
2307 | //raw_spin_lock_init(&_lowest_prio_cpu.lock); | ||
2308 | raw_spin_lock_init(&mode_lock); | 1963 | raw_spin_lock_init(&mode_lock); |
2309 | raw_spin_lock_init(&global_lock); | 1964 | raw_spin_lock_init(&global_lock); |
2310 | 1965 | ||
@@ -2314,7 +1969,6 @@ static long mc2_activate_plugin(void) | |||
2314 | TRACE("Initializing CPU%d...\n", cpu); | 1969 | TRACE("Initializing CPU%d...\n", cpu); |
2315 | 1970 | ||
2316 | resched_cpu[cpu] = 0; | 1971 | resched_cpu[cpu] = 0; |
2317 | //level_a_priorities[cpu] = 0; | ||
2318 | this_cpu_write(mode_counter, 0); | 1972 | this_cpu_write(mode_counter, 0); |
2319 | 1973 | ||
2320 | state = cpu_state_for(cpu); | 1974 | state = cpu_state_for(cpu); |
@@ -2330,11 +1984,7 @@ static long mc2_activate_plugin(void) | |||
2330 | printk(KERN_ALERT "CPU%d state->lock %p\n", cpu, &state->lock); | 1984 | printk(KERN_ALERT "CPU%d state->lock %p\n", cpu, &state->lock); |
2331 | state->cpu = cpu; | 1985 | state->cpu = cpu; |
2332 | state->scheduled = NULL; | 1986 | state->scheduled = NULL; |
2333 | //for (lv = 0; lv < NUM_CRIT_LEVELS; lv++) { | 1987 | |
2334 | // struct crit_entry *cr_entry = &state->crit_entries[lv]; | ||
2335 | // cr_entry->level = lv; | ||
2336 | // cr_entry->running = NULL; | ||
2337 | //} | ||
2338 | for(i = 0; i < NR_MODES; i++){ | 1988 | for(i = 0; i < NR_MODES; i++){ |
2339 | sup_init(&(state->sup_env_modes[i])); | 1989 | sup_init(&(state->sup_env_modes[i])); |
2340 | } | 1990 | } |
@@ -2342,7 +1992,6 @@ static long mc2_activate_plugin(void) | |||
2342 | 1992 | ||
2343 | hrtimer_init(&state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); | 1993 | hrtimer_init(&state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); |
2344 | state->timer.function = on_scheduling_timer; | 1994 | state->timer.function = on_scheduling_timer; |
2345 | //state->spin_flag = false; | ||
2346 | this_cpu_write(mode_counter, 0); | 1995 | this_cpu_write(mode_counter, 0); |
2347 | } | 1996 | } |
2348 | 1997 | ||
@@ -2357,8 +2006,6 @@ static long mc2_activate_plugin(void) | |||
2357 | mode_sizes[i] = 0; | 2006 | mode_sizes[i] = 0; |
2358 | } | 2007 | } |
2359 | res_reported = 0; | 2008 | res_reported = 0; |
2360 | //cpu_0_spin_flag = false; | ||
2361 | //cpu_0_task_exist = false; | ||
2362 | 2009 | ||
2363 | return 0; | 2010 | return 0; |
2364 | } | 2011 | } |
@@ -2436,7 +2083,6 @@ static long mc2_deactivate_plugin(void) | |||
2436 | raw_spin_unlock(&state->lock); | 2083 | raw_spin_unlock(&state->lock); |
2437 | } | 2084 | } |
2438 | 2085 | ||
2439 | //TRACE_CUR("LOCK_MSG: GLOBAL LOCK\n"); | ||
2440 | raw_spin_lock(&global_lock); | 2086 | raw_spin_lock(&global_lock); |
2441 | for(i = 0; i < NR_MODES; i++){ | 2087 | for(i = 0; i < NR_MODES; i++){ |
2442 | _global_env = &_global_env_modes[i]; | 2088 | _global_env = &_global_env_modes[i]; |