[PATCH 1/4] arm64: topology: Implement basic CPU topology support
Vincent Guittot
vincent.guittot at linaro.org
Mon Jan 13 11:44:06 EST 2014
On 13 January 2014 17:10, Lorenzo Pieralisi <lorenzo.pieralisi at arm.com> wrote:
> [adding Vincent in CC, questions related to SCHED MC macros]
>
> Minor comments below.
>
> On Sun, Jan 12, 2014 at 07:20:38PM +0000, Mark Brown wrote:
>> From: Mark Brown <broonie at linaro.org>
>>
>> Add basic CPU topology support to arm64, based on the existing pre-v8
>> code and some work done by Mark Hambleton. This patch does not
>> implement any topology discovery support since that should be based on
>> information from firmware, it merely implements the scaffolding for
>> integration of topology support in the architecture.
>>
>> The goal is to separate the architecture hookup for providing topology
>> information from the DT parsing in order to ease review and avoid
>> blocking the architecture code (which will be built on by other work)
>> with the DT code review by providing something something simple
>> and basic.
>
> "something something", one something is enough.
>
> [...]
>
>> new file mode 100644
>> index 000000000000..6f5270c65a6c
>> --- /dev/null
>> +++ b/arch/arm64/include/asm/topology.h
>> @@ -0,0 +1,39 @@
>> +#ifndef __ASM_TOPOLOGY_H
>> +#define __ASM_TOPOLOGY_H
>> +
>> +#ifdef CONFIG_CPU_TOPOLOGY
>> +
>> +#include <linux/cpumask.h>
>> +
>> +struct cpu_topology {
>> + int thread_id;
>> + int core_id;
>> + int socket_id;
>
> Is there any reason why we can't rename socket_id to cluster_id ? It won't
> change our lives but at least we kind of know what it means in ARM world.
>
>> + cpumask_t thread_sibling;
>> + cpumask_t core_sibling;
>> +};
>> +
>> +extern struct cpu_topology cpu_topology[NR_CPUS];
>> +
>> +#define topology_physical_package_id(cpu) (cpu_topology[cpu].socket_id)
>> +#define topology_core_id(cpu) (cpu_topology[cpu].core_id)
>> +#define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling)
>> +#define topology_thread_cpumask(cpu) (&cpu_topology[cpu].thread_sibling)
>> +
>> +#define mc_capable() (cpu_topology[0].socket_id != -1)
>> +#define smt_capable() (cpu_topology[0].thread_id != -1)
>
> Are the two macros above still required in the kernel ? I can't see any
> usage at present.
>
> Vincent, do you know why they were not removed in commit:
>
> 8e7fbcbc22c12414bcc9dfdd683637f58fb32759
>
> I am certainly missing something.
I think it was not planned to be used only by the scheduler but since
8e7fbcbc22c12414bcc9dfdd683637f58fb32759, we have reach a situation
where nobody use them for the moment.
>
>> +void init_cpu_topology(void);
>> +void store_cpu_topology(unsigned int cpuid);
>> +const struct cpumask *cpu_coregroup_mask(int cpu);
>> +
>> +#else
>> +
>> +static inline void init_cpu_topology(void) { }
>> +static inline void store_cpu_topology(unsigned int cpuid) { }
>> +
>> +#endif
>> +
>> +#include <asm-generic/topology.h>
>> +
>> +#endif /* _ASM_ARM_TOPOLOGY_H */
>> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
>> index 2d4554b13410..252b62181532 100644
>> --- a/arch/arm64/kernel/Makefile
>> +++ b/arch/arm64/kernel/Makefile
>> @@ -20,6 +20,7 @@ arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)+= hw_breakpoint.o
>> arm64-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
>> arm64-obj-$(CONFIG_ARM64_CPU_SUSPEND) += sleep.o suspend.o
>> arm64-obj-$(CONFIG_JUMP_LABEL) += jump_label.o
>> +arm64-obj-$(CONFIG_CPU_TOPOLOGY) += topology.o
>>
>> obj-y += $(arm64-obj-y) vdso/
>> obj-m += $(arm64-obj-m)
>> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
>> index 1b7617ab499b..40e20efc13e6 100644
>> --- a/arch/arm64/kernel/smp.c
>> +++ b/arch/arm64/kernel/smp.c
>> @@ -114,6 +114,11 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
>> return ret;
>> }
>>
>> +static void __cpuinit smp_store_cpu_info(unsigned int cpuid)
>> +{
>> + store_cpu_topology(cpuid);
>> +}
>
> __cpuinit has been (is being) removed from the kernel and probably should
> be removed from this definition too.
>
>> +
>> /*
>> * This is the secondary CPU boot entry. We're using this CPUs
>> * idle thread stack, but a set of temporary page tables.
>> @@ -152,6 +157,8 @@ asmlinkage void secondary_start_kernel(void)
>> */
>> notify_cpu_starting(cpu);
>>
>> + smp_store_cpu_info(cpu);
>> +
>> /*
>> * OK, now it's safe to let the boot CPU continue. Wait for
>> * the CPU migration code to notice that the CPU is online
>> @@ -391,6 +398,11 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
>> int err;
>> unsigned int cpu, ncores = num_possible_cpus();
>>
>> + init_cpu_topology();
>> +
>> + smp_store_cpu_info(smp_processor_id());
>> +
>> +
>
> Too many empty lines, one is enough.
>
>> /*
>> * are we trying to boot more cores than exist?
>> */
>> diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
>> new file mode 100644
>> index 000000000000..980019fefeff
>> --- /dev/null
>> +++ b/arch/arm64/kernel/topology.c
>> @@ -0,0 +1,91 @@
>> +/*
>> + * arch/arm64/kernel/topology.c
>> + *
>> + * Copyright (C) 2011,2013 Linaro Limited.
>> + *
>> + * Based on the arm32 version written by Vincent Guittot in turn based on
>> + * arch/sh/kernel/topology.c
>> + *
>> + * This file is subject to the terms and conditions of the GNU General Public
>> + * License. See the file "COPYING" in the main directory of this archive
>> + * for more details.
>> + */
>> +
>> +#include <linux/cpu.h>
>> +#include <linux/cpumask.h>
>> +#include <linux/init.h>
>> +#include <linux/percpu.h>
>> +#include <linux/node.h>
>> +#include <linux/nodemask.h>
>> +#include <linux/sched.h>
>> +
>> +#include <asm/topology.h>
>
> I have already commented on this. If this patchset is completely merged,
> that is one thing, if it is not we are adding include files for nothing.
> If you have time, and there should be given that the set missed the
> merge window it would be nice to split the includes, I will not nitpick
> any longer though, so it is up to you.
>
> [...]
>
>> +/*
>> + * init_cpu_topology is called at boot when only one cpu is running
>> + * which prevent simultaneous write access to cpu_topology array
>> + */
>> +void __init init_cpu_topology(void)
>> +{
>> + unsigned int cpu;
>> +
>> + /* init core mask and power*/
>> + for_each_possible_cpu(cpu) {
>> + struct cpu_topology *cpu_topo = &(cpu_topology[cpu]);
>
> You do not need brackets, &cpu_topology[cpu] will do.
>
> Lorenzo
>
More information about the linux-arm-kernel
mailing list