x86/acpi: Set persistent cpuid <-> nodeid mapping when booting
The whole patch-set aims at making cpuid <-> nodeid mapping persistent. So that, when node online/offline happens, cache based on cpuid <-> nodeid mapping such as wq_numa_possible_cpumask will not cause any problem. It contains 4 steps: 1. Enable apic registeration flow to handle both enabled and disabled cpus. 2. Introduce a new array storing all possible cpuid <-> apicid mapping. 3. Enable _MAT and MADT relative apis to return non-present or disabled cpus' apicid. 4. Establish all possible cpuid <-> nodeid mapping. This patch finishes step 4. This patch set the persistent cpuid <-> nodeid mapping for all enabled/disabled processors at boot time via an additional acpi namespace walk for processors. [ tglx: Remove the unneeded exports ] Signed-off-by: Gu Zheng <guz.fnst@cn.fujitsu.com> Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com> Acked-by: Ingo Molnar <mingo@kernel.org> Cc: mika.j.penttila@gmail.com Cc: len.brown@intel.com Cc: rafael@kernel.org Cc: rjw@rjwysocki.net Cc: yasu.isimatu@gmail.com Cc: linux-mm@kvack.org Cc: linux-acpi@vger.kernel.org Cc: isimatu.yasuaki@jp.fujitsu.com Cc: gongzhaogang@inspur.com Cc: tj@kernel.org Cc: izumi.taku@jp.fujitsu.com Cc: cl@linux.com Cc: chen.tang@easystack.cn Cc: akpm@linux-foundation.org Cc: kamezawa.hiroyu@jp.fujitsu.com Cc: lenb@kernel.org Link: http://lkml.kernel.org/r/1472114120-3281-6-git-send-email-douly.fnst@cn.fujitsu.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
8ad893faf2
commit
dc6db24d24
@ -796,7 +796,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
|
|||||||
* ACPI based hotplug CPU support
|
* ACPI based hotplug CPU support
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ACPI_NUMA
|
#ifdef CONFIG_ACPI_NUMA
|
||||||
/*
|
/*
|
||||||
|
@ -702,7 +702,7 @@ static void __init acpi_set_irq_model_ioapic(void)
|
|||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
#include <acpi/processor.h>
|
#include <acpi/processor.h>
|
||||||
|
|
||||||
static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ACPI_NUMA
|
#ifdef CONFIG_ACPI_NUMA
|
||||||
int nid;
|
int nid;
|
||||||
@ -713,6 +713,7 @@ static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
|||||||
numa_set_node(cpu, nid);
|
numa_set_node(cpu, nid);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
|
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu)
|
||||||
|
@ -182,6 +182,11 @@ int __weak arch_register_cpu(int cpu)
|
|||||||
|
|
||||||
void __weak arch_unregister_cpu(int cpu) {}
|
void __weak arch_unregister_cpu(int cpu) {}
|
||||||
|
|
||||||
|
int __weak acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
||||||
|
{
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
static int acpi_processor_hotadd_init(struct acpi_processor *pr)
|
static int acpi_processor_hotadd_init(struct acpi_processor *pr)
|
||||||
{
|
{
|
||||||
unsigned long long sta;
|
unsigned long long sta;
|
||||||
|
@ -1193,6 +1193,7 @@ static int __init acpi_init(void)
|
|||||||
acpi_wakeup_device_init();
|
acpi_wakeup_device_init();
|
||||||
acpi_debugger_init();
|
acpi_debugger_init();
|
||||||
acpi_setup_sb_notify_handler();
|
acpi_setup_sb_notify_handler();
|
||||||
|
acpi_set_processor_mapping();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,6 +280,74 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_get_cpuid);
|
EXPORT_SYMBOL_GPL(acpi_get_cpuid);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
|
static bool __init
|
||||||
|
map_processor(acpi_handle handle, phys_cpuid_t *phys_id, int *cpuid)
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
u32 acpi_id;
|
||||||
|
acpi_status status;
|
||||||
|
acpi_object_type acpi_type;
|
||||||
|
unsigned long long tmp;
|
||||||
|
union acpi_object object = { 0 };
|
||||||
|
struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
|
||||||
|
|
||||||
|
status = acpi_get_type(handle, &acpi_type);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (acpi_type) {
|
||||||
|
case ACPI_TYPE_PROCESSOR:
|
||||||
|
status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
return false;
|
||||||
|
acpi_id = object.processor.proc_id;
|
||||||
|
break;
|
||||||
|
case ACPI_TYPE_DEVICE:
|
||||||
|
status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp);
|
||||||
|
if (ACPI_FAILURE(status))
|
||||||
|
return false;
|
||||||
|
acpi_id = tmp;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0;
|
||||||
|
|
||||||
|
*phys_id = __acpi_get_phys_id(handle, type, acpi_id, false);
|
||||||
|
*cpuid = acpi_map_cpuid(*phys_id, acpi_id);
|
||||||
|
if (*cpuid == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static acpi_status __init
|
||||||
|
set_processor_node_mapping(acpi_handle handle, u32 lvl, void *context,
|
||||||
|
void **rv)
|
||||||
|
{
|
||||||
|
phys_cpuid_t phys_id;
|
||||||
|
int cpu_id;
|
||||||
|
|
||||||
|
if (!map_processor(handle, &phys_id, &cpu_id))
|
||||||
|
return AE_ERROR;
|
||||||
|
|
||||||
|
acpi_map_cpu2node(handle, cpu_id, phys_id);
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init acpi_set_processor_mapping(void)
|
||||||
|
{
|
||||||
|
/* Set persistent cpu <-> node mapping for all processors. */
|
||||||
|
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
|
||||||
|
ACPI_UINT32_MAX, set_processor_node_mapping,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void __init acpi_set_processor_mapping(void) {}
|
||||||
|
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
|
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
|
||||||
static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base,
|
static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base,
|
||||||
u64 *phys_addr, int *ioapic_id)
|
u64 *phys_addr, int *ioapic_id)
|
||||||
|
@ -271,8 +271,11 @@ static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)
|
|||||||
/* Arch dependent functions for cpu hotplug support */
|
/* Arch dependent functions for cpu hotplug support */
|
||||||
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
|
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu);
|
||||||
int acpi_unmap_cpu(int cpu);
|
int acpi_unmap_cpu(int cpu);
|
||||||
|
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid);
|
||||||
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
#endif /* CONFIG_ACPI_HOTPLUG_CPU */
|
||||||
|
|
||||||
|
void acpi_set_processor_mapping(void);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
|
#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
|
||||||
int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
|
int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user