提交 7eaf6534 编写于 作者: X Xiongfeng Wang 提交者: Zheng Zengkai

arm64: Add CPU hotplug support

hulk inclusion
category: feature
bugzilla: 47994
CVE: NA

-------------------------------------------------------------------------

To support CPU hotplug, we need to implement 'acpi_(un)map_cpu()' and
'arch_(un)register_cpu()' for ARM64. These functions are called in
'acpi_processor_hotadd_init()/acpi_processor_remove()' when the CPU is hot
added into or hot removed from the system.

Note: This patch only support core hotplug and does not support socket
hotplug because we don't support live configuration of GIC.
Signed-off-by: NXiongfeng Wang <wangxiongfeng2@huawei.com>
Acked-by: NHanjun Guo <guohanjun@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NWang ShaoBo <bobo.shaobowang@huawei.com>
Signed-off-by: NXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: NHanjun Guo <guohanjun@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 121f2a1c
......@@ -45,6 +45,7 @@ void numa_remove_cpu(unsigned int cpu);
static inline void numa_store_cpu_info(unsigned int cpu) { }
static inline void numa_add_cpu(unsigned int cpu) { }
static inline void numa_clear_node(unsigned int cpu) { }
static inline void numa_remove_cpu(unsigned int cpu) { }
static inline void arm64_numa_init(void) { }
static inline void early_map_cpu_to_node(unsigned int cpu, int nid) { }
......
......@@ -27,6 +27,7 @@
#include <linux/pgtable.h>
#include <acpi/ghes.h>
#include <acpi/processor.h>
#include <asm/cputype.h>
#include <asm/cpu_ops.h>
#include <asm/daifflags.h>
......@@ -402,6 +403,34 @@ int apei_claim_sea(struct pt_regs *regs)
return err;
}
int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
int *pcpu)
{
int cpu, nid;
cpu = acpi_map_cpuid(physid, acpi_id);
nid = acpi_get_node(handle);
if (nid != NUMA_NO_NODE) {
set_cpu_numa_node(cpu, nid);
numa_add_cpu(cpu);
}
*pcpu = cpu;
set_cpu_present(cpu, true);
return 0;
}
EXPORT_SYMBOL(acpi_map_cpu);
int acpi_unmap_cpu(int cpu)
{
set_cpu_present(cpu, false);
numa_clear_node(cpu);
return 0;
}
EXPORT_SYMBOL(acpi_unmap_cpu);
void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
{
memblock_mark_nomap(addr, size);
......
......@@ -449,3 +449,24 @@ static int __init register_arm64_panic_block(void)
return 0;
}
device_initcall(register_arm64_panic_block);
#ifdef CONFIG_HOTPLUG_CPU
int arch_register_cpu(int num)
{
struct cpu *cpu = &per_cpu(cpu_data.cpu, num);
cpu->hotpluggable = 1;
return register_cpu(cpu, num);
}
EXPORT_SYMBOL(arch_register_cpu);
void arch_unregister_cpu(int num)
{
struct cpu *cpu = &per_cpu(cpu_data.cpu, num);
unregister_cpu(cpu);
}
EXPORT_SYMBOL(arch_unregister_cpu);
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册