From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: agraf@suse.de, aik@ozlabs.ru, bharata@linux.vnet.ibm.com,
imammedo@redhat.com, mdroth@linux.vnet.ibm.com,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PULL 15/18] spapr: CPU hot unplug support
Date: Fri, 17 Jun 2016 16:36:36 +1000 [thread overview]
Message-ID: <1466145399-32209-16-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1466145399-32209-1-git-send-email-david@gibson.dropbear.id.au>
From: Bharata B Rao <bharata@linux.vnet.ibm.com>
Remove the CPU core device by removing the underlying CPU thread devices.
Hot removal of CPU for sPAPR guests is achieved by sending the hot unplug
notification to the guest. Release the vCPU object after CPU hot unplug so
that vCPU fd can be parked and reused.
Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr.c | 8 ++++++
hw/ppc/spapr_cpu_core.c | 59 +++++++++++++++++++++++++++++++++++++++++
include/hw/ppc/spapr_cpu_core.h | 2 ++
3 files changed, 69 insertions(+)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index c444a86..1dcb9f6 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2313,8 +2313,16 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
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_SPAPR_CPU_CORE)) {
+ if (!smc->dr_cpu_enabled) {
+ error_setg(errp, "CPU hot unplug not supported on this machine");
+ return;
+ }
+ spapr_core_unplug(hotplug_dev, dev, errp);
}
}
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index d5fa4e6..3a5da09 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -38,6 +38,14 @@ static void spapr_cpu_reset(void *opaque)
&error_fatal);
}
+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);
+}
+
void spapr_cpu_init(sPAPRMachineState *spapr, PowerPCCPU *cpu, Error **errp)
{
CPUPPCState *env = &cpu->env;
@@ -88,6 +96,57 @@ char *spapr_get_cpu_core_type(const char *model)
return core_type;
}
+static void spapr_core_release(DeviceState *dev, void *opaque)
+{
+ sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
+ const char *typename = object_class_get_name(sc->cpu_class);
+ size_t size = object_type_get_instance_size(typename);
+ sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+ sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
+ CPUCore *cc = CPU_CORE(dev);
+ int smt = kvmppc_smt_threads();
+ int i;
+
+ for (i = 0; i < cc->nr_threads; i++) {
+ void *obj = sc->threads + i * size;
+ DeviceState *dev = DEVICE(obj);
+ CPUState *cs = CPU(dev);
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+
+ spapr_cpu_destroy(cpu);
+ cpu_remove_sync(cs);
+ object_unparent(obj);
+ }
+
+ spapr->cores[cc->core_id / smt] = NULL;
+
+ g_free(core->threads);
+ object_unparent(OBJECT(dev));
+}
+
+void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp)
+{
+ sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
+ PowerPCCPU *cpu = POWERPC_CPU(core->threads);
+ int id = ppc_get_vcpu_dt_id(cpu);
+ sPAPRDRConnector *drc =
+ spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
+ sPAPRDRConnectorClass *drck;
+ Error *local_err = NULL;
+
+ g_assert(drc);
+
+ drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+ drck->detach(drc, dev, spapr_core_release, NULL, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ spapr_hotplug_req_remove_by_index(drc);
+}
+
void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp)
{
diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h
index 7cb0515..1c9b319 100644
--- a/include/hw/ppc/spapr_cpu_core.h
+++ b/include/hw/ppc/spapr_cpu_core.h
@@ -31,4 +31,6 @@ void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
char *spapr_get_cpu_core_type(const char *model);
void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp);
+void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp);
#endif
--
2.5.5
next prev parent reply other threads:[~2016-06-17 6:35 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-17 6:36 [Qemu-devel] [PULL 00/18] ppc-for-2.7 queue 20160617 David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 01/18] hw/ppc/spapr: Silence deprecation message in qtest mode David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 02/18] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully David Gibson
2016-06-17 13:13 ` Thomas Huth
2016-06-17 6:36 ` [Qemu-devel] [PULL 03/18] target-ppc: Bug in BookE wait instruction David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 04/18] vfio: Fix broken EEH David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 05/18] target-ppc: Fix rlwimi, rlwinm, rlwnm David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 06/18] qdev: hotplug: Introduce HotplugHandler.pre_plug() callback David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 07/18] cpu: Abstract CPU core type David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 08/18] xics, xics_kvm: Handle CPU unplug correctly David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 09/18] spapr_drc: Prevent detach racing against attach for CPU DR David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 10/18] qom: API to get instance_size of a type David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 11/18] spapr: Abstract CPU core device and type specific core devices David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 12/18] spapr: Move spapr_cpu_init() to spapr_cpu_core.c David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 13/18] spapr: convert boot CPUs into CPU core devices David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 14/18] spapr: CPU hotplug support David Gibson
2016-06-17 6:36 ` David Gibson [this message]
2017-01-26 11:32 ` [Qemu-devel] [PULL 15/18] spapr: CPU hot unplug support Igor Mammedov
2017-01-26 14:26 ` Bharata B Rao
2017-01-30 11:53 ` Igor Mammedov
2016-06-17 6:36 ` [Qemu-devel] [PULL 16/18] QMP: Add query-hotpluggable-cpus David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 17/18] hmp: Add 'info hotpluggable-cpus' HMP command David Gibson
2016-06-17 6:36 ` [Qemu-devel] [PULL 18/18] spapr: implement query-hotpluggable-cpus callback David Gibson
2016-06-17 12:35 ` [Qemu-devel] [PULL 00/18] ppc-for-2.7 queue 20160617 Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1466145399-32209-16-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=bharata@linux.vnet.ibm.com \
--cc=imammedo@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).