diff options
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/sched_edf_os.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/litmus/sched_edf_os.c b/litmus/sched_edf_os.c index dac2f0e8ca3b..e021d22b5129 100644 --- a/litmus/sched_edf_os.c +++ b/litmus/sched_edf_os.c | |||
@@ -350,7 +350,6 @@ static void change_migrat_cpu_if_needed(struct task_struct *t) | |||
350 | * and the next release | 350 | * and the next release |
351 | */ | 351 | */ |
352 | cpu = next_cpu_for_job(t); | 352 | cpu = next_cpu_for_job(t); |
353 | BUG(); | ||
354 | if (unlikely(cpu != get_partition(t))) { | 353 | if (unlikely(cpu != get_partition(t))) { |
355 | tsk_rt(t)->task_params.cpu = cpu; | 354 | tsk_rt(t)->task_params.cpu = cpu; |
356 | TRACE_TASK(t, "EDF-os: will migrate job %d -> %d\n", | 355 | TRACE_TASK(t, "EDF-os: will migrate job %d -> %d\n", |
@@ -484,27 +483,36 @@ static void edfos_task_new(struct task_struct * t, int on_rq, int running) | |||
484 | edfos_domain_t* edfos = task_edfos(t); | 483 | edfos_domain_t* edfos = task_edfos(t); |
485 | unsigned long flags; | 484 | unsigned long flags; |
486 | unsigned int i; | 485 | unsigned int i; |
487 | unsigned int has_cpu = 0; | ||
488 | 486 | ||
489 | if (edfos_params(t).migrat) { | 487 | if (edfos_params(t).migrat) { |
490 | bheap_init(&edfos_params(t).release_queue); | 488 | bheap_init(&edfos_params(t).release_queue); |
491 | bheap_init(&edfos_params(t).ready_queue); | 489 | bheap_init(&edfos_params(t).ready_queue); |
492 | for (i = 0; i < NR_CPUS_EDF_OS; i++) { | 490 | for (i = 0; i < NR_CPUS_EDF_OS; i++) { |
493 | if (edfos_params(t).fraction[i][0] > 0) { | 491 | if (i == t->rt_param.task_params.cpu) { |
494 | has_cpu = 1; | 492 | /* Initial CPU - setup next release. */ |
493 | edfos_params(t).heap_data[i] = | ||
494 | compute_pfair_release( | ||
495 | edfos_params(t).fraction[i][0], | ||
496 | edfos_params(t).fraction[i][1], 2); | ||
497 | bheap_add(fakepfair_ready_order, | ||
498 | &edfos_params(t).release_queue, | ||
499 | &edfos_params(t).heap_data[i], | ||
500 | GFP_ATOMIC); | ||
501 | } | ||
502 | else if (edfos_params(t).fraction[i][0] > 0) { | ||
503 | /* Non-initial CPU - already released, setup | ||
504 | * deadline. | ||
505 | */ | ||
495 | edfos_params(t).heap_data[i] = | 506 | edfos_params(t).heap_data[i] = |
496 | compute_pfair_deadline( | 507 | compute_pfair_deadline( |
497 | edfos_params(t).fraction[i][0], | 508 | edfos_params(t).fraction[i][0], |
498 | edfos_params(t).fraction[i][1], 0); | 509 | edfos_params(t).fraction[i][1], 1); |
499 | bheap_add(fakepfair_ready_order, | 510 | bheap_add(fakepfair_ready_order, |
500 | &edfos_params(t).ready_queue, | 511 | &edfos_params(t).ready_queue, |
501 | &edfos_params(t).heap_data[i], | 512 | &edfos_params(t).heap_data[i], |
502 | GFP_ATOMIC); | 513 | GFP_ATOMIC); |
503 | } | 514 | } |
504 | } | 515 | } |
505 | BUG_ON(!has_cpu); | ||
506 | /* Pick the first CPU to execute on. */ | ||
507 | change_migrat_cpu_if_needed(t); | ||
508 | } | 516 | } |
509 | 517 | ||
510 | TRACE_TASK(t, "EDF-os: task new, cpu = %d\n", | 518 | TRACE_TASK(t, "EDF-os: task new, cpu = %d\n", |