mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-30 23:37:45 +00:00
As the support for vcpu hotplug is on the road, I pick them up here as experimental to let user try cpu hotplug and virtio-mem on arm64. Fixes: #3280 Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
126 lines
3.2 KiB
Diff
126 lines
3.2 KiB
Diff
From 6b7b492fc89e97e5ee51f9d033000fb6483a5298 Mon Sep 17 00:00:00 2001
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
|
Date: Wed, 1 Dec 2021 16:21:50 +0800
|
|
Subject: [PATCH 4/7] arm64: kernel: Arch specific ACPI hooks(like logical
|
|
cpuid<->hwid etc.)
|
|
|
|
To support virtual cpu hotplug, some arch specifc hooks must be
|
|
facilitated. These hooks are called by the generic ACPI cpu hotplug
|
|
framework during a vcpu hot-(un)plug event handling. The changes
|
|
required involve:
|
|
|
|
1. Allocation of the logical cpuid corresponding to the hwid/mpidr
|
|
2. Mapping of logical cpuid to hwid/mpidr and marking present
|
|
3. Removing vcpu from present mask during hot-unplug
|
|
4. For arm64, all possible cpus are registered within topology_init()
|
|
Hence, we need to override the weak ACPI call of arch_register_cpu()
|
|
(which returns -ENODEV) and return success.
|
|
5. NUMA node mapping set for this vcpu using SRAT Table info during init
|
|
time will be discarded as the logical cpu-ids used at that time
|
|
might not be correct. This mapping will be set again using the
|
|
proximity/node info obtained by evaluating _PXM ACPI method.
|
|
|
|
Note, during hot unplug of vcpu, we do not unmap the association between
|
|
the logical cpuid and hwid/mpidr. This remains persistent.
|
|
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
|
Signed-off-by: Xiongfeng Wang <wangxiongfeng2@huawei.com>
|
|
---
|
|
arch/arm64/kernel/smp.c | 80 +++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 80 insertions(+)
|
|
|
|
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
|
|
index fed4415e8cfe..8ab68ec01090 100644
|
|
--- a/arch/arm64/kernel/smp.c
|
|
+++ b/arch/arm64/kernel/smp.c
|
|
@@ -543,6 +543,86 @@ struct acpi_madt_generic_interrupt *acpi_cpu_get_madt_gicc(int cpu)
|
|
return &cpu_madt_gicc[cpu];
|
|
}
|
|
|
|
+#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
|
+int arch_register_cpu(int num)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int set_numa_node_for_cpu(acpi_handle handle, int cpu)
|
|
+{
|
|
+#ifdef CONFIG_ACPI_NUMA
|
|
+ int node_id;
|
|
+
|
|
+ /* will evaluate _PXM */
|
|
+ node_id = acpi_get_node(handle);
|
|
+ if (node_id != NUMA_NO_NODE)
|
|
+ set_cpu_numa_node(cpu, node_id);
|
|
+#endif
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void unset_numa_node_for_cpu(int cpu)
|
|
+{
|
|
+#ifdef CONFIG_ACPI_NUMA
|
|
+ set_cpu_numa_node(cpu, NUMA_NO_NODE);
|
|
+#endif
|
|
+}
|
|
+
|
|
+static int allocate_logical_cpuid(u64 physid)
|
|
+{
|
|
+ int first_invalid_idx = -1;
|
|
+ bool first = true;
|
|
+ int i;
|
|
+
|
|
+ for_each_possible_cpu(i) {
|
|
+ /*
|
|
+ * logical cpuid<->hwid association remains persistent once
|
|
+ * established
|
|
+ */
|
|
+ if (cpu_logical_map(i) == physid)
|
|
+ return i;
|
|
+
|
|
+ if ((cpu_logical_map(i) == INVALID_HWID) && first) {
|
|
+ first_invalid_idx = i;
|
|
+ first = false;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return first_invalid_idx;
|
|
+}
|
|
+
|
|
+int acpi_unmap_cpu(int cpu)
|
|
+{
|
|
+ set_cpu_present(cpu, false);
|
|
+ unset_numa_node_for_cpu(cpu);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
|
|
+ int *cpuid)
|
|
+{
|
|
+ int cpu;
|
|
+
|
|
+ cpu = allocate_logical_cpuid(physid);
|
|
+ if (cpu < 0) {
|
|
+ pr_warn("Unable to map logical cpuid to physid 0x%llx\n",
|
|
+ physid);
|
|
+ return -ENOSPC;
|
|
+ }
|
|
+
|
|
+ /* map the logical cpu id to cpu MPIDR */
|
|
+ __cpu_logical_map[cpu] = physid;
|
|
+ set_numa_node_for_cpu(handle, cpu);
|
|
+
|
|
+ set_cpu_present(cpu, true);
|
|
+ *cpuid = cpu;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
/*
|
|
* acpi_map_gic_cpu_interface - parse processor MADT entry
|
|
*
|
|
--
|
|
2.17.1
|
|
|