diff options
Diffstat (limited to 'litmus/sched_mc.c')
-rw-r--r-- | litmus/sched_mc.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c index 17f84c9eba79..e20e97810847 100644 --- a/litmus/sched_mc.c +++ b/litmus/sched_mc.c | |||
@@ -27,8 +27,6 @@ | |||
27 | #include <litmus/sched_mc.h> | 27 | #include <litmus/sched_mc.h> |
28 | #include <litmus/ce_domain.h> | 28 | #include <litmus/ce_domain.h> |
29 | 29 | ||
30 | /* XXX TODO Do we ever want to move level-A timers? */ | ||
31 | |||
32 | /** | 30 | /** |
33 | * struct cpu_entry - State of a CPU for the entire MC system | 31 | * struct cpu_entry - State of a CPU for the entire MC system |
34 | * @cpu CPU id | 32 | * @cpu CPU id |
@@ -50,6 +48,9 @@ struct cpu_entry { | |||
50 | struct list_head redir; | 48 | struct list_head redir; |
51 | raw_spinlock_t redir_lock; | 49 | raw_spinlock_t redir_lock; |
52 | #endif | 50 | #endif |
51 | #ifdef CONFIG_MERGE_TIMERS | ||
52 | struct event_group *event_group; | ||
53 | #endif | ||
53 | }; | 54 | }; |
54 | 55 | ||
55 | DEFINE_PER_CPU(struct cpu_entry, cpus); | 56 | DEFINE_PER_CPU(struct cpu_entry, cpus); |
@@ -141,7 +142,7 @@ static inline void cancel_ghost(struct crit_entry *ce) | |||
141 | static inline void arm_ghost(struct crit_entry *ce, lt_t fire) | 142 | static inline void arm_ghost(struct crit_entry *ce, lt_t fire) |
142 | { | 143 | { |
143 | #ifdef CONFIG_MERGE_TIMERS | 144 | #ifdef CONFIG_MERGE_TIMERS |
144 | add_event(get_event_group_for(crit_cpu(ce)->cpu), &ce->event, fire); | 145 | add_event(crit_cpu(ce)->event_group, &ce->event, fire); |
145 | #else | 146 | #else |
146 | __hrtimer_start_range_ns(&ce->timer, | 147 | __hrtimer_start_range_ns(&ce->timer, |
147 | ns_to_ktime(fire), | 148 | ns_to_ktime(fire), |
@@ -298,7 +299,7 @@ static void fix_global_levels(void) | |||
298 | struct list_head *pos, *safe; | 299 | struct list_head *pos, *safe; |
299 | struct task_struct *t; | 300 | struct task_struct *t; |
300 | 301 | ||
301 | STRACE("Fixing global levels"); | 302 | STRACE("Fixing global levels\n"); |
302 | for_each_online_cpu(c) { | 303 | for_each_online_cpu(c) { |
303 | e = &per_cpu(cpus, c); | 304 | e = &per_cpu(cpus, c); |
304 | raw_spin_lock(&e->redir_lock); | 305 | raw_spin_lock(&e->redir_lock); |
@@ -621,13 +622,12 @@ static void ce_timer_function(struct rt_event *e) | |||
621 | { | 622 | { |
622 | struct ce_dom_data *ce_data = | 623 | struct ce_dom_data *ce_data = |
623 | container_of(e, struct ce_dom_data, event); | 624 | container_of(e, struct ce_dom_data, event); |
624 | struct event_group *event_group = get_event_group_for(ce_data->cpu); | ||
625 | unsigned long flags; | 625 | unsigned long flags; |
626 | lt_t next_timer_abs; | 626 | lt_t next_timer_abs; |
627 | 627 | ||
628 | local_irq_save(flags); | 628 | local_irq_save(flags); |
629 | next_timer_abs = __ce_timer_function(ce_data); | 629 | next_timer_abs = __ce_timer_function(ce_data); |
630 | add_event(event_group, e, next_timer_abs); | 630 | add_event(per_cpu(cpus, ce_data->cpu).event_group, e, next_timer_abs); |
631 | local_irq_restore(flags); | 631 | local_irq_restore(flags); |
632 | } | 632 | } |
633 | #else /* else to CONFIG_MERGE_TIMERS */ | 633 | #else /* else to CONFIG_MERGE_TIMERS */ |
@@ -945,13 +945,13 @@ static long mc_activate_plugin(void) | |||
945 | struct domain_data *dom_data; | 945 | struct domain_data *dom_data; |
946 | struct domain *dom; | 946 | struct domain *dom; |
947 | struct domain_data *our_domains[NR_CPUS]; | 947 | struct domain_data *our_domains[NR_CPUS]; |
948 | struct event_group *event_group; | ||
948 | int cpu, n = 0; | 949 | int cpu, n = 0; |
949 | long ret; | 950 | long ret; |
950 | 951 | ||
951 | #ifdef CONFIG_RELEASE_MASTER | 952 | #ifdef CONFIG_RELEASE_MASTER |
952 | interrupt_cpu = atomic_read(&release_master_cpu); | 953 | interrupt_cpu = atomic_read(&release_master_cpu); |
953 | #if defined(CONFIG_PLUGIN_MC_REDIRECT) || \ | 954 | #if defined(CONFIG_PLUGIN_MC_REDIRECT) || defined(CONFIG_PLUGIN_MC_RELEASE_MASTER) |
954 | (defined(CONFIG_PLUGIN_MC_RELEASE_MASTER) && defined(CONFIG_MERGE_TIMERS)) | ||
955 | if (NO_CPU == interrupt_cpu) { | 955 | if (NO_CPU == interrupt_cpu) { |
956 | printk(KERN_ERR "LITMUS-MC: need a release master\n"); | 956 | printk(KERN_ERR "LITMUS-MC: need a release master\n"); |
957 | ret = -EINVAL; | 957 | ret = -EINVAL; |
@@ -965,6 +965,12 @@ static long mc_activate_plugin(void) | |||
965 | dom = per_cpu(cpus, cpu).crit_entries[CRIT_LEVEL_A].domain; | 965 | dom = per_cpu(cpus, cpu).crit_entries[CRIT_LEVEL_A].domain; |
966 | dom_data = domain_data(dom); | 966 | dom_data = domain_data(dom); |
967 | our_domains[cpu] = dom_data; | 967 | our_domains[cpu] = dom_data; |
968 | #if defined(CONFIG_MERGE_TIMERS) && defined(CONFIG_PLUGIN_MC_RELEASE_MASTER) | ||
969 | event_group = get_event_group_for(interrupt_cpu); | ||
970 | #elif defined(CONFIG_MERGE_TIMERS) && !defined(CONFIG_PLUGIN_MC_RELEASE_MASTER) | ||
971 | event_group = get_event_group_for(cpu); | ||
972 | #endif | ||
973 | per_cpu(cpus, cpu).event_group = event_group; | ||
968 | n++; | 974 | n++; |
969 | } | 975 | } |
970 | ret = mc_ce_set_domains(n, our_domains); | 976 | ret = mc_ce_set_domains(n, our_domains); |