Messages in this thread Patch in this message | | | From | Arseniy Krasnov <> | Subject | [PATCH 03/13] hperf_hmp: add sched domains initialization. | Date | Fri, 06 Nov 2015 15:02:37 +0300 |
| |
Attaching CPU clusters as 'sched_group' to HMP domains. Each HMP domain has two pointers to A15 and A7 scheduling groups(struct sched_group).
Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com> Signed-off-by: Sergey Dyasly <s.dyasly@samsung.com> Signed-off-by: Dmitriy Safonov <d.safonov@partner.samsung.com> Signed-off-by: Arseniy Krasnov <a.krasnov@samsung.com> Signed-off-by: Ilya Maximets <i.maximets@samsung.com> --- include/linux/sched.h | 4 ++++ kernel/sched/core.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+)
diff --git a/include/linux/sched.h b/include/linux/sched.h index eb084df..aa72125 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1057,6 +1057,10 @@ struct sched_domain { u64 max_newidle_lb_cost; unsigned long next_decay_max_lb_cost; +#ifdef CONFIG_HPERF_HMP + struct sched_group *a15_group; + struct sched_group *a7_group; +#endif #ifdef CONFIG_SCHEDSTATS /* load_balance() stats */ unsigned int lb_count[CPU_MAX_IDLE_TYPES]; diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 16092e0..e3a632f 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -90,6 +90,16 @@ #define CREATE_TRACE_POINTS #include <trace/events/sched.h> +#ifdef CONFIG_HPERF_HMP +/* cpumask for A15 cpus */ +static DECLARE_BITMAP(cpu_fastest_bits, CONFIG_NR_CPUS); +struct cpumask *cpu_fastest_mask = to_cpumask(cpu_fastest_bits); + +/* cpumask for A7 cpus */ +static DECLARE_BITMAP(cpu_slowest_bits, CONFIG_NR_CPUS); +struct cpumask *cpu_slowest_mask = to_cpumask(cpu_slowest_bits); +#endif + DEFINE_MUTEX(sched_domains_mutex); DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); @@ -6971,6 +6981,45 @@ static int build_sched_domains(const struct cpumask *cpu_map, sd = *per_cpu_ptr(d.sd, i); cpu_attach_domain(sd, d.rd, i); } + +#ifdef CONFIG_HPERF_HMP + for (i = nr_cpumask_bits - 1; i >= 0; i--) { + if (!cpumask_test_cpu(i, cpu_map)) + continue; + + for (sd = *per_cpu_ptr(d.sd, i); sd; sd = sd->parent) { + struct sched_group *sg; + sd->a7_group = NULL; + sd->a15_group = NULL; + + /* Process only HMP domains */ + if (!(sd->flags & SD_HMP_BALANCE)) + continue; + + /* + * Process sched groups of this domain. + * Attach sg to hmp domains. + */ + sg = sd->groups; + do { + if (!sg->sgc) + goto next_sg; +#ifdef CONFIG_SCHED_DEBUG + printk(KERN_EMERG "Attaching CPUs 0x%08lX to domain %s\n", + sched_group_cpus(sg)->bits[0], sd->name); +#endif + if (cpumask_intersects(sched_group_cpus(sg), + cpu_fastest_mask)) + sd->a15_group = sg; + else + sd->a7_group = sg; +next_sg: + sg = sg->next; + } while (sg != sd->groups); + } + } +#endif /* CONFIG_HPERF_HMP */ + rcu_read_unlock(); ret = 0; -- 1.9.1
| |