diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2016-08-03 11:52:53 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2016-08-03 11:52:53 +0100 |
commit | 90f54472f407f1d0ad0ccab6f59d65b286f269b2 (patch) | |
tree | f5ac83a5d49e352342593dd355a5cd0f9bc93bd5 | |
parent | 8b54a6a6c63dc84f2744f6b125c1a6c5a16ee10b (diff) | |
parent | 7005f7f81cef31bda895d3274c13854c143d3d8d (diff) | |
download | qemu-90f54472f407f1d0ad0ccab6f59d65b286f269b2.zip qemu-90f54472f407f1d0ad0ccab6f59d65b286f269b2.tar.gz qemu-90f54472f407f1d0ad0ccab6f59d65b286f269b2.tar.bz2 |
Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-2.7-20160803' into staging
qemu-2.7: ppc patch queue 2016-08-03
Here's the current set of patches (only 2) for spapr, ppc and related
things. These are important bugfixes for the stabilizing 2.7 tree.
One is for a regression where confusion between x86 only and generic
KVM irq handling resulted in breakage on KVM/Power. The other is
fixing (yet another) problem in the vcpu hotplug code: older pseries
machine types which don't support vcpu hotplug weren't correctly
advertising that, potentially leading to crashes or other problems.
# gpg: Signature made Wed 03 Aug 2016 06:23:40 BST
# gpg: using RSA key 0x6C38CACA20D9B392
# gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>"
# gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>"
# gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg: It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392
* remotes/dgibson/tags/ppc-for-2.7-20160803:
kvm-irqchip: only commit route when irqchip is used
spapr: Error out when CPU hotplug is attempted on older pseries machines
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | hw/ppc/spapr.c | 7 | ||||
-rw-r--r-- | hw/ppc/spapr_cpu_core.c | 19 | ||||
-rw-r--r-- | kvm-all.c | 8 |
3 files changed, 20 insertions, 14 deletions
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index fbbd051..bce2371 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2376,8 +2376,11 @@ static HotpluggableCPUList *spapr_query_hotpluggable_cpus(MachineState *machine) int i; HotpluggableCPUList *head = NULL; sPAPRMachineState *spapr = SPAPR_MACHINE(machine); + sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine); int spapr_max_cores = max_cpus / smp_threads; + g_assert(smc->dr_cpu_enabled); + for (i = 0; i < spapr_max_cores; i++) { HotpluggableCPUList *list_item = g_new0(typeof(*list_item), 1); HotpluggableCPU *cpu_item = g_new0(typeof(*cpu_item), 1); @@ -2432,7 +2435,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) hc->plug = spapr_machine_device_plug; hc->unplug = spapr_machine_device_unplug; mc->cpu_index_to_socket_id = spapr_cpu_index_to_socket_id; - mc->query_hotpluggable_cpus = spapr_query_hotpluggable_cpus; + if (smc->dr_cpu_enabled) { + mc->query_hotpluggable_cpus = spapr_query_hotpluggable_cpus; + } smc->dr_lmb_enabled = true; smc->dr_cpu_enabled = true; diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index ec81ee6..170ed15 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -166,18 +166,11 @@ void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev, int index = cc->core_id / smp_threads; int smt = kvmppc_smt_threads(); + g_assert(smc->dr_cpu_enabled); + drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index * smt); spapr->cores[index] = OBJECT(dev); - if (!smc->dr_cpu_enabled) { - /* - * This is a cold plugged CPU core but the machine doesn't support - * DR. So skip the hotplug path ensuring that the core is brought - * up online with out an associated DR connector. - */ - return; - } - g_assert(drc); /* @@ -225,13 +218,13 @@ void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, char *base_core_type = spapr_get_cpu_core_type(machine->cpu_model); const char *type = object_get_typename(OBJECT(dev)); - if (strcmp(base_core_type, type)) { - error_setg(&local_err, "CPU core type should be %s", base_core_type); + if (!smc->dr_cpu_enabled) { + error_setg(&local_err, "CPU hotplug not supported for this machine"); goto out; } - if (!smc->dr_cpu_enabled && dev->hotplugged) { - error_setg(&local_err, "CPU hotplug not supported for this machine"); + if (strcmp(base_core_type, type)) { + error_setg(&local_err, "CPU core type should be %s", base_core_type); goto out; } @@ -1047,6 +1047,14 @@ void kvm_irqchip_commit_routes(KVMState *s) { int ret; + if (kvm_gsi_direct_mapping()) { + return; + } + + if (!kvm_gsi_routing_enabled()) { + return; + } + s->irq_routes->flags = 0; trace_kvm_irqchip_commit_routes(); ret = kvm_vm_ioctl(s, KVM_SET_GSI_ROUTING, s->irq_routes); |