diff options
| author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2011-02-10 18:41:38 -0500 |
|---|---|---|
| committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2011-08-27 12:00:35 -0400 |
| commit | b751e4e17e667f11404fc2f290416c0df050e964 (patch) | |
| tree | 87def1848a42a8c8eca8c9fd624a7fc73a4fdafc | |
| parent | 17e34f413750b26aa493f1f8307f111bc5d487de (diff) | |
C-EDF: add release master support
As with GSN-EDF, do not insert release master into CPU heap.
| -rw-r--r-- | litmus/sched_cedf.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index e29a9fe2a8e8..0707059597d6 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
| @@ -411,6 +411,14 @@ static struct task_struct* cedf_schedule(struct task_struct * prev) | |||
| 411 | int out_of_time, sleep, preempt, np, exists, blocks; | 411 | int out_of_time, sleep, preempt, np, exists, blocks; |
| 412 | struct task_struct* next = NULL; | 412 | struct task_struct* next = NULL; |
| 413 | 413 | ||
| 414 | #ifdef CONFIG_RELEASE_MASTER | ||
| 415 | /* Bail out early if we are the release master. | ||
| 416 | * The release master never schedules any real-time tasks. | ||
| 417 | */ | ||
| 418 | if (cluster->domain.release_master == entry->cpu) | ||
| 419 | return NULL; | ||
| 420 | #endif | ||
| 421 | |||
| 414 | raw_spin_lock(&cluster->lock); | 422 | raw_spin_lock(&cluster->lock); |
| 415 | clear_will_schedule(); | 423 | clear_will_schedule(); |
| 416 | 424 | ||
| @@ -546,8 +554,18 @@ static void cedf_task_new(struct task_struct * t, int on_rq, int running) | |||
| 546 | entry = &per_cpu(cedf_cpu_entries, task_cpu(t)); | 554 | entry = &per_cpu(cedf_cpu_entries, task_cpu(t)); |
| 547 | BUG_ON(entry->scheduled); | 555 | BUG_ON(entry->scheduled); |
| 548 | 556 | ||
| 549 | entry->scheduled = t; | 557 | #ifdef CONFIG_RELEASE_MASTER |
| 550 | tsk_rt(t)->scheduled_on = task_cpu(t); | 558 | if (entry->cpu != cluster->domain.release_master) { |
| 559 | #endif | ||
| 560 | entry->scheduled = t; | ||
| 561 | tsk_rt(t)->scheduled_on = task_cpu(t); | ||
| 562 | #ifdef CONFIG_RELEASE_MASTER | ||
| 563 | } else { | ||
| 564 | /* do not schedule on release master */ | ||
| 565 | preempt(entry); /* force resched */ | ||
| 566 | tsk_rt(t)->scheduled_on = NO_CPU; | ||
| 567 | } | ||
| 568 | #endif | ||
| 551 | } else { | 569 | } else { |
| 552 | t->rt_param.scheduled_on = NO_CPU; | 570 | t->rt_param.scheduled_on = NO_CPU; |
| 553 | } | 571 | } |
| @@ -731,6 +749,9 @@ static long cedf_activate_plugin(void) | |||
| 731 | 749 | ||
| 732 | if(!zalloc_cpumask_var(&cedf[i].cpu_map, GFP_ATOMIC)) | 750 | if(!zalloc_cpumask_var(&cedf[i].cpu_map, GFP_ATOMIC)) |
| 733 | return -ENOMEM; | 751 | return -ENOMEM; |
| 752 | #ifdef CONFIG_RELEASE_MASTER | ||
| 753 | cedf[i].domain.release_master = atomic_read(&release_master_cpu); | ||
| 754 | #endif | ||
| 734 | } | 755 | } |
| 735 | 756 | ||
| 736 | /* cycle through cluster and add cpus to them */ | 757 | /* cycle through cluster and add cpus to them */ |
| @@ -773,7 +794,11 @@ static long cedf_activate_plugin(void) | |||
| 773 | 794 | ||
| 774 | entry->linked = NULL; | 795 | entry->linked = NULL; |
| 775 | entry->scheduled = NULL; | 796 | entry->scheduled = NULL; |
| 776 | update_cpu_position(entry); | 797 | #ifdef CONFIG_RELEASE_MASTER |
| 798 | /* only add CPUs that should schedule jobs */ | ||
| 799 | if (entry->cpu != entry->cluster->domain.release_master) | ||
| 800 | #endif | ||
| 801 | update_cpu_position(entry); | ||
| 777 | } | 802 | } |
| 778 | /* done with this cluster */ | 803 | /* done with this cluster */ |
| 779 | break; | 804 | break; |
