x86: Move llc_shared_map out of cpu_info
PATCH 1/1 x86: Move llc_shared_map out of cpu_info
cpu_info is already with per_cpu, We can take llc_shared_map out of cpu_info, and declare it as per_cpu variable directly.
So later referencing could be simple and directly instead of diving to find cpu_info at first.
Also could make smp_store_cpu_info() much simple to avoid to do save and restore trick.
--- arch/x86/include/asm/processor.h | 4 --- arch/x86/include/asm/smp.h | 7 ++++++ arch/x86/kernel/cpu/intel_cacheinfo.c | 4 +-- arch/x86/kernel/cpu/mcheck/mce_amd.c | 7 +----- arch/x86/kernel/smpboot.c | 38 ++++++++-------------------------- 5 files changed, 21 insertions(+), 39 deletions(-)
arch/x86/include/asm/processor.h +0 -4
@@ -94,10 +94,6 @@ struct cpuinfo_x86 {int x86_cache_alignment;/* In bytes */ int x86_power;unsigned long loops_per_jiffy; -#ifdef CONFIG_SMP -/* cpus sharing the last level cache: */ -cpumask_var_t llc_shared_map; -#endif /* cpuid returned max cores value: */ u16 x86_max_cores;u16 apicid;
arch/x86/include/asm/smp.h +7 -0
@@ -23,6 +23,8 @@ extern unsigned int num_processors;DECLARE_PER_CPU (cpumask_var_t, cpu_sibling_map);DECLARE_PER_CPU (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);
@@ -36,6 +38,11 @@ static inline struct cpumask *cpu_core_mreturn per_cpu (cpu_core_map, cpu); } +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);
arch/x86/kernel/cpu/intel_cacheinfo.c +2 -2
@@ -732,11 +732,11 @@ static void __cpuinit cache_shared_cpu_mstruct cpuinfo_x86 *c = &cpu_data (cpu);if ((index ==3 ) && (c->x86_vendor ==X86_VENDOR_AMD )) { -for_each_cpu (i, c->llc_shared_map) { +for_each_cpu (i,cpu_llc_shared_mask (cpu)) {if (!per_cpu (ici_cpuid4_info, i))continue ; this_leaf =CPUID4_INFO_IDX (i, index); -for_each_cpu (sibling, c->llc_shared_map) { +for_each_cpu (sibling,cpu_llc_shared_mask (cpu)) {if (!cpu_online (sibling))continue ;set_bit (sibling, this_leaf->shared_cpu_map);
arch/x86/kernel/cpu/mcheck/mce_amd.c +2 -5
@@ -527,15 +527,12 @@ static __cpuinit int threshold_create_baint i, err =0 ;struct threshold_bank *b =NULL ;char name[32 ]; -#ifdef CONFIG_SMP -struct cpuinfo_x86 *c = &cpu_data (cpu); -#endif sprintf (name,"threshold_bank%i" , bank);#ifdef CONFIG_SMP if (cpu_data (cpu).cpu_core_id && shared_bank[bank]) {/* symlink */ - i =cpumask_first (c->llc_shared_map); + i =cpumask_first (cpu_llc_shared_mask (cpu));/* first core not up yet */ if (cpu_data (i).cpu_core_id)
@@ -555,7 +552,7 @@ static __cpuinit int threshold_create_baif (err) goto out; -cpumask_copy (b->cpus, c->llc_shared_map); +cpumask_copy (b->cpus,cpu_llc_shared_mask (cpu));per_cpu (threshold_banks, cpu)[bank] = b; goto out;
arch/x86/kernel/smpboot.c +10 -28
@@ -130,6 +130,8 @@ EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);DEFINE_PER_CPU (cpumask_var_t, cpu_core_map);EXPORT_PER_CPU_SYMBOL (cpu_core_map); +DEFINE_PER_CPU (cpumask_var_t, cpu_llc_shared_map); +/* Per CPU bogomips and other parameters */ DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);EXPORT_PER_CPU_SYMBOL (cpu_info);
@@ -355,23 +357,6 @@ notrace static void __cpuinit start_secocpu_idle (); } -#ifdef CONFIG_CPUMASK_OFFSTACK -/* In this case, llc_shared_map is a pointer to a cpumask. */ -static inline void copy_cpuinfo_x86 (struct cpuinfo_x86 *dst, -const struct cpuinfo_x86 *src) -{ -struct cpumask *llc = dst->llc_shared_map; - *dst = *src; - dst->llc_shared_map = llc; -} -#else -static inline void copy_cpuinfo_x86 (struct cpuinfo_x86 *dst, -const struct cpuinfo_x86 *src) -{ - *dst = *src; -} -#endif /* CONFIG_CPUMASK_OFFSTACK */ -/* * The bootstrap kernel entry code has set these up. Save them for * a given CPU
@@ -381,7 +366,7 @@ void __cpuinit smp_store_cpu_info(int id {struct cpuinfo_x86 *c = &cpu_data (id); -copy_cpuinfo_x86 (c, &boot_cpu_data); + *c = boot_cpu_data; c->cpu_index = id;if (id !=0 )identify_secondary_cpu (c);
@@ -389,15 +374,12 @@ void __cpuinit smp_store_cpu_info(int idstatic void __cpuinit link_thread_siblings (int cpu1,int cpu2) { -struct cpuinfo_x86 *c1 = &cpu_data (cpu1); -struct cpuinfo_x86 *c2 = &cpu_data (cpu2); -cpumask_set_cpu (cpu1,cpu_sibling_mask (cpu2));cpumask_set_cpu (cpu2,cpu_sibling_mask (cpu1));cpumask_set_cpu (cpu1,cpu_core_mask (cpu2));cpumask_set_cpu (cpu2,cpu_core_mask (cpu1)); -cpumask_set_cpu (cpu1, c2->llc_shared_map); -cpumask_set_cpu (cpu2, c1->llc_shared_map); +cpumask_set_cpu (cpu1,cpu_llc_shared_mask (cpu2)); +cpumask_set_cpu (cpu2,cpu_llc_shared_mask (cpu1)); }
@@ -425,7 +407,7 @@ void __cpuinit set_cpu_sibling_map(int ccpumask_set_cpu (cpu,cpu_sibling_mask (cpu)); } -cpumask_set_cpu (cpu, c->llc_shared_map); +cpumask_set_cpu (cpu,cpu_llc_shared_mask (cpu));if (__this_cpu_read (cpu_info.x86_max_cores) ==1 ) {cpumask_copy (cpu_core_mask (cpu),cpu_sibling_mask (cpu));
@@ -436,8 +418,8 @@ void __cpuinit set_cpu_sibling_map(int cfor_each_cpu (i, cpu_sibling_setup_mask) {if (per_cpu (cpu_llc_id, cpu) !=BAD_APICID &&per_cpu (cpu_llc_id, cpu) ==per_cpu (cpu_llc_id, i)) { -cpumask_set_cpu (i, c->llc_shared_map); -cpumask_set_cpu (cpu,cpu_data (i).llc_shared_map); +cpumask_set_cpu (i,cpu_llc_shared_mask (cpu)); +cpumask_set_cpu (cpu,cpu_llc_shared_mask (i)); }if (c->phys_proc_id ==cpu_data (i).phys_proc_id) {cpumask_set_cpu (i,cpu_core_mask (cpu));
@@ -476,7 +458,7 @@ const struct cpumask *cpu_coregroup_mask !(cpu_has(c, X86_FEATURE_AMD_DCM)))return cpu_core_mask (cpu); else - return c->llc_shared_map; + return cpu_llc_shared_mask(cpu); }static void impress_friends (void )
@@ -1103,7 +1085,7 @@ void __init native_smp_prepare_cpus(unsifor_each_possible_cpu (i) {zalloc_cpumask_var (&per_cpu (cpu_sibling_map, i),GFP_KERNEL );zalloc_cpumask_var (&per_cpu (cpu_core_map, i),GFP_KERNEL ); -zalloc_cpumask_var (&cpu_data (i).llc_shared_map,GFP_KERNEL ); +zalloc_cpumask_var (&per_cpu (cpu_llc_shared_map, i),GFP_KERNEL ); }set_cpu_sibling_map (0 );
Quoted 11 lines · Yinghai Lu
cpu_infois already withper_cpu, We can takellc_shared_mapout ofcpu_info, and declare it asper_cpuvariable directly.So later referencing could be simple and directly instead of diving to find
cpu_infoat first.Also could make
smp_store_cpu_info()much simple to avoid to do save and restore trick.Signed-off-by Yinghai Lu <[email protected]>
Yep, it's only natural to do that.
Signature · 8 lines
Regards/Gruss, Boris. Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach General Managers: Alberto Bozzo, Andrew Bowd Registration: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
Commit-ID: b3d7336db553d318e7ec042eb50a70d307013339 Gitweb: http://git.kernel.org/tip/b3d7336db553d318e7ec042eb50a70d307013339 Author: Yinghai Lu <[email protected]> AuthorDate: Fri, 21 Jan 2011 15:29:44 -0800 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 26 Jan 2011 08:44:49 +0100
x86: Move llc_shared_map out of cpu_info
cpu_info is already with per_cpu, We can take llc_shared_map out of cpu_info, and declare it as per_cpu variable directly.
So later referencing could be simple and directly instead of diving to find cpu_info at first.
Also could make smp_store_cpu_info() much simple to avoid to do save and restore trick.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/processor.h | 4 --- arch/x86/include/asm/smp.h | 7 ++++++ arch/x86/kernel/cpu/intel_cacheinfo.c | 4 +- arch/x86/kernel/cpu/mcheck/mce_amd.c | 7 +---- arch/x86/kernel/smpboot.c | 38 ++++++++------------------------ 5 files changed, 21 insertions(+), 39 deletions(-)
arch/x86/include/asm/processor.h +0 -4
@@ -94,10 +94,6 @@ struct cpuinfo_x86 {int x86_cache_alignment;/* In bytes */ int x86_power;unsigned long loops_per_jiffy; -#ifdef CONFIG_SMP -/* cpus sharing the last level cache: */ -cpumask_var_t llc_shared_map; -#endif /* cpuid returned max cores value: */ u16 x86_max_cores;u16 apicid;
arch/x86/include/asm/smp.h +7 -0
@@ -23,6 +23,8 @@ extern unsigned int num_processors;DECLARE_PER_CPU (cpumask_var_t, cpu_sibling_map);DECLARE_PER_CPU (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);
@@ -36,6 +38,11 @@ static inline struct cpumask *cpu_core_mask(int cpu)return per_cpu (cpu_core_map, cpu); } +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);
arch/x86/kernel/cpu/intel_cacheinfo.c +2 -2
@@ -732,11 +732,11 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)struct cpuinfo_x86 *c = &cpu_data (cpu);if ((index ==3 ) && (c->x86_vendor ==X86_VENDOR_AMD )) { -for_each_cpu (i, c->llc_shared_map) { +for_each_cpu (i,cpu_llc_shared_mask (cpu)) {if (!per_cpu (ici_cpuid4_info, i))continue ; this_leaf =CPUID4_INFO_IDX (i, index); -for_each_cpu (sibling, c->llc_shared_map) { +for_each_cpu (sibling,cpu_llc_shared_mask (cpu)) {if (!cpu_online (sibling))continue ;set_bit (sibling, this_leaf->shared_cpu_map);
arch/x86/kernel/cpu/mcheck/mce_amd.c +2 -5
@@ -527,15 +527,12 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)int i, err =0 ;struct threshold_bank *b =NULL ;char name[32 ]; -#ifdef CONFIG_SMP -struct cpuinfo_x86 *c = &cpu_data (cpu); -#endif sprintf (name,"threshold_bank%i" , bank);#ifdef CONFIG_SMP if (cpu_data (cpu).cpu_core_id && shared_bank[bank]) {/* symlink */ - i =cpumask_first (c->llc_shared_map); + i =cpumask_first (cpu_llc_shared_mask (cpu));/* first core not up yet */ if (cpu_data (i).cpu_core_id)
@@ -555,7 +552,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)if (err) goto out; -cpumask_copy (b->cpus, c->llc_shared_map); +cpumask_copy (b->cpus,cpu_llc_shared_mask (cpu));per_cpu (threshold_banks, cpu)[bank] = b; goto out;
arch/x86/kernel/smpboot.c +10 -28
@@ -130,6 +130,8 @@ EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);DEFINE_PER_CPU (cpumask_var_t, cpu_core_map);EXPORT_PER_CPU_SYMBOL (cpu_core_map); +DEFINE_PER_CPU (cpumask_var_t, cpu_llc_shared_map); +/* Per CPU bogomips and other parameters */ DEFINE_PER_CPU_SHARED_ALIGNED(struct cpuinfo_x86, cpu_info);EXPORT_PER_CPU_SYMBOL (cpu_info);
@@ -355,23 +357,6 @@ notrace static void __cpuinit start_secondary(void *unused)cpu_idle (); } -#ifdef CONFIG_CPUMASK_OFFSTACK -/* In this case, llc_shared_map is a pointer to a cpumask. */ -static inline void copy_cpuinfo_x86 (struct cpuinfo_x86 *dst, -const struct cpuinfo_x86 *src) -{ -struct cpumask *llc = dst->llc_shared_map; - *dst = *src; - dst->llc_shared_map = llc; -} -#else -static inline void copy_cpuinfo_x86 (struct cpuinfo_x86 *dst, -const struct cpuinfo_x86 *src) -{ - *dst = *src; -} -#endif /* CONFIG_CPUMASK_OFFSTACK */ -/* * The bootstrap kernel entry code has set these up. Save them for * a given CPU
@@ -381,7 +366,7 @@ void __cpuinit smp_store_cpu_info(int id) {struct cpuinfo_x86 *c = &cpu_data (id); -copy_cpuinfo_x86 (c, &boot_cpu_data); + *c = boot_cpu_data; c->cpu_index = id;if (id !=0 )identify_secondary_cpu (c);
@@ -389,15 +374,12 @@ void __cpuinit smp_store_cpu_info(int id)static void __cpuinit link_thread_siblings (int cpu1,int cpu2) { -struct cpuinfo_x86 *c1 = &cpu_data (cpu1); -struct cpuinfo_x86 *c2 = &cpu_data (cpu2); -cpumask_set_cpu (cpu1,cpu_sibling_mask (cpu2));cpumask_set_cpu (cpu2,cpu_sibling_mask (cpu1));cpumask_set_cpu (cpu1,cpu_core_mask (cpu2));cpumask_set_cpu (cpu2,cpu_core_mask (cpu1)); -cpumask_set_cpu (cpu1, c2->llc_shared_map); -cpumask_set_cpu (cpu2, c1->llc_shared_map); +cpumask_set_cpu (cpu1,cpu_llc_shared_mask (cpu2)); +cpumask_set_cpu (cpu2,cpu_llc_shared_mask (cpu1)); }
@@ -425,7 +407,7 @@ void __cpuinit set_cpu_sibling_map(int cpu)cpumask_set_cpu (cpu,cpu_sibling_mask (cpu)); } -cpumask_set_cpu (cpu, c->llc_shared_map); +cpumask_set_cpu (cpu,cpu_llc_shared_mask (cpu));if (__this_cpu_read (cpu_info.x86_max_cores) ==1 ) {cpumask_copy (cpu_core_mask (cpu),cpu_sibling_mask (cpu));
@@ -436,8 +418,8 @@ void __cpuinit set_cpu_sibling_map(int cpu)for_each_cpu (i, cpu_sibling_setup_mask) {if (per_cpu (cpu_llc_id, cpu) !=BAD_APICID &&per_cpu (cpu_llc_id, cpu) ==per_cpu (cpu_llc_id, i)) { -cpumask_set_cpu (i, c->llc_shared_map); -cpumask_set_cpu (cpu,cpu_data (i).llc_shared_map); +cpumask_set_cpu (i,cpu_llc_shared_mask (cpu)); +cpumask_set_cpu (cpu,cpu_llc_shared_mask (i)); }if (c->phys_proc_id ==cpu_data (i).phys_proc_id) {cpumask_set_cpu (i,cpu_core_mask (cpu));
@@ -476,7 +458,7 @@ const struct cpumask *cpu_coregroup_mask(int cpu) !(cpu_has(c, X86_FEATURE_AMD_DCM)))return cpu_core_mask (cpu); else - return c->llc_shared_map; + return cpu_llc_shared_mask(cpu); }static void impress_friends (void )
@@ -1103,7 +1085,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)for_each_possible_cpu (i) {zalloc_cpumask_var (&per_cpu (cpu_sibling_map, i),GFP_KERNEL );zalloc_cpumask_var (&per_cpu (cpu_core_map, i),GFP_KERNEL ); -zalloc_cpumask_var (&cpu_data (i).llc_shared_map,GFP_KERNEL ); +zalloc_cpumask_var (&per_cpu (cpu_llc_shared_map, i),GFP_KERNEL ); }set_cpu_sibling_map (0 );