[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH v5 09/10] spapr: CPU hot unplug support
From: |
Bharata B Rao |
Subject: |
[Qemu-ppc] [PATCH v5 09/10] spapr: CPU hot unplug support |
Date: |
Fri, 20 Nov 2015 18:24:38 +0530 |
Support hot removal of CPU for sPAPR guests by sending the hot unplug
notification to the guest via EPOW interrupt. Release the vCPU object
after CPU hot unplug so that vCPU fd can be parked and reused.
Signed-off-by: Bharata B Rao <address@hidden>
---
hw/ppc/spapr.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 4434d45..6dca553 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2401,11 +2401,82 @@ static void spapr_machine_device_plug(HotplugHandler
*hotplug_dev,
}
}
+static void spapr_cpu_destroy(PowerPCCPU *cpu)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+
+ xics_cpu_destroy(spapr->icp, cpu);
+ qemu_unregister_reset(spapr_cpu_reset, cpu);
+}
+
+static void spapr_cpu_release(DeviceState *dev, void *opaque)
+{
+ CPUState *cs;
+ int i;
+ int id = ppc_get_vcpu_dt_id(POWERPC_CPU(CPU(dev)));
+
+ for (i = id; i < id + smp_threads; i++) {
+ CPU_FOREACH(cs) {
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+
+ if (i == ppc_get_vcpu_dt_id(cpu)) {
+ spapr_cpu_destroy(cpu);
+ cpu_remove(cs);
+ }
+ }
+ }
+}
+
+static int spapr_cpu_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp)
+{
+ CPUState *cs = CPU(dev);
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ int id = ppc_get_vcpu_dt_id(cpu);
+ int smt = kvmppc_smt_threads();
+ sPAPRDRConnector *drc =
+ spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
+ sPAPRDRConnectorClass *drck;
+ Error *local_err = NULL;
+
+ /*
+ * SMT threads return from here, only main thread (core) will
+ * continue and signal hot unplug event to the guest.
+ */
+ if ((id % smt) != 0) {
+ return 0;
+ }
+ g_assert(drc);
+
+ drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+ drck->detach(drc, dev, spapr_cpu_release, NULL, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return -1;
+ }
+
+ /*
+ * In addition to hotplugged CPUs, send the hot-unplug notification
+ * interrupt to the guest for coldplugged CPUs started via -device
+ * option too.
+ */
+ spapr_hotplug_req_remove_by_index(drc);
+ return 0;
+}
+
static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
+ sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine());
+
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
error_setg(errp, "Memory hot unplug not supported by sPAPR");
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+ if (!smc->dr_cpu_enabled) {
+ error_setg(errp, "CPU hot unplug not supported on this machine");
+ return;
+ }
+ spapr_cpu_unplug(hotplug_dev, dev, errp);
}
}
--
2.1.0
- [Qemu-ppc] [PATCH v5 06/10] xics_kvm: Add cpu_destroy method to XICS, (continued)
- [Qemu-ppc] [PATCH v5 06/10] xics_kvm: Add cpu_destroy method to XICS, Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 02/10] exec: Remove cpu from cpus list during cpu_exec_exit(), Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 07/10] spapr: Enable CPU hotplug for pseries-2.5 and add CPU DRC DT entries, Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 08/10] spapr: CPU hotplug support, Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 03/10] exec: Do vmstate unregistration from cpu_exec_exit(), Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 09/10] spapr: CPU hot unplug support,
Bharata B Rao <=
- [Qemu-ppc] [PATCH v5 10/10] target-ppc: Enable CPU hotplug for POWER8 CPU family, Bharata B Rao, 2015/11/20
- [Qemu-ppc] [PATCH v5 01/10] vl: Don't allow CPU toplogies with partially filled cores, Bharata B Rao, 2015/11/20
- Re: [Qemu-ppc] [Qemu-devel] [PATCH v5 00/10] sPAPR CPU hotplug, Peter Krempa, 2015/11/23