aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-01-23 08:37:31 -0500
committerIngo Molnar <mingo@elte.hu>2011-01-28 08:54:05 -0500
commit6f802c4bfa2acf1bffa8341fe9084da0205d581d (patch)
treec5b7724f18c2470cd1132145e8bd6b681abdcfed /arch/x86/kernel
parent4c321ff8a01a95badf5d5403d80ca4e0ab07fce7 (diff)
x86: Always use x86_cpu_to_logical_apicid for cpu -> logical apic id
Currently, cpu -> logical apic id translation is done by apic->cpu_to_logical_apicid() callback which may or may not use x86_cpu_to_logical_apicid. This is unnecessary as it should always equal logical_smp_processor_id() which is known early during CPU bring up. Initialize x86_cpu_to_logical_apicid after apic->init_apic_ldr() in setup_local_APIC() and always use x86_cpu_to_logical_apicid for cpu -> logical apic id mapping. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: eric.dumazet@gmail.com Cc: yinghai@kernel.org Cc: brgerst@gmail.com Cc: gorcunov@gmail.com Cc: penberg@kernel.org Cc: shaohui.zheng@intel.com Cc: rientjes@google.com LKML-Reference: <1295789862-25482-6-git-send-email-tj@kernel.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/apic/apic.c8
-rw-r--r--arch/x86/kernel/apic/ipi.c8
-rw-r--r--arch/x86/kernel/smpboot.c7
3 files changed, 15 insertions, 8 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 126d5a3b00e9..ae08246f320c 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1248,6 +1248,14 @@ void __cpuinit setup_local_APIC(void)
1248 */ 1248 */
1249 apic->init_apic_ldr(); 1249 apic->init_apic_ldr();
1250 1250
1251#ifdef CONFIG_X86_32
1252 /*
1253 * APIC LDR is initialized. Fetch and store logical_apic_id.
1254 */
1255 early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
1256 logical_smp_processor_id();
1257#endif
1258
1251 /* 1259 /*
1252 * Set Task Priority to 'accept all'. We never change this 1260 * Set Task Priority to 'accept all'. We never change this
1253 * later on. 1261 * later on.
diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c
index 5037736c460d..cce91bf26676 100644
--- a/arch/x86/kernel/apic/ipi.c
+++ b/arch/x86/kernel/apic/ipi.c
@@ -73,8 +73,8 @@ void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,
73 local_irq_save(flags); 73 local_irq_save(flags);
74 for_each_cpu(query_cpu, mask) 74 for_each_cpu(query_cpu, mask)
75 __default_send_IPI_dest_field( 75 __default_send_IPI_dest_field(
76 apic->cpu_to_logical_apicid(query_cpu), vector, 76 early_per_cpu(x86_cpu_to_logical_apicid, query_cpu),
77 apic->dest_logical); 77 vector, apic->dest_logical);
78 local_irq_restore(flags); 78 local_irq_restore(flags);
79} 79}
80 80
@@ -92,8 +92,8 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,
92 if (query_cpu == this_cpu) 92 if (query_cpu == this_cpu)
93 continue; 93 continue;
94 __default_send_IPI_dest_field( 94 __default_send_IPI_dest_field(
95 apic->cpu_to_logical_apicid(query_cpu), vector, 95 early_per_cpu(x86_cpu_to_logical_apicid, query_cpu),
96 apic->dest_logical); 96 vector, apic->dest_logical);
97 } 97 }
98 local_irq_restore(flags); 98 local_irq_restore(flags);
99} 99}
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index df934e46bf53..ca20f6bee3be 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -168,19 +168,18 @@ static void unmap_cpu_to_node(int cpu)
168static void map_cpu_to_logical_apicid(void) 168static void map_cpu_to_logical_apicid(void)
169{ 169{
170 int cpu = smp_processor_id(); 170 int cpu = smp_processor_id();
171 int apicid = logical_smp_processor_id(); 171 int logical_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
172 int node = apic->apicid_to_node(apicid); 172 int node;
173 173
174 node = apic->apicid_to_node(logical_apicid);
174 if (!node_online(node)) 175 if (!node_online(node))
175 node = first_online_node; 176 node = first_online_node;
176 177
177 early_per_cpu(x86_cpu_to_logical_apicid, cpu) = apicid;
178 map_cpu_to_node(cpu, node); 178 map_cpu_to_node(cpu, node);
179} 179}
180 180
181void numa_remove_cpu(int cpu) 181void numa_remove_cpu(int cpu)
182{ 182{
183 early_per_cpu(x86_cpu_to_logical_apicid, cpu) = BAD_APICID;
184 unmap_cpu_to_node(cpu); 183 unmap_cpu_to_node(cpu);
185} 184}
186#else 185#else