This series is an attempt to provide CPU hotplug support on ARM virt platform. This is based on ACPI GED device. We should enable ACPI support, and use vGICv3 and 64bit CPU to support CPU hotplug. Under KVM accel, the KVM vCPUs is pre-created. Besides, vGIC IRIs is pre-created too. However, QEMU vCPU objects are defer-created. Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
67 lines
2.4 KiB
Diff
67 lines
2.4 KiB
Diff
From 7cfb37c50209208f853c6fbd0df6673a95e03ef9 Mon Sep 17 00:00:00 2001
|
|
From: Keqian Zhu <zhukeqian1@huawei.com>
|
|
Date: Fri, 10 Apr 2020 14:16:40 +0800
|
|
Subject: [PATCH] arm/virt: Add some sanity checks in cpu_pre_plug hook
|
|
|
|
For that user will try to hotplug a CPU when preconditions
|
|
are not satisfied, check these CPU hotplug preconditions in
|
|
pre_plug hook.
|
|
|
|
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
|
---
|
|
hw/arm/virt.c | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
|
index 983084c459..c6a99e683a 100644
|
|
--- a/hw/arm/virt.c
|
|
+++ b/hw/arm/virt.c
|
|
@@ -2086,10 +2086,30 @@ static void virt_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
|
VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
|
|
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(hotplug_dev);
|
|
const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms);
|
|
+ const CPUArchId *cpu_slot = NULL;
|
|
MemoryRegion *sysmem = get_system_memory();
|
|
int smp_cores = ms->smp.cores;
|
|
int smp_threads = ms->smp.threads;
|
|
|
|
+ /* Some hotplug capability checks */
|
|
+
|
|
+ if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) {
|
|
+ error_setg(errp, "Invalid CPU type, expected cpu type: '%s'",
|
|
+ ms->cpu_type);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (dev->hotplugged && !vms->acpi_dev) {
|
|
+ error_setg(errp, "CPU hotplug is disabled: missing acpi device.");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (dev->hotplugged && !vms->cpu_hotplug_enabled) {
|
|
+ error_setg(errp, "CPU hotplug is disabled: "
|
|
+ "should use AArch64 CPU and GICv3.");
|
|
+ return;
|
|
+ }
|
|
+
|
|
/* if cpu idx is not set, set it based on socket/core/thread properties */
|
|
if (cs->cpu_index == UNASSIGNED_CPU_INDEX) {
|
|
int max_socket = ms->smp.max_cpus / smp_threads / smp_cores;
|
|
@@ -2145,6 +2165,13 @@ static void virt_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
|
object_property_set_int(cpuobj, possible_cpus->cpus[cs->cpu_index].arch_id,
|
|
"mp-affinity", NULL);
|
|
|
|
+ cpu_slot = &possible_cpus->cpus[cs->cpu_index];
|
|
+ if (cpu_slot->cpu) {
|
|
+ error_setg(errp, "CPU[%d] with mp_affinity %" PRIu64 " exists",
|
|
+ cs->cpu_index, cpu->mp_affinity);
|
|
+ return;
|
|
+ }
|
|
+
|
|
numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj),
|
|
&error_fatal);
|
|
|
|
--
|
|
2.19.1
|