actually cc'ing them this time. :) On Fri, Jul 20, 2012 at 12:11 PM, Jon Medhurst (Tixy) <t...@linaro.org> wrote: > Oops, I forgot to CC Viresh and Vincent on this, so resending... > --- > > We can't rely on Kconfig options to set the fast and slow CPU lists for > HMP scheduling if we want a single kernel binary to support multiple > devices with different CPU topology. E.g. ARM's TC2, Fast Models, or > even non big.LITTLE devices. > > This patch adds the function arch_get_fast_and_slow_cpus() to generate > the lists at run-time by parsing the CPU nodes in device-tree; it > assumes slow cores are A7s and everything else is fast. The function > still supports the old Kconfig options as this is useful for testing the > HMP scheduler on devices without big.LITTLE. > > Signed-off-by: Jon Medhurst <t...@linaro.org> > --- > > The reason I'm pushing this patch is that I want to use it for this > month's Linaro vexpress release to help with the goal of having a single > build which will work on all CoreTiles (and possibly Fast Models). > > > arch/arm/kernel/topology.c | 69 > ++++++++++++++++++++++++++++++++++++++++++++ > kernel/sched/fair.c | 18 ++++-------- > 2 files changed, 75 insertions(+), 12 deletions(-) > > diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c > index f59193c..61302df 100644 > --- a/arch/arm/kernel/topology.c > +++ b/arch/arm/kernel/topology.c > @@ -287,6 +287,75 @@ void store_cpu_topology(unsigned int cpuid) > cpu_topology[cpuid].socket_id, mpidr); > } > > + > +#ifdef CONFIG_SCHED_HMP > + > +static const char * const little_cores[] = { > + "arm,cortex-a7", > + NULL, > +}; > + > +static bool is_little_cpu(struct device_node *cn) > +{ > + const char * const *lc; > + for (lc = little_cores; *lc; lc++) > + if (of_device_is_compatible(cn, *lc)) > + return true; > + return false; > +} > + > +void __init arch_get_fast_and_slow_cpus(struct cpumask *fast, > + struct cpumask *slow) > +{ > + struct device_node *cn = NULL; > + int cpu = 0; > + > + cpumask_clear(fast); > + cpumask_clear(slow); > + > + /* > + * Use the config options if they are given. This helps testing > + * HMP scheduling on systems without a big.LITTLE architecture. > + */ > + if (strlen(CONFIG_HMP_FAST_CPU_MASK) && > strlen(CONFIG_HMP_SLOW_CPU_MASK)) { > + if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, fast)) > + WARN(1, "Failed to parse HMP fast cpu mask!\n"); > + if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, slow)) > + WARN(1, "Failed to parse HMP slow cpu mask!\n"); > + return; > + } > + > + /* > + * Else, parse device tree for little cores. > + */ > + while ((cn = of_find_node_by_type(cn, "cpu"))) { > + > + if (cpu >= num_possible_cpus()) > + break; > + > + if (is_little_cpu(cn)) > + cpumask_set_cpu(cpu, slow); > + else > + cpumask_set_cpu(cpu, fast); > + > + cpu++; > + } > + > + if (!cpumask_empty(fast) && !cpumask_empty(slow)) > + return; > + > + /* > + * We didn't find both big and little cores so let's call all cores > + * fast as this will keep the system running, with all cores being > + * treated equal. > + */ > + cpumask_setall(fast); > + cpumask_clear(slow); > +} > + > +#endif /* CONFIG_SCHED_HMP */ > + > + > /* > * init_cpu_topology is called at boot when only one cpu is running > * which prevent simultaneous write access to cpu_topology array > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index f705a87..e056361 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -3084,25 +3084,19 @@ done: > > #ifdef CONFIG_SCHED_HMP > /* Heterogenous multiprocessor (HMP) optimizations > - * We need to know which cpus that are fast and slow. Ideally, this > - * information would be provided by the platform in some way. For now > it is > - * set in the kernel config. */ > + * We need to know which cpus that are fast and slow. */ > static struct cpumask hmp_fast_cpu_mask; > static struct cpumask hmp_slow_cpu_mask; > > -/* Setup fast and slow cpumasks. > - * This should be setup based on device tree somehow. */ > +extern void __init arch_get_fast_and_slow_cpus(struct cpumask *fast, > + struct cpumask *slow); > + > +/* Setup fast and slow cpumasks. */ > static int __init hmp_cpu_mask_setup(void) > { > char buf[64]; > > - cpumask_clear(&hmp_fast_cpu_mask); > - cpumask_clear(&hmp_slow_cpu_mask); > - > - if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, &hmp_fast_cpu_mask)) > - WARN(1, "Failed to parse HMP fast cpu mask!\n"); > - if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, &hmp_slow_cpu_mask)) > - WARN(1, "Failed to parse HMP slow cpu mask!\n"); > + arch_get_fast_and_slow_cpus(&hmp_fast_cpu_mask, &hmp_slow_cpu_mask); > > printk(KERN_DEBUG "Initializing HMP scheduler:\n"); > cpulist_scnprintf(buf, 64, &hmp_fast_cpu_mask); > -- > 1.7.10.4 > > > > _______________________________________________ > linaro-dev mailing list > linaro-dev@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/linaro-dev
_______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev