diff options
| -rw-r--r-- | arch/x86/kernel/apic/apic_numachip.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c index c2fd21fed002..017149cded07 100644 --- a/arch/x86/kernel/apic/apic_numachip.c +++ b/arch/x86/kernel/apic/apic_numachip.c | |||
| @@ -37,10 +37,12 @@ static const struct apic apic_numachip; | |||
| 37 | static unsigned int get_apic_id(unsigned long x) | 37 | static unsigned int get_apic_id(unsigned long x) |
| 38 | { | 38 | { |
| 39 | unsigned long value; | 39 | unsigned long value; |
| 40 | unsigned int id; | 40 | unsigned int id = (x >> 24) & 0xff; |
| 41 | 41 | ||
| 42 | rdmsrl(MSR_FAM10H_NODE_ID, value); | 42 | if (static_cpu_has_safe(X86_FEATURE_NODEID_MSR)) { |
| 43 | id = ((x >> 24) & 0xffU) | ((value << 2) & 0xff00U); | 43 | rdmsrl(MSR_FAM10H_NODE_ID, value); |
| 44 | id |= (value << 2) & 0xff00; | ||
| 45 | } | ||
| 44 | 46 | ||
| 45 | return id; | 47 | return id; |
| 46 | } | 48 | } |
| @@ -155,10 +157,18 @@ static int __init numachip_probe(void) | |||
| 155 | 157 | ||
| 156 | static void fixup_cpu_id(struct cpuinfo_x86 *c, int node) | 158 | static void fixup_cpu_id(struct cpuinfo_x86 *c, int node) |
| 157 | { | 159 | { |
| 158 | if (c->phys_proc_id != node) { | 160 | u64 val; |
| 159 | c->phys_proc_id = node; | 161 | u32 nodes = 1; |
| 160 | per_cpu(cpu_llc_id, smp_processor_id()) = node; | 162 | |
| 163 | this_cpu_write(cpu_llc_id, node); | ||
| 164 | |||
| 165 | /* Account for nodes per socket in multi-core-module processors */ | ||
| 166 | if (static_cpu_has_safe(X86_FEATURE_NODEID_MSR)) { | ||
| 167 | rdmsrl(MSR_FAM10H_NODE_ID, val); | ||
| 168 | nodes = ((val >> 3) & 7) + 1; | ||
| 161 | } | 169 | } |
| 170 | |||
| 171 | c->phys_proc_id = node / nodes; | ||
| 162 | } | 172 | } |
| 163 | 173 | ||
| 164 | static int __init numachip_system_init(void) | 174 | static int __init numachip_system_init(void) |
