ia64: /proc/cpuinfo "physical id" field cleanups
PATCH 1/1 ia64: /proc/cpuinfo "physical id" field cleanups
Clean up the process for presenting the "physical id" field in /proc/cpuinfo.
- remove global smp_num_cpucores, as it is mostly useless
- remove check_for_logical_procs(), since we do the same functionality in identify_siblings()
- reflow logic in identify_siblings(). For older CPUs that do not support multi-core / thread, we still want to call ia64_sal_physical_id_info() and better handle ia64_pal_logical_to_phys().
- remove useless printk's about multi-core / thread capability in identify_siblings(), as that information is readily available in /proc/cpuinfo, and printing for the BSP only adds little value.
- smp_num_siblings is now meaningful if any CPU in the system supports threads, not just the BSP.
- expose "physical id" field, even on CPUs that are not multi-core / multi-threaded. Now we know what sockets Madisons live in too.
--- arch/ia64/kernel/setup.c | 48 ++++++------------------------------------- arch/ia64/kernel/smpboot.c | 26 +++++++++++++++-------- include/asm-ia64/smp.h | 1 - 3 files changed, 24 insertions(+), 51 deletions(-)
arch/ia64/kernel/setup.c +7 -41
@@ -402,34 +402,6 @@ mark_bsp_online (void)#endif } -#ifdef CONFIG_SMP -static void __init -check_for_logical_procs (void ) -{ -pal_logical_to_physical_t info; -s64 status; - - status =ia64_pal_logical_to_phys (0 , &info); -if (status =-1 ) { -printk (KERN_INFO "No logical to physical processor mapping " -"available\n" ); -return ; - } -if (status) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; - } -/* -* Total number of siblings that BSP has. Though not all of them -* may have booted successfully. The correct number of siblings -* booted is in info.overview_num_log. -*/ - smp_num_siblings = info.overview_tpc; - smp_num_cpucores = info.overview_cpp; -} -#endif -static __initdata int nomca;static __init int setup_nomca (char *s) {
@@ -528,16 +500,6 @@ setup_arch (char **cmdline_p)cpu_set (0 , cpu_sibling_map[0 ]);cpu_set (0 , cpu_core_map[0 ]); - -check_for_logical_procs (); -if (smp_num_cpucores >1 ) -printk (KERN_INFO -"cpu package is Multi-Core capable: number of cores=%d\n" , - smp_num_cpucores); -if (smp_num_siblings >1 ) -printk (KERN_INFO -"cpu package is Multi-Threading capable: number of siblings=%d\n" , - smp_num_siblings);#endif cpu_init ();/* initialize the bootstrap CPU */
@@ -649,13 +611,14 @@ show_cpuinfo (struct seq_file *m, void *v) c->itc_freq /1000000 , c->itc_freq %1000000 , lpj*HZ/500000, (lpj*HZ/5000) % 100);#ifdef CONFIG_SMP -seq_printf (m,"siblings : %u\n" ,cpus_weight (cpu_core_map[cpunum])); +seq_printf (m,"siblings : %u\n" +"physical id: %u\n" , +cpus_weight (cpu_core_map[cpunum]), c->socket_id);if (c->threads_per_core >1 || c->cores_per_socket >1 )seq_printf (m, -"physical id: %u\n" "core id : %u\n" "thread id : %u\n" , - c->socket_id, c->core_id, c->thread_id); + c->core_id, c->thread_id);#endif seq_printf (m,"\n" );
@@ -767,6 +730,9 @@ identify_cpu (struct cpuinfo_ia64 *c) c->socket_id =-1 ;identify_siblings (c); + +if (c->threads_per_core > smp_num_siblings) + smp_num_siblings = c->threads_per_core;#endif c->ppn = cpuid.field.ppn; c->number = cpuid.field.number;
arch/ia64/kernel/smpboot.c +17 -9
@@ -139,7 +139,6 @@ EXPORT_SYMBOL(cpu_possible_map); cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned; cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;int smp_num_siblings =1 ; -int smp_num_cpucores =1 ;/* which logical CPU number maps to which CPU (physical APIC ID) */ volatile int ia64_cpu_to_sapicid[NR_CPUS ];
@@ -878,20 +877,29 @@ identify_siblings(struct cpuinfo_ia64 *c)u16 pltid;pal_logical_to_physical_t info; -if (smp_num_cpucores =1 && smp_num_siblings =1 ) -return ; - -if ((status =ia64_pal_logical_to_phys (-1 , &info)) !=PAL_STATUS_SUCCESS ) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; - }if ((status =ia64_sal_physical_id_info (&pltid)) !=PAL_STATUS_SUCCESS ) {printk (KERN_ERR "ia64_sal_pltid failed with %ld\n" , status);return ; } +if ((status =ia64_pal_logical_to_phys (-1 , &info)) !=PAL_STATUS_SUCCESS ) { +if (status !=PAL_STATUS_UNIMPLEMENTED ) { +printk (KERN_ERR +"ia64_pal_logical_to_phys failed with %ld\n" , + status); +return ; + } + + info.overview_ppid =0 ; + info.overview_cpp =1 ; + info.overview_tpc =1 ; + } + c->socket_id = (pltid <<8 ) | info.overview_ppid; + +if (info.overview_cpp =1 && info.overview_tpc =1 ) +return ; + c->cores_per_socket = info.overview_cpp; c->threads_per_core = info.overview_tpc; c->num_log = info.overview_num_log;
include/asm-ia64/smp.h +0 -1
@@ -60,7 +60,6 @@ extern cpumask_t cpu_online_map;extern cpumask_t cpu_core_map[NR_CPUS ];extern cpumask_t cpu_sibling_map[NR_CPUS ];extern int smp_num_siblings; -extern int smp_num_cpucores;extern void __iomem *ipi_base_addr;extern unsigned char smp_int_redirect;
Signature · 1 line
1.5.3.1.g1e61
Hi Tony,
* Alex Chiang <[email protected]>:
Quoted 2 lines
Clean up the process for presenting the "physical id" field in
/proc/cpuinfo.
Tagging onto Bjorn's ping ;) I was wondering what you thought of this patch as well.
I've got the same desire to push my patch into a distro.
Thanks!
/ac
Quoted 3 lines
- expose "physical id" field, even on CPUs that are not multi-core / multi-threaded. Now we know what sockets Madisons live in too.
This sounds like a good idea. But this patch didn't work for me to achieve that on my HP 2620. /proc/cpuinfo with this patch looks like this:
processor : 0
...
physical id: 4294967295
processor : 1
...
physical id: 4294967295
So both my Madison cpus are apparently sharing the same socket! That big decimal number is just "-1" printed as an unsigned.
-Tony
Hi Tony,
Thanks for looking at this.
Quoted 12 lines
Quoted 3 lines
- expose "physical id" field, even on CPUs that are not multi-core / multi-threaded. Now we know what sockets Madisons live in too.
This sounds like a good idea. But this patch didn't work for me to achieve that on my HP 2620.
/proc/cpuinfowith this patch looks like this:processor : 0
...
physical id: 4294967295
Quoted 7 lines
processor : 1
...
physical id: 4294967295So both my Madison cpus are apparently sharing the same socket! That big decimal number is just "-1" printed as an unsigned.
I spent some time looking at this and also talked with our low-end firmware guys, and think I understand what's going on now.
First, on HP low-end platforms, like your rx2620, SAL_PHYSICAL_ID_INFO is hard coded to return 0. I missed this because I tested on low-end and high-end with Montes, and on high-end with Madisons. I must have missed low-end Madison based platforms. :(
Based on that information, I will have to rethink my approach.
Second, SAL_PHYSICAL_ID_INFO did not show up until SAL 3.2, which I think is why you got -1. On my rx2620, I have a relatively modern firmware which does have the SAL call, and I get 0 for each physical id (with Madisons).
In identify_cpu(), we initialize c->socket_id to -1 because we expect that value to get overwritten later, in identify_siblings().
If you look at my patch, identify_siblings() calls ia64_sal_physical_id_info(), and then returns if we get a failure.
You should have seen this printk:
printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status);
Can you verify that you saw that in your dmesg? I think the status should be -1, due to not-implemented.
Thanks.
/ac
Quoted 6 lines
You should have seen this printk:
printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status);Can you verify that you saw that in your dmesg? I think the status should be -1, due to not-implemented.
Yes. I see this message, and the status is indeed -1.
-Tony
Hi Tony,
After a lot of rethinking (and a little bit of rework), here is my second shot at this patch.
The only real change from the prior version is that I change the intialization of socket_id to 0 as default. I think the benefit of displaying information from PAL/SAL (when available) on older platforms outweighs the oddity that the user may see physical_id = 0 for multiple CPUs occasionally.
I've tested on:
rx1620
rx2660
rx6600
rx8620
rx8640
superdome
And it does reasonable things on all of them.
Please consider this for inclusion. Thanks.
/ac
From: Alex Chiang <[email protected]>
Clean up the process for presenting the "physical id" field in /proc/cpuinfo.
- remove global smp_num_cpucores, as it is mostly useless
- remove check_for_logical_procs(), since we do the same functionality in identify_siblings()
- initialize socket_id to 0 as a default, in case an older CPU implements neither PAL_LOGICAL_TO_PHYSICAL nor SAL_PHYSICAL_ID_INFO. We're presenting this data later in /proc/cpuinfo, so we'd like a reasonable value for older platforms.
- reflow logic in identify_siblings(). If an older CPU does not implement PAL_LOGICAL_TO_PHYSICAL, we may still be able to get useful information from SAL_PHYSICAL_ID_INFO
- in identify_siblings(), threads/cores are a property of the CPU, not the platform
- remove useless printk's about multi-core / thread capability in identify_siblings(), as that information is readily available in /proc/cpuinfo, and printing for the BSP only adds little value
- smp_num_siblings is now meaningful if any CPU in the system supports threads, not just the BSP
- expose "physical id" field, even on CPUs that are not multi-core / multi-threaded. Now we know what sockets Madisons live in too
--- arch/ia64/kernel/setup.c | 49 +++++++------------------------------------ arch/ia64/kernel/smpboot.c | 21 ++++++++++++------ include/asm-ia64/smp.h | 1 - 3 files changed, 22 insertions(+), 49 deletions(-)
arch/ia64/kernel/setup.c +8 -41
@@ -405,34 +405,6 @@ mark_bsp_online (void)#endif } -#ifdef CONFIG_SMP -static void __init -check_for_logical_procs (void ) -{ -pal_logical_to_physical_t info; -s64 status; - - status =ia64_pal_logical_to_phys (0 , &info); -if (status =-1 ) { -printk (KERN_INFO "No logical to physical processor mapping " -"available\n" ); -return ; - } -if (status) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; - } -/* -* Total number of siblings that BSP has. Though not all of them -* may have booted successfully. The correct number of siblings -* booted is in info.overview_num_log. -*/ - smp_num_siblings = info.overview_tpc; - smp_num_cpucores = info.overview_cpp; -} -#endif -static __initdata int nomca;static __init int setup_nomca (char *s) {
@@ -528,15 +500,6 @@ setup_arch (char **cmdline_p)#ifdef CONFIG_SMP cpu_physical_id (0 ) =hard_smp_processor_id (); -check_for_logical_procs (); -if (smp_num_cpucores >1 ) -printk (KERN_INFO -"cpu package is Multi-Core capable: number of cores=%d\n" , - smp_num_cpucores); -if (smp_num_siblings >1 ) -printk (KERN_INFO -"cpu package is Multi-Threading capable: number of siblings=%d\n" , - smp_num_siblings);#endif cpu_init ();/* initialize the bootstrap CPU */
@@ -648,13 +611,14 @@ show_cpuinfo (struct seq_file *m, void *v) c->itc_freq /1000000 , c->itc_freq %1000000 , lpj*HZ/500000, (lpj*HZ/5000) % 100);#ifdef CONFIG_SMP -seq_printf (m,"siblings : %u\n" ,cpus_weight (cpu_core_map[cpunum])); +seq_printf (m,"siblings : %u\n" , +"physical id: %d\n" , +cpus_weight (cpu_core_map[cpunum]), c->socket_id);if (c->threads_per_core >1 || c->cores_per_socket >1 )seq_printf (m, -"physical id: %u\n" "core id : %u\n" "thread id : %u\n" , - c->socket_id, c->core_id, c->thread_id); + c->core_id, c->thread_id);#endif seq_printf (m,"\n" );
@@ -763,9 +727,12 @@ identify_cpu (struct cpuinfo_ia64 *c)* for Multi-Threading/Multi-Core capable CPUs */ c->threads_per_core = c->cores_per_socket = c->num_log =1 ; - c->socket_id =-1 ; + c->socket_id =0 ;identify_siblings (c); + +if (c->threads_per_core > smp_num_siblings) + smp_num_siblings = c->threads_per_core;#endif c->ppn = cpuid.field.ppn; c->number = cpuid.field.number;
arch/ia64/kernel/smpboot.c +14 -7
@@ -142,7 +142,6 @@ DEFINE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map);EXPORT_PER_CPU_SYMBOL (cpu_sibling_map);int smp_num_siblings =1 ; -int smp_num_cpucores =1 ;/* which logical CPU number maps to which CPU (physical APIC ID) */ volatile int ia64_cpu_to_sapicid[NR_CPUS ];
@@ -886,13 +885,17 @@ identify_siblings(struct cpuinfo_ia64 *c)u16 pltid;pal_logical_to_physical_t info; -if (smp_num_cpucores =1 && smp_num_siblings =1 ) -return ; -if ((status =ia64_pal_logical_to_phys (-1 , &info)) !=PAL_STATUS_SUCCESS ) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; +if (status !=PAL_STATUS_UNIMPLEMENTED ) { +printk (KERN_ERR +"ia64_pal_logical_to_phys failed with %ld\n" , + status); +return ; + } + + info.overview_ppid =0 ; + info.overview_cpp =1 ; + info.overview_tpc =1 ; }if ((status =ia64_sal_physical_id_info (&pltid)) !=PAL_STATUS_SUCCESS ) {printk (KERN_ERR "ia64_sal_pltid failed with %ld\n" , status);
@@ -900,6 +903,10 @@ identify_siblings(struct cpuinfo_ia64 *c) } c->socket_id = (pltid <<8 ) | info.overview_ppid; + +if (info.overview_cpp =1 && info.overview_tpc =1 ) +return ; + c->cores_per_socket = info.overview_cpp; c->threads_per_core = info.overview_tpc; c->num_log = info.overview_num_log;
include/asm-ia64/smp.h +0 -1
@@ -60,7 +60,6 @@ extern cpumask_t cpu_online_map;extern cpumask_t cpu_core_map[NR_CPUS ];DECLARE_PER_CPU (cpumask_t, cpu_sibling_map);extern int smp_num_siblings; -extern int smp_num_cpucores;extern void __iomem *ipi_base_addr;extern unsigned char smp_int_redirect;
Signature · 1 line
1.5.3.1.1.g1e61
Quoted 5 lines
The only real change from the prior version is that I change the intialization of
socket_idto 0 as default. I think the benefit of displaying information from PAL/SAL (when available) on older platforms outweighs the oddity that the user may seephysical_id= 0 for multiple CPUs occasionally.
Can't we not print the physical_id if we don't know what it is? That sounds like a better idea than printing wrong information.
-Tony
* Luck, Tony <[email protected]>:
Quoted 8 lines
Quoted 5 lines
The only real change from the prior version is that I change the intialization of
socket_idto 0 as default. I think the benefit of displaying information from PAL/SAL (when available) on older platforms outweighs the oddity that the user may seephysical_id= 0 for multiple CPUs occasionally.Can't we not print the
physical_idif we don't know what it is? That sounds like a better idea than printing wrong information.
Sure, that sounds like a much better idea. Here's try #3 (go back to old initialization of socket_id = -1, and decide in show_cpuinfo whether we should print it or not).
Thanks.
/ac
From: Alex Chiang <[email protected]>
Clean up the process for presenting the "physical id" field in /proc/cpuinfo.
- remove global smp_num_cpucores, as it is mostly useless
- remove check_for_logical_procs(), since we do the same functionality in identify_siblings()
- reflow logic in identify_siblings(). If an older CPU does not implement PAL_LOGICAL_TO_PHYSICAL, we may still be able to get useful information from SAL_PHYSICAL_ID_INFO
- in identify_siblings(), threads/cores are a property of the CPU, not the platform
- remove useless printk's about multi-core / thread capability in identify_siblings(), as that information is readily available in /proc/cpuinfo, and printing for the BSP only adds little value
- smp_num_siblings is now meaningful if any CPU in the system supports threads, not just the BSP
- expose "physical id" field, even on CPUs that are not multi-core / multi-threaded (as long as we have a valid value). Now we know what sockets Madisons live in too.
--- arch/ia64/kernel/setup.c | 49 +++++++------------------------------------ arch/ia64/kernel/smpboot.c | 21 ++++++++++++------ include/asm-ia64/smp.h | 1 - 3 files changed, 22 insertions(+), 49 deletions(-)
arch/ia64/kernel/setup.c +8 -41
@@ -405,34 +405,6 @@ mark_bsp_online (void)#endif } -#ifdef CONFIG_SMP -static void __init -check_for_logical_procs (void ) -{ -pal_logical_to_physical_t info; -s64 status; - - status =ia64_pal_logical_to_phys (0 , &info); -if (status =-1 ) { -printk (KERN_INFO "No logical to physical processor mapping " -"available\n" ); -return ; - } -if (status) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; - } -/* -* Total number of siblings that BSP has. Though not all of them -* may have booted successfully. The correct number of siblings -* booted is in info.overview_num_log. -*/ - smp_num_siblings = info.overview_tpc; - smp_num_cpucores = info.overview_cpp; -} -#endif -static __initdata int nomca;static __init int setup_nomca (char *s) {
@@ -528,15 +500,6 @@ setup_arch (char **cmdline_p)#ifdef CONFIG_SMP cpu_physical_id (0 ) =hard_smp_processor_id (); -check_for_logical_procs (); -if (smp_num_cpucores >1 ) -printk (KERN_INFO -"cpu package is Multi-Core capable: number of cores=%d\n" , - smp_num_cpucores); -if (smp_num_siblings >1 ) -printk (KERN_INFO -"cpu package is Multi-Threading capable: number of siblings=%d\n" , - smp_num_siblings);#endif cpu_init ();/* initialize the bootstrap CPU */
@@ -649,12 +612,13 @@ show_cpuinfo (struct seq_file *m, void *v) lpj*HZ/500000, (lpj*HZ/5000) % 100);#ifdef CONFIG_SMP seq_printf (m,"siblings : %u\n" ,cpus_weight (cpu_core_map[cpunum])); +if (c->socket_id !=-1 ) +seq_printf (m,"physical id: %u\n" , c->socket_id);if (c->threads_per_core >1 || c->cores_per_socket >1 )seq_printf (m, -"physical id: %u\n" -"core id : %u\n" -"thread id : %u\n" , - c->socket_id, c->core_id, c->thread_id); +"core id : %u\n" +"thread id : %u\n" , + c->core_id, c->thread_id);#endif seq_printf (m,"\n" );
@@ -766,6 +730,9 @@ identify_cpu (struct cpuinfo_ia64 *c) c->socket_id =-1 ;identify_siblings (c); + +if (c->threads_per_core > smp_num_siblings) + smp_num_siblings = c->threads_per_core;#endif c->ppn = cpuid.field.ppn; c->number = cpuid.field.number;
arch/ia64/kernel/smpboot.c +14 -7
@@ -142,7 +142,6 @@ DEFINE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map);EXPORT_PER_CPU_SYMBOL (cpu_sibling_map);int smp_num_siblings =1 ; -int smp_num_cpucores =1 ;/* which logical CPU number maps to which CPU (physical APIC ID) */ volatile int ia64_cpu_to_sapicid[NR_CPUS ];
@@ -886,13 +885,17 @@ identify_siblings(struct cpuinfo_ia64 *c)u16 pltid;pal_logical_to_physical_t info; -if (smp_num_cpucores =1 && smp_num_siblings =1 ) -return ; -if ((status =ia64_pal_logical_to_phys (-1 , &info)) !=PAL_STATUS_SUCCESS ) { -printk (KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n" , - status); -return ; +if (status !=PAL_STATUS_UNIMPLEMENTED ) { +printk (KERN_ERR +"ia64_pal_logical_to_phys failed with %ld\n" , + status); +return ; + } + + info.overview_ppid =0 ; + info.overview_cpp =1 ; + info.overview_tpc =1 ; }if ((status =ia64_sal_physical_id_info (&pltid)) !=PAL_STATUS_SUCCESS ) {printk (KERN_ERR "ia64_sal_pltid failed with %ld\n" , status);
@@ -900,6 +903,10 @@ identify_siblings(struct cpuinfo_ia64 *c) } c->socket_id = (pltid <<8 ) | info.overview_ppid; + +if (info.overview_cpp =1 && info.overview_tpc =1 ) +return ; + c->cores_per_socket = info.overview_cpp; c->threads_per_core = info.overview_tpc; c->num_log = info.overview_num_log;
include/asm-ia64/smp.h +0 -1
@@ -60,7 +60,6 @@ extern cpumask_t cpu_online_map;extern cpumask_t cpu_core_map[NR_CPUS ];DECLARE_PER_CPU (cpumask_t, cpu_sibling_map);extern int smp_num_siblings; -extern int smp_num_cpucores;extern void __iomem *ipi_base_addr;extern unsigned char smp_int_redirect;
Signature · 1 line
1.5.3.1.1.g1e61
Hi Tony,
* Alex Chiang <[email protected]>:
Quoted 7 lines
* Luck, Tony <[email protected]>:
Quoted 6 lines
Quoted 5 lines
The only real change from the prior version is that I change the intialization of
socket_idto 0 as default. I think the benefit of displaying information from PAL/SAL (when available) on older platforms outweighs the oddity that the user may seephysical_id= 0 for multiple CPUs occasionally.
Quoted 6 lines
Quoted 2 lines
Can't we not print the
physical_idif we don't know what it is? That sounds like a better idea than printing wrong information.Sure, that sounds like a much better idea. Here's try #3 (go back to old initialization of
socket_id= -1, and decide inshow_cpuinfowhether we should print it or not).
Did this patch work for you?
Thanks.
/ac