[RFC PATCH v2 2/2] ARM: kernel: update cpuinfo to print all online CPUs features

Nicolas Pitre nicolas.pitre at linaro.org
Fri Nov 16 12:29:44 EST 2012


On Fri, 16 Nov 2012, Lorenzo Pieralisi wrote:

> Currently, reading /proc/cpuinfo provides userspace with CPU ID of
> the CPU carrying out the read from the file. This is fine as long as all
> CPUs in the system are the same. With the advent of big.LITTLE and
> heterogenous ARM systems this approach provides user space with incorrect
> bits of information since CPU ids in the system might differ from the one
> provided by the CPU reading the file.
> 
> This patch updates the cpuinfo show function so that a read from
> /proc/cpuinfo prints HW information for all online CPUs at once, mirroring
>  x86 behaviour.
> 
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>

Acked-by: Nicolas Pitre <nico at linaro.org>

> ---
>  arch/arm/kernel/setup.c | 66 ++++++++++++++++++++++++-------------------------
>  1 file changed, 33 insertions(+), 33 deletions(-)
> 
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 20c530b..948fff1 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -842,13 +842,15 @@ static const char *hwcap_str[] = {
>  
>  static int c_show(struct seq_file *m, void *v)
>  {
> -	int i;
> +	int i, j;
> +	u32 cpuid;
>  
> -	seq_printf(m, "Processor\t: %s rev %d (%s)\n",
> -		   cpu_name, read_cpuid_id() & 15, elf_platform);
> +	for_each_online_cpu(i) {
> +		cpuid = is_smp() ? per_cpu(cpu_data, i).cpuid : read_cpuid_id();
> +		seq_printf(m, "Processor\t: %s rev %d (%s)\n",
> +			   cpu_name, cpuid & 15, elf_platform);
>  
>  #if defined(CONFIG_SMP)
> -	for_each_online_cpu(i) {
>  		/*
>  		 * glibc reads /proc/cpuinfo to determine the number of
>  		 * online processors, looking for lines beginning with
> @@ -858,42 +860,40 @@ static int c_show(struct seq_file *m, void *v)
>  		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
>  			   per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
>  			   (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
> -	}
> -#else /* CONFIG_SMP */
> -	seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
> -		   loops_per_jiffy / (500000/HZ),
> -		   (loops_per_jiffy / (5000/HZ)) % 100);
> +#else
> +		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
> +			   loops_per_jiffy / (500000/HZ),
> +			   (loops_per_jiffy / (5000/HZ)) % 100);
>  #endif
> +		/* dump out the processor features */
> +		seq_puts(m, "Features\t: ");
>  
> -	/* dump out the processor features */
> -	seq_puts(m, "Features\t: ");
> +		for (j = 0; hwcap_str[j]; j++)
> +			if (elf_hwcap & (1 << j))
> +				seq_printf(m, "%s ", hwcap_str[j]);
>  
> -	for (i = 0; hwcap_str[i]; i++)
> -		if (elf_hwcap & (1 << i))
> -			seq_printf(m, "%s ", hwcap_str[i]);
> +		seq_printf(m, "\nCPU implementer\t: 0x%02x\n", cpuid >> 24);
> +		seq_printf(m, "CPU architecture: %s\n",
> +			   proc_arch[cpu_architecture()]);
>  
> -	seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
> -	seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);
> -
> -	if ((read_cpuid_id() & 0x0008f000) == 0x00000000) {
> -		/* pre-ARM7 */
> -		seq_printf(m, "CPU part\t: %07x\n", read_cpuid_id() >> 4);
> -	} else {
> -		if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
> -			/* ARM7 */
> -			seq_printf(m, "CPU variant\t: 0x%02x\n",
> -				   (read_cpuid_id() >> 16) & 127);
> +		if ((cpuid & 0x0008f000) == 0x00000000) {
> +			/* pre-ARM7 */
> +			seq_printf(m, "CPU part\t: %07x\n", cpuid >> 4);
>  		} else {
> -			/* post-ARM7 */
> -			seq_printf(m, "CPU variant\t: 0x%x\n",
> -				   (read_cpuid_id() >> 20) & 15);
> +			if ((cpuid & 0x0008f000) == 0x00007000) {
> +				/* ARM7 */
> +				seq_printf(m, "CPU variant\t: 0x%02x\n",
> +					   (cpuid >> 16) & 127);
> +			} else {
> +				/* post-ARM7 */
> +				seq_printf(m, "CPU variant\t: 0x%x\n",
> +					   (cpuid >> 20) & 15);
> +			}
> +			seq_printf(m, "CPU part\t: 0x%03x\n",
> +				   (cpuid >> 4) & 0xfff);
>  		}
> -		seq_printf(m, "CPU part\t: 0x%03x\n",
> -			   (read_cpuid_id() >> 4) & 0xfff);
> +		seq_printf(m, "CPU revision\t: %d\n\n", cpuid & 15);
>  	}
> -	seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
> -
> -	seq_puts(m, "\n");
>  
>  	seq_printf(m, "Hardware\t: %s\n", machine_name);
>  	seq_printf(m, "Revision\t: %04x\n", system_rev);
> -- 
> 1.7.12
> 
> 



More information about the linux-arm-kernel mailing list