x86: clean up setup_clear/force_cpu_cap handling
PATCH 1/1 x86: clean up setup_clear/force_cpu_cap handling
Impact: fix and cleanup
setup_force_cpu_cap() only have one user xen
but it should not reuse cleared_cpu_cpus. it will have problem for smp.
need to have cpu_cpus_set array too.
also need to setup handling before all cpus cap AND
--- arch/x86/include/asm/cpufeature.h | 4 ++-- arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/cpu/common.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-)
arch/x86/include/asm/cpufeature.h +2 -2
@@ -190,11 +190,11 @@ extern const char * const x86_power_flag#define clear_cpu_cap (c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability))#define setup_clear_cpu_cap (bit) do { \ clear_cpu_cap(&boot_cpu_data, bit); \ - set_bit(bit, (unsigned long *)cleared_cpu_caps); \ + set_bit(bit, (unsigned long *)cpu_caps_cleared); \ } while (0)#define setup_force_cpu_cap (bit) do { \ set_cpu_cap(&boot_cpu_data, bit); \ - clear_bit(bit, (unsigned long *)cleared_cpu_caps); \ + set_bit(bit, (unsigned long *)cpu_caps_set); \ } while (0)#define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU)
arch/x86/include/asm/processor.h +2 -1
@@ -134,7 +134,8 @@ extern struct cpuinfo_x86 boot_cpu_data;extern struct cpuinfo_x86 new_cpu_data;extern struct tss_struct doublefault_tss; -extern __u32 cleared_cpu_caps[NCAPINTS ]; +extern __u32 cpu_caps_cleared[NCAPINTS ]; +extern __u32 cpu_caps_set[NCAPINTS ];#ifdef CONFIG_SMP DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info);
arch/x86/kernel/cpu/common.c +12 -5
@@ -221,7 +221,8 @@ static char __cpuinit *table_lookup_modereturn NULL ;/* Not found */ } -__u32 cleared_cpu_caps[NCAPINTS ]__cpuinitdata ; +__u32 cpu_caps_cleared[NCAPINTS ]__cpuinitdata ; +__u32 cpu_caps_set[NCAPINTS ]__cpuinitdata ;/* Current gdt points %fs at the "master" per-cpu area: after this, * it's on the real one. */
@@ -706,6 +707,16 @@ static void __cpuinit identify_cpu(struc#endif init_hypervisor (c); + +/* +* Clear/Set all flags overriden by options, need do it +* before following smp all cpus cap AND. +*/ +for (i =0 ; i <NCAPINTS ; i++) { + c->x86_capability[i] &= ~cpu_caps_cleared[i]; + c->x86_capability[i] |= cpu_caps_set[i]; + } +/* * On SMP, boot_cpu_data holds the common feature set between * all CPUs; so make sure that we indicate which features are
@@ -718,10 +729,6 @@ static void __cpuinit identify_cpu(struc boot_cpu_data.x86_capability[i] &= c->x86_capability[i]; } -/* Clear all flags overriden by options */ -for (i =0 ; i <NCAPINTS ; i++) - c->x86_capability[i] &= ~cleared_cpu_caps[i]; -#ifdef CONFIG_X86_MCE /* Init Machine Check Exception if available. */ mcheck_init (c);
Quoted 9 lines · Yinghai Lu
Impact: fix and cleanup
setup_force_cpu_cap()only have one user xen
but it should not reusecleared_cpu_cpus. it will have problem for smp.need to have
cpu_cpus_setarray too.
also need to setup handling before all cpus cap AND
Quoted 7 lines
Signed-off-by Yinghai Lu <[email protected]>--- arch/x86/include/asm/cpufeature.h | 4 ++-- arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/cpu/common.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-)
Rusty, you'll carry this patch in your linux-2.6-boot-params.git tree, right? Merging this in the x86 tree would just needlessly complicate your logistics, right?
Ingo
Quoted 19 lines · Ingo Molnar
Quoted 9 lines · Yinghai Lu
Impact: fix and cleanup
setup_force_cpu_cap()only have one user xen
but it should not reusecleared_cpu_cpus. it will have problem for smp.need to have
cpu_cpus_setarray too.
also need to setup handling before all cpus cap ANDQuoted 7 lines
Signed-off-by Yinghai Lu <[email protected]>--- arch/x86/include/asm/cpufeature.h | 4 ++-- arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/cpu/common.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-)
Quoted 3 lines
Rusty, you'll carry this patch in your linux-2.6-boot-params.git tree, right? Merging this in the x86 tree would just needlessly complicate your logistics, right?
Rusty polished this patch a little bit and put the updated one in his tree. so you may need to pick up the updated one.
YH
Quoted 20 lines · On Saturday 27 December 2008 20:52:34 Ingo Molnar wrote:
Quoted 9 lines · Yinghai Lu
Impact: fix and cleanup
setup_force_cpu_cap()only have one user xen
but it should not reusecleared_cpu_cpus. it will have problem for smp.need to have
cpu_cpus_setarray too.
also need to setup handling before all cpus cap ANDQuoted 7 lines
Signed-off-by Yinghai Lu <[email protected]>--- arch/x86/include/asm/cpufeature.h | 4 ++-- arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/cpu/common.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-)
Quoted 3 lines
Rusty, you'll carry this patch in your linux-2.6-boot-params.git tree, right? Merging this in the x86 tree would just needlessly complicate your logistics, right?
Yep, if you're happy to ack, I'm happy to carry.
Cheers,
Rusty.
Ingo Molnar
Acked-byQuoted 21 lines · Rusty Russell
Quoted 20 lines · On Saturday 27 December 2008 20:52:34 Ingo Molnar wrote:
Quoted 16 lines · Yinghai Lu
Impact: fix and cleanup
setup_force_cpu_cap()only have one user xen
but it should not reusecleared_cpu_cpus. it will have problem for smp.need to have
cpu_cpus_setarray too.
also need to setup handling before all cpus cap ANDSigned-off-by Yinghai Lu <[email protected]>--- arch/x86/include/asm/cpufeature.h | 4 ++-- arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/cpu/common.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-)
Quoted 5 lines
Quoted 3 lines
Rusty, you'll carry this patch in your linux-2.6-boot-params.git tree, right? Merging this in the x86 tree would just needlessly complicate your logistics, right?
Yep, if you're happy to ack, I'm happy to carry.
yeah. And if it breaks, that's your fault ;-)
Ingo