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>
This commit is contained in:
Родитель
4c321ff8a0
Коммит
6f802c4bfa
|
@ -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,
|
||||||
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,
|
||||||
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)
|
||||||
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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче