Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f802c4b authored by Tejun Heo's avatar Tejun Heo Committed by Ingo Molnar
Browse files

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: default avatarTejun 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: default avatarIngo Molnar <mingo@elte.hu>
parent 4c321ff8
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -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.
+4 −4
Original line number Original line Diff line number Diff line
@@ -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);
}
}
+3 −4
Original line number Original line Diff line number Diff line
@@ -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