x86: Added read_mostly declaration/definition to vars from smp.h
PATCH v2 2/2 x86: Added read_mostly declaration/definition to vars from smp.h
Added a "read-mostly" qualifier to the following variables in smp.h:
- cpu_sibling_map
- cpu_core_map
- cpu_llc_shared_map
- cpu_llc_id
- cpu_number
- x86_cpu_to_apicid
- x86_bios_cpu_apicid
- x86_cpu_to_logical_apicid
As long as all the variables above are only written during the initialization, this change is meant to prevent the false sharing and improve the performance on large multiprocessor systems.
--- arch/x86/include/asm/apic.h | 2 +- arch/x86/include/asm/smp.h | 16 ++++++++-------- arch/x86/kernel/apic/apic.c | 6 +++--- arch/x86/kernel/setup_percpu.c | 2 +- arch/x86/kernel/smpboot.c | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-)
arch/x86/include/asm/apic.h +1 -1
@@ -520,7 +520,7 @@ static inline const struct cpumask *default_target_cpus(void)#endif } -DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); +DECLARE_EARLY_PER_CPU_READ_MOSTLY (u16, x86_bios_cpu_apicid);static inline unsigned int read_apic_id (void )
arch/x86/include/asm/smp.h +8 -8
@@ -31,12 +31,12 @@ static inline bool cpu_has_ht_siblings(void)return has_siblings; } -DECLARE_PER_CPU (cpumask_var_t, cpu_sibling_map); -DECLARE_PER_CPU (cpumask_var_t, cpu_core_map); +DECLARE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_sibling_map); +DECLARE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_core_map);/* cpus sharing the last level cache: */ -DECLARE_PER_CPU (cpumask_var_t, cpu_llc_shared_map); -DECLARE_PER_CPU (u16, cpu_llc_id); -DECLARE_PER_CPU (int, cpu_number); +DECLARE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_llc_shared_map); +DECLARE_PER_CPU_READ_MOSTLY (u16, cpu_llc_id); +DECLARE_PER_CPU_READ_MOSTLY (int, cpu_number);static inline struct cpumask *cpu_sibling_mask (int cpu) {
@@ -53,10 +53,10 @@ static inline struct cpumask *cpu_llc_shared_mask(int cpu)return per_cpu (cpu_llc_shared_map, cpu); } -DECLARE_EARLY_PER_CPU (u16, x86_cpu_to_apicid); -DECLARE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid); +DECLARE_EARLY_PER_CPU_READ_MOSTLY (u16, x86_cpu_to_apicid); +DECLARE_EARLY_PER_CPU_READ_MOSTLY (u16, x86_bios_cpu_apicid);#if defined(CONFIG_X86_LOCAL_APIC ) && defined(CONFIG_X86_32 ) -DECLARE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid); +DECLARE_EARLY_PER_CPU_READ_MOSTLY (int, x86_cpu_to_logical_apicid);#endif /* Static state in head.S used to set up a CPU */
arch/x86/kernel/apic/apic.c +3 -3
@@ -74,8 +74,8 @@ physid_mask_t phys_cpu_present_map;/* * Map cpu index to physical APIC ID */ -DEFINE_EARLY_PER_CPU (u16, x86_cpu_to_apicid,BAD_APICID ); -DEFINE_EARLY_PER_CPU (u16, x86_bios_cpu_apicid,BAD_APICID ); +DEFINE_EARLY_PER_CPU_READ_MOSTLY (u16, x86_cpu_to_apicid,BAD_APICID ); +DEFINE_EARLY_PER_CPU_READ_MOSTLY (u16, x86_bios_cpu_apicid,BAD_APICID );EXPORT_EARLY_PER_CPU_SYMBOL (x86_cpu_to_apicid);EXPORT_EARLY_PER_CPU_SYMBOL (x86_bios_cpu_apicid);
@@ -87,7 +87,7 @@ EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid);* used for the mapping. This is where the behaviors of x86_64 and 32 * actually diverge. Let's keep it ugly for now. */ -DEFINE_EARLY_PER_CPU (int, x86_cpu_to_logical_apicid,BAD_APICID ); +DEFINE_EARLY_PER_CPU_READ_MOSTLY (int, x86_cpu_to_logical_apicid,BAD_APICID );/* * Knob to control our willingness to enable the local APIC.
arch/x86/kernel/setup_percpu.c +1 -1
@@ -21,7 +21,7 @@#include <asm/cpu.h> #include <asm/stackprotector.h> -DEFINE_PER_CPU (int, cpu_number); +DEFINE_PER_CPU_READ_MOSTLY (int, cpu_number);EXPORT_PER_CPU_SYMBOL (cpu_number);#ifdef CONFIG_X86_64
arch/x86/kernel/smpboot.c +4 -4
@@ -118,17 +118,17 @@ int smp_num_siblings = 1;EXPORT_SYMBOL (smp_num_siblings);/* Last level cache ID of each logical CPU */ -DEFINE_PER_CPU (u16, cpu_llc_id) =BAD_APICID ; +DEFINE_PER_CPU_READ_MOSTLY (u16, cpu_llc_id) =BAD_APICID ;/* representing HT siblings of each logical CPU */ -DEFINE_PER_CPU (cpumask_var_t, cpu_sibling_map); +DEFINE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_sibling_map);EXPORT_PER_CPU_SYMBOL (cpu_sibling_map);/* representing HT and core siblings of each logical CPU */ -DEFINE_PER_CPU (cpumask_var_t, cpu_core_map); +DEFINE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_core_map);EXPORT_PER_CPU_SYMBOL (cpu_core_map); -DEFINE_PER_CPU (cpumask_var_t, cpu_llc_shared_map); +DEFINE_PER_CPU_READ_MOSTLY (cpumask_var_t, cpu_llc_shared_map);/* Per CPU bogomips and other parameters */ DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);
Signature · 1 line
1.7.0.4
Quoted 16 lines · Vlad Zolotarov
Added a "read-mostly" qualifier to the following variables in
smp.h:
-cpu_sibling_map
-cpu_core_map
-cpu_llc_shared_map
-cpu_llc_id
-cpu_number
-x86_cpu_to_apicid
-x86_bios_cpu_apicid
-x86_cpu_to_logical_apicidAs long as all the variables above are only written during the initialization, this change is meant to prevent the false sharing and improve the performance on large multiprocessor systems.
Signed-off-by Vlad Zolotarov <[email protected]>Signed-off-by Shai Fultheim <[email protected]>
Quoted 7 lines
--- arch/x86/include/asm/apic.h | 2 +- arch/x86/include/asm/smp.h | 16 ++++++++-------- arch/x86/kernel/apic/apic.c | 6 +++--- arch/x86/kernel/setup_percpu.c | 2 +- arch/x86/kernel/smpboot.c | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-)
This does not build on !SMP kernels that has APIC enabled.
Thanks,
Ingo
Quoted 26 lines · Ingo Molnar
Quoted 16 lines · Vlad Zolotarov
Added a "read-mostly" qualifier to the following variables in
smp.h:
-cpu_sibling_map
-cpu_core_map
-cpu_llc_shared_map
-cpu_llc_id
-cpu_number
-x86_cpu_to_apicid
-x86_bios_cpu_apicid
-x86_cpu_to_logical_apicidAs long as all the variables above are only written during the initialization, this change is meant to prevent the false sharing and improve the performance on large multiprocessor systems.
Signed-off-by Vlad Zolotarov<[email protected]>Signed-off-by Shai Fultheim<[email protected]>Quoted 7 lines
--- arch/x86/include/asm/apic.h | 2 +- arch/x86/include/asm/smp.h | 16 ++++++++-------- arch/x86/kernel/apic/apic.c | 6 +++--- arch/x86/kernel/setup_percpu.c | 2 +- arch/x86/kernel/smpboot.c | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-)
Quoted 1 line
This does not build on !SMP kernels that has APIC enabled.
Oops... :) My bad. I'll rebase and respin.
Thanks,
vlad
Quoted 10 lines
Thanks,
Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/