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

Commit 89e5dc21 authored by Tejun Heo's avatar Tejun Heo Committed by Ingo Molnar
Browse files

x86: Replace apic->apicid_to_node() with ->x86_32_numa_cpu_node()



apic->apicid_to_node() is 32bit specific apic operation which
determines NUMA node for a CPU.  Depending on the APIC
implementation, it can be easier to determine NUMA node from
either physical or logical apicid.  Currently,
->apicid_to_node() takes @logical_apicid and calls
hard_smp_processor_id() if the physical apicid is needed.

This prevents NUMA mapping from being queried from a different
CPU, which in turn makes it impossible to initialize NUMA
mapping before SMP bringup.

This patch replaces apic->apicid_to_node() with
->x86_32_numa_cpu_node() which takes @cpu, from which both
logical and physical apicids can easily be determined.  While at
it, drop duplicate implementations from bigsmp_32 and summit_32,
and use the default one.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Reviewed-by: default avatarPekka Enberg <penberg@kernel.org>
Cc: eric.dumazet@gmail.com
Cc: yinghai@kernel.org
Cc: brgerst@gmail.com
Cc: gorcunov@gmail.com
Cc: shaohui.zheng@intel.com
Cc: rientjes@google.com
LKML-Reference: <1295789862-25482-13-git-send-email-tj@kernel.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent df04cf01
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -306,7 +306,6 @@ struct apic {


	void (*setup_apic_routing)(void);
	void (*setup_apic_routing)(void);
	int (*multi_timer_check)(int apic, int irq);
	int (*multi_timer_check)(int apic, int irq);
	int (*apicid_to_node)(int logical_apicid);
	int (*cpu_present_to_apicid)(int mps_cpu);
	int (*cpu_present_to_apicid)(int mps_cpu);
	void (*apicid_to_cpu_present)(int phys_apicid, physid_mask_t *retmap);
	void (*apicid_to_cpu_present)(int phys_apicid, physid_mask_t *retmap);
	void (*setup_portio_remap)(void);
	void (*setup_portio_remap)(void);
@@ -367,6 +366,9 @@ struct apic {
	 * won't be applied properly during early boot in this case.
	 * won't be applied properly during early boot in this case.
	 */
	 */
	int (*x86_32_early_logical_apicid)(int cpu);
	int (*x86_32_early_logical_apicid)(int cpu);

	/* determine CPU -> NUMA node mapping */
	int (*x86_32_numa_cpu_node)(int cpu);
#endif
#endif
};
};


@@ -539,7 +541,7 @@ static inline int default_phys_pkg_id(int cpuid_apic, int index_msb)
	return cpuid_apic >> index_msb;
	return cpuid_apic >> index_msb;
}
}


extern int default_apicid_to_node(int logical_apicid);
extern int default_x86_32_numa_cpu_node(int cpu);


#endif
#endif


+7 −3
Original line number Original line Diff line number Diff line
@@ -2020,10 +2020,14 @@ void default_init_apic_ldr(void)
}
}


