Commit 7eaf6534 authored by Xiongfeng Wang's avatar Xiongfeng Wang Committed by Zheng Zengkai
Browse files

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: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Acked-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: default avatarWang ShaoBo <bobo.shaobowang@huawei.com>
Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 121f2a1c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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) { }
+29 −0
Original line number Diff line number Diff line
@@ -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);
+21 −0
Original line number Diff line number Diff line
@@ -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