aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/sched_color.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/sched_color.c')
-rw-r--r--litmus/sched_color.c33
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 */
279static void job_arrival(struct task_struct *t) 279static 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
563static void color_task_new(struct task_struct *t, int on_rq, int running) 549static 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);