diff options
Diffstat (limited to 'litmus/sched_color.c')
-rw-r--r-- | litmus/sched_color.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/litmus/sched_color.c b/litmus/sched_color.c index 44327d60aaa5..66ce40fd1b57 100644 --- a/litmus/sched_color.c +++ b/litmus/sched_color.c | |||
@@ -278,21 +278,7 @@ static void check_for_fifo_preempt(void) | |||
278 | */ | 278 | */ |
279 | static void job_arrival(struct task_struct *t) | 279 | static void job_arrival(struct task_struct *t) |
280 | { | 280 | { |
281 | int i; | ||
282 | rt_domain_t *dom = task_dom(task_entry(t), t); | 281 | rt_domain_t *dom = task_dom(task_entry(t), t); |
283 | struct dgl_group_req *gr = tsk_rt(t)->req; | ||
284 | struct control_page *cp = tsk_rt(t)->ctrl_page; | ||
285 | struct color_ctrl_page *ccp = tsk_rt(t)->color_ctrl_page; | ||
286 | |||
287 | /* Fill request */ | ||
288 | if (cp && ccp && cp->colors_updated) { | ||
289 | cp->colors_updated = 0; | ||
290 | dgl_group_req_init(&group_lock, gr); | ||
291 | for (i = 0; ccp->pages[i]; ++i) | ||
292 | set_req(&group_lock, gr, ccp->colors[i], ccp->pages[i]); | ||
293 | } else { | ||
294 | TRACE("Oh noz: %p %p %d\n", cp, ccp, ((cp) ? cp->colors_updated : -1)); | ||
295 | } | ||
296 | 282 | ||
297 | lock_if(&fifo_lock, is_be(t)); | 283 | lock_if(&fifo_lock, is_be(t)); |
298 | requeue(dom, t); | 284 | requeue(dom, t); |
@@ -519,12 +505,12 @@ static struct task_struct* color_schedule(struct task_struct *prev) | |||
519 | acquire_resources(next); | 505 | acquire_resources(next); |
520 | if (has_resources(next, entry->server.cpu)) { | 506 | if (has_resources(next, entry->server.cpu)) { |
521 | TRACE_TASK(next, "Has group lock\n"); | 507 | TRACE_TASK(next, "Has group lock\n"); |
522 | sched_trace_task_resume(next, 1); | 508 | sched_trace_task_resume_on(next, 1); |
523 | } else { | 509 | } else { |
524 | TRACE_TASK(next, "Does not have lock, 0x%p does\n", | 510 | TRACE_TASK(next, "Does not have lock, 0x%p does\n", |
525 | group_lock.acquired[entry->server.cpu]); | 511 | group_lock.acquired[entry->server.cpu]); |
526 | if (next != prev) | 512 | if (next != prev) |
527 | sched_trace_task_block(next, 1); | 513 | sched_trace_task_block_on(next, 1); |
528 | next = NULL; | 514 | next = NULL; |
529 | server_running = 0; | 515 | server_running = 0; |
530 | } | 516 | } |
@@ -562,9 +548,13 @@ static struct task_struct* color_schedule(struct task_struct *prev) | |||
562 | 548 | ||
563 | static void color_task_new(struct task_struct *t, int on_rq, int running) | 549 | static void color_task_new(struct task_struct *t, int on_rq, int running) |
564 | { | 550 | { |
551 | int i; | ||
565 | unsigned long flags; | 552 | unsigned long flags; |
566 | struct cpu_entry *entry; | 553 | struct cpu_entry *entry; |
567 | struct dgl_group_req *req; | 554 | struct dgl_group_req *req; |
555 | struct control_page *cp = tsk_rt(t)->ctrl_page; | ||
556 | struct color_ctrl_page *ccp = tsk_rt(t)->color_ctrl_page; | ||
557 | |||
568 | 558 | ||
569 | TRACE_TASK(t, "New colored task\n"); | 559 | TRACE_TASK(t, "New colored task\n"); |
570 | entry = (is_be(t)) ? local_entry : task_entry(t); | 560 | entry = (is_be(t)) ? local_entry : task_entry(t); |
@@ -583,6 +573,17 @@ static void color_task_new(struct task_struct *t, int on_rq, int running) | |||
583 | 573 | ||
584 | release_at(t, litmus_clock()); | 574 | release_at(t, litmus_clock()); |
585 | 575 | ||
576 | /* Fill request */ | ||
577 | if (cp && ccp && cp->colors_updated) { | ||
578 | TRACE_TASK(t, "Initializing group request\n"); | ||
579 | cp->colors_updated = 0; | ||
580 | dgl_group_req_init(&group_lock, req); | ||
581 | for (i = 0; ccp->pages[i]; ++i) | ||
582 | set_req(&group_lock, req, ccp->colors[i], ccp->pages[i]); | ||
583 | } else { | ||
584 | TRACE("Oh noz: %p %p %d\n", cp, ccp, ((cp) ? cp->colors_updated : -1)); | ||
585 | } | ||
586 | |||
586 | if (running) { | 587 | if (running) { |
587 | /* No need to lock with irqs disabled */ | 588 | /* No need to lock with irqs disabled */ |
588 | TRACE_TASK(t, "Already scheduled on %d\n", entry->server.cpu); | 589 | TRACE_TASK(t, "Already scheduled on %d\n", entry->server.cpu); |