提交 6f802c4b 编写于 作者: T Tejun Heo 提交者: Ingo Molnar

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: NTejun 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: NIngo Molnar <mingo@elte.hu>
上级 4c321ff8
...@@ -1248,6 +1248,14 @@ void __cpuinit setup_local_APIC(void) ...@@ -1248,6 +1248,14 @@ void __cpuinit setup_local_APIC(void)
*/ */
apic->init_apic_ldr(); apic->init_apic_ldr();
#ifdef CONFIG_X86_32
/*
* APIC LDR is initialized. Fetch and store logical_apic_id.
*/
early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
logical_smp_processor_id();
#endif
/* /*
* Set Task Priority to 'accept all'. We never change this * Set Task Priority to 'accept all'. We never change this
* later on. * later on.
......
...@@ -73,8 +73,8 @@ void default_send_IPI_mask_sequence_logical(const struct cpumask *mask, ...@@ -73,8 +73,8 @@ void default_send_IPI_mask_sequence_logical(const struct cpumask *mask,
local_irq_save(flags); local_irq_save(flags);
for_each_cpu(query_cpu, mask) for_each_cpu(query_cpu, mask)
__default_send_IPI_dest_field( __default_send_IPI_dest_field(
apic->cpu_to_logical_apicid(query_cpu), vector, early_per_cpu(x86_cpu_to_logical_apicid, query_cpu),
apic->dest_logical); vector, apic->dest_logical);
local_irq_restore(flags); local_irq_restore(flags);
} }
...@@ -92,8 +92,8 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, ...@@ -92,8 +92,8 @@ void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask,
if (query_cpu == this_cpu) if (query_cpu == this_cpu)
continue; continue;
__default_send_IPI_dest_field( __default_send_IPI_dest_field(
apic->cpu_to_logical_apicid(query_cpu), vector, early_per_cpu(x86_cpu_to_logical_apicid, query_cpu),
apic->dest_logical); vector, apic->dest_logical);
} }
local_irq_restore(flags); local_irq_restore(flags);
} }
......
...@@ -168,19 +168,18 @@ static void unmap_cpu_to_node(int cpu) ...@@ -168,19 +168,18 @@ static void unmap_cpu_to_node(int cpu)
static void map_cpu_to_logical_apicid(void) static void map_cpu_to_logical_apicid(void)
{ {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
int apicid = logical_smp_processor_id(); int logical_apicid = early_per_cpu(x86_cpu_to_logical_apicid, cpu);
int node = apic->apicid_to_node(apicid); int node;
node = apic->apicid_to_node(logical_apicid);
if (!node_online(node)) if (!node_online(node))
node = first_online_node; node = first_online_node;
early_per_cpu(x86_cpu_to_logical_apicid, cpu) = apicid;
map_cpu_to_node(cpu, node); map_cpu_to_node(cpu, node);
} }
void numa_remove_cpu(int cpu) void numa_remove_cpu(int cpu)
{ {
early_per_cpu(x86_cpu_to_logical_apicid, cpu) = BAD_APICID;
unmap_cpu_to_node(cpu); unmap_cpu_to_node(cpu);
} }
#else #else
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册