diff options
-rw-r--r-- | litmus/sched_pfair.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/litmus/sched_pfair.c b/litmus/sched_pfair.c index 0a64273daa47..43119e5149fa 100644 --- a/litmus/sched_pfair.c +++ b/litmus/sched_pfair.c | |||
@@ -445,6 +445,11 @@ static void schedule_subtasks(struct pfair_cluster *cluster, quanta_t time) | |||
445 | list_for_each(pos, &cluster->topology.cpus) { | 445 | list_for_each(pos, &cluster->topology.cpus) { |
446 | cpu_state = from_cluster_list(pos); | 446 | cpu_state = from_cluster_list(pos); |
447 | retry = 1; | 447 | retry = 1; |
448 | #ifdef CONFIG_RELEASE_MASTER | ||
449 | /* skip release master */ | ||
450 | if (cluster->pfair.release_master == cpu_id(cpu_state)) | ||
451 | continue; | ||
452 | #endif | ||
448 | while (retry) { | 453 | while (retry) { |
449 | if (pfair_higher_prio(__peek_ready(&cluster->pfair), | 454 | if (pfair_higher_prio(__peek_ready(&cluster->pfair), |
450 | cpu_state->linked)) | 455 | cpu_state->linked)) |
@@ -615,6 +620,14 @@ static struct task_struct* pfair_schedule(struct task_struct * prev) | |||
615 | int blocks; | 620 | int blocks; |
616 | struct task_struct* next = NULL; | 621 | struct task_struct* next = NULL; |
617 | 622 | ||
623 | #ifdef CONFIG_RELEASE_MASTER | ||
624 | /* Bail out early if we are the release master. | ||
625 | * The release master never schedules any real-time tasks. | ||
626 | */ | ||
627 | if (cpu_cluster(state)->pfair.release_master == cpu_id(state)) | ||
628 | return NULL; | ||
629 | #endif | ||
630 | |||
618 | raw_spin_lock(cpu_lock(state)); | 631 | raw_spin_lock(cpu_lock(state)); |
619 | 632 | ||
620 | blocks = is_realtime(prev) && !is_running(prev); | 633 | blocks = is_realtime(prev) && !is_running(prev); |
@@ -649,10 +662,16 @@ static void pfair_task_new(struct task_struct * t, int on_rq, int running) | |||
649 | cluster = tsk_pfair(t)->cluster; | 662 | cluster = tsk_pfair(t)->cluster; |
650 | 663 | ||
651 | raw_spin_lock_irqsave(cluster_lock(cluster), flags); | 664 | raw_spin_lock_irqsave(cluster_lock(cluster), flags); |
652 | if (running) | 665 | |
666 | if (running | ||
667 | #ifdef CONFIG_RELEASE_MASTER | ||
668 | && (task_cpu(t) != cluster->pfair.release_master) | ||
669 | #endif | ||
670 | ) { | ||
653 | t->rt_param.scheduled_on = task_cpu(t); | 671 | t->rt_param.scheduled_on = task_cpu(t); |
654 | else | 672 | } else { |
655 | t->rt_param.scheduled_on = NO_CPU; | 673 | t->rt_param.scheduled_on = NO_CPU; |
674 | } | ||
656 | 675 | ||
657 | prepare_release(t, cluster->pfair_time + 1); | 676 | prepare_release(t, cluster->pfair_time + 1); |
658 | pfair_add_release(cluster, t); | 677 | pfair_add_release(cluster, t); |
@@ -936,6 +955,9 @@ static long pfair_activate_plugin(void) | |||
936 | pfair_init_cluster(cluster); | 955 | pfair_init_cluster(cluster); |
937 | cluster->pfair_time = now; | 956 | cluster->pfair_time = now; |
938 | clust[i] = &cluster->topology; | 957 | clust[i] = &cluster->topology; |
958 | #ifdef CONFIG_RELEASE_MASTER | ||
959 | cluster->pfair.release_master = atomic_read(&release_master_cpu); | ||
960 | #endif | ||
939 | } | 961 | } |
940 | 962 | ||
941 | for (i = 0; i < num_online_cpus(); i++) { | 963 | for (i = 0; i < num_online_cpus(); i++) { |