#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
int default_apicid_to_node(int logical_apicid)
int default_x86_32_numa_cpu_node(int cpu)
{
{
#ifdef CONFIG_SMP
#ifdef CONFIG_NUMA
	return apicid_2_node[hard_smp_processor_id()];
	int apicid = early_per_cpu(x86_cpu_to_apicid, cpu);

	if (apicid != BAD_APICID)
		return apicid_2_node[apicid];
	return NUMA_NO_NODE;
#else
#else
	return 0;
	return 0;
#endif
#endif
+0 −2
Original line number Original line Diff line number Diff line
@@ -185,7 +185,6 @@ struct apic apic_flat = {
	.ioapic_phys_id_map		= NULL,
	.ioapic_phys_id_map		= NULL,
	.setup_apic_routing		= NULL,
	.setup_apic_routing		= NULL,
	.multi_timer_check		= NULL,
	.multi_timer_check		= NULL,
	.apicid_to_node			= NULL,
	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.apicid_to_cpu_present		= NULL,
	.apicid_to_cpu_present		= NULL,
	.setup_portio_remap		= NULL,
	.setup_portio_remap		= NULL,
@@ -336,7 +335,6 @@ struct apic apic_physflat = {
	.ioapic_phys_id_map		= NULL,
	.ioapic_phys_id_map		= NULL,
	.setup_apic_routing		= NULL,
	.setup_apic_routing		= NULL,
	.multi_timer_check		= NULL,
	.multi_timer_check		= NULL,
	.apicid_to_node			= NULL,
	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.apicid_to_cpu_present		= NULL,
	.apicid_to_cpu_present		= NULL,
	.setup_portio_remap		= NULL,
	.setup_portio_remap		= NULL,
+9 −7
Original line number Original line Diff line number Diff line
@@ -108,12 +108,6 @@ static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask)
	cpumask_set_cpu(cpu, retmask);
	cpumask_set_cpu(cpu, retmask);
}
}


int noop_apicid_to_node(int logical_apicid)
{
	/* we're always on node 0 */
	return 0;
}

static u32 noop_apic_read(u32 reg)
static u32 noop_apic_read(u32 reg)
{
{
	WARN_ON_ONCE((cpu_has_apic && !disable_apic));
	WARN_ON_ONCE((cpu_has_apic && !disable_apic));
@@ -125,6 +119,14 @@ static void noop_apic_write(u32 reg, u32 v)
	WARN_ON_ONCE(cpu_has_apic && !disable_apic);
	WARN_ON_ONCE(cpu_has_apic && !disable_apic);
}
}


#ifdef CONFIG_X86_32
static int noop_x86_32_numa_cpu_node(int cpu)
{
	/* we're always on node 0 */
	return 0;
}
#endif

struct apic apic_noop = {
struct apic apic_noop = {
	.name				= "noop",
	.name				= "noop",
	.probe				= noop_probe,
	.probe				= noop_probe,
@@ -148,7 +150,6 @@ struct apic apic_noop = {
	.ioapic_phys_id_map		= default_ioapic_phys_id_map,
	.ioapic_phys_id_map		= default_ioapic_phys_id_map,
	.setup_apic_routing		= NULL,
	.setup_apic_routing		= NULL,
	.multi_timer_check		= NULL,
	.multi_timer_check		= NULL,
	.apicid_to_node			= noop_apicid_to_node,


	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.cpu_present_to_apicid		= default_cpu_present_to_apicid,
	.apicid_to_cpu_present		= physid_set_mask_of_physid,
	.apicid_to_cpu_present		= physid_set_mask_of_physid,
@@ -194,5 +195,6 @@ struct apic apic_noop = {


#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
	.x86_32_early_logical_apicid	= noop_x86_32_early_logical_apicid,
	.x86_32_early_logical_apicid	= noop_x86_32_early_logical_apicid,
	.x86_32_numa_cpu_node		= noop_x86_32_numa_cpu_node,
#endif
#endif
};
};
+1 −6
Original line number Original line Diff line number Diff line
@@ -86,11 +86,6 @@ static void bigsmp_setup_apic_routing(void)
		nr_ioapics);
		nr_ioapics);
}
}


static int bigsmp_apicid_to_node(int logical_apicid)
{
	return apicid_2_node[hard_smp_processor_id()];
}

static int bigsmp_cpu_present_to_apicid(int mps_cpu)
static int bigsmp_cpu_present_to_apicid(int mps_cpu)
{
{
	if (mps_cpu < nr_cpu_ids)
	if (mps_cpu < nr_cpu_ids)
@@ -221,7 +216,6 @@ struct apic apic_bigsmp = {
	.ioapic_phys_id_map		= bigsmp_ioapic_phys_id_map,
	.ioapic_phys_id_map		= bigsmp_ioapic_phys_id_map,
	.setup_apic_routing		= bigsmp_setup_apic_routing,
	.setup_apic_routing		= bigsmp_setup_apic_routing,
	.multi_timer_check		= NULL,
	.multi_timer_check		= NULL,
	.apicid_to_node			= bigsmp_apicid_to_node,
	.cpu_present_to_apicid		= bigsmp_cpu_present_to_apicid,
	.cpu_present_to_apicid		= bigsmp_cpu_present_to_apicid,
	.apicid_to_cpu_present		= physid_set_mask_of_physid,
	.apicid_to_cpu_present		= physid_set_mask_of_physid,
	.setup_portio_remap		= NULL,
	.setup_portio_remap		= NULL,
@@ -259,4 +253,5 @@ struct apic apic_bigsmp = {
	.safe_wait_icr_idle		= native_safe_apic_wait_icr_idle,
	.safe_wait_icr_idle		= native_safe_apic_wait_icr_idle,


	.x86_32_early_logical_apicid	= bigsmp_early_logical_apicid,
	.x86_32_early_logical_apicid	= bigsmp_early_logical_apicid,
	.x86_32_numa_cpu_node		= default_x86_32_numa_cpu_node,
};
};
Loading