diff options
Diffstat (limited to 'litmus/rt_domain.c')
| -rw-r--r-- | litmus/rt_domain.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/litmus/rt_domain.c b/litmus/rt_domain.c index 09123eeadf2c..5264d2546a7f 100644 --- a/litmus/rt_domain.c +++ b/litmus/rt_domain.c | |||
| @@ -254,7 +254,7 @@ static void setup_release(rt_domain_t *_rt) | |||
| 254 | list_for_each_safe(pos, safe, &list) { | 254 | list_for_each_safe(pos, safe, &list) { |
| 255 | /* pick task of work list */ | 255 | /* pick task of work list */ |
| 256 | t = list_entry(pos, struct task_struct, rt_param.list); | 256 | t = list_entry(pos, struct task_struct, rt_param.list); |
| 257 | sched_trace_task_release(t); | 257 | /* sched_trace_task_release(t); */ |
| 258 | list_del_init(pos); | 258 | list_del_init(pos); |
| 259 | 259 | ||
| 260 | /* put into release heap while holding release_lock */ | 260 | /* put into release heap while holding release_lock */ |
| @@ -410,14 +410,21 @@ static void pd_requeue(domain_t *dom, struct task_struct *task) | |||
| 410 | BUG_ON(is_queued(task)); | 410 | BUG_ON(is_queued(task)); |
| 411 | BUG_ON(get_task_domain(task) != dom); | 411 | BUG_ON(get_task_domain(task) != dom); |
| 412 | 412 | ||
| 413 | if (is_queued(task)) { | ||
| 414 | VTRACE_TASK(task, "Queued, skipping\n"); | ||
| 415 | return; | ||
| 416 | } | ||
| 417 | |||
| 413 | if (is_released(task, litmus_clock())) { | 418 | if (is_released(task, litmus_clock())) { |
| 414 | __add_ready(domain, task); | 419 | __add_ready(domain, task); |
| 415 | VTRACE("rt: adding %s/%d (%llu, %llu) rel=%llu to ready queue at %llu\n", | 420 | /* tsk_rt(task)->go = 1; */ |
| 421 | VTRACE("going, rt: adding %s/%d (%llu, %llu) rel=%llu to ready queue at %llu\n", | ||
| 416 | task->comm, task->pid, get_exec_cost(task), get_rt_period(task), | 422 | task->comm, task->pid, get_exec_cost(task), get_rt_period(task), |
| 417 | get_release(task), litmus_clock()); | 423 | get_release(task), litmus_clock()); |
| 418 | } else { | 424 | } else { |
| 419 | /* task has to wait for next release */ | 425 | /* task has to wait for next release */ |
| 420 | VTRACE_TASK(task, "add release(), rel=%llu\n", get_release(task)); | 426 | VTRACE_TASK(task, "not going, add release(), rel=%llu\n", get_release(task)); |
| 427 | /* tsk_rt(task)->go = 0; */ | ||
| 421 | add_release(domain, task); | 428 | add_release(domain, task); |
| 422 | } | 429 | } |
| 423 | 430 | ||
| @@ -429,7 +436,12 @@ static void pd_requeue(domain_t *dom, struct task_struct *task) | |||
| 429 | */ | 436 | */ |
| 430 | static struct task_struct* pd_take_ready(domain_t *dom) | 437 | static struct task_struct* pd_take_ready(domain_t *dom) |
| 431 | { | 438 | { |
| 432 | return __take_ready((rt_domain_t*)dom->data); | 439 | struct task_struct *t = __take_ready((rt_domain_t*)dom->data); |
| 440 | if (t) { | ||
| 441 | /* TRACE_TASK(t, "going\n"); */ | ||
| 442 | /* tsk_rt(t)->go = 1; */ | ||
| 443 | } | ||
| 444 | return t; | ||
| 433 | } | 445 | } |
| 434 | 446 | ||
| 435 | /* pd_peek_ready - returns the head of the rt_domain ready queue | 447 | /* pd_peek_ready - returns the head of the rt_domain ready queue |
| @@ -438,14 +450,23 @@ static struct task_struct* pd_take_ready(domain_t *dom) | |||
| 438 | */ | 450 | */ |
| 439 | static struct task_struct* pd_peek_ready(domain_t *dom) | 451 | static struct task_struct* pd_peek_ready(domain_t *dom) |
| 440 | { | 452 | { |
| 441 | return __next_ready((rt_domain_t*)dom->data); | 453 | struct task_struct *t = __peek_ready((rt_domain_t*)dom->data); |
| 454 | /* if (t) { */ | ||
| 455 | /* TRACE_TASK(t, "going\n"); */ | ||
| 456 | /* tsk_rt(t)->go = 1; */ | ||
| 457 | /* } */ | ||
| 458 | return t; | ||
| 442 | } | 459 | } |
| 443 | 460 | ||
| 444 | static void pd_remove(domain_t *dom, struct task_struct *task) | 461 | static void pd_remove(domain_t *dom, struct task_struct *task) |
| 445 | { | 462 | { |
| 446 | if (is_queued(task)) { | 463 | if (is_queued(task)) |
| 447 | remove((rt_domain_t*)dom->data, task); | 464 | remove((rt_domain_t*)dom->data, task); |
| 448 | } | 465 | /* if (is_queued(task) && tsk_rt(task)->go) { */ |
| 466 | /* remove((rt_domain_t*)dom->data, task); */ | ||
| 467 | /* } else if (is_queued(task)) { */ | ||
| 468 | /* VTRACE_TASK(task, "Did not remove cause of nogo\n"); */ | ||
| 469 | /* } */ | ||
| 449 | } | 470 | } |
| 450 | 471 | ||
| 451 | /* pd_domain_init - create a generic domain wrapper for an rt_domain | 472 | /* pd_domain_init - create a generic domain wrapper for an rt_domain |
