From: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxxxxxxx> On architectures not supporting the Intel specific programmable interval timer, like e.g. S390, starting a domain with a clock definition containing a pit timer results in the error "Option no-kvm-pit-reinjection not supported for this target". By moving the capability enablement for -no-kvm-pit-reinjection from the InitQMPBasic section into the x86_64 and i686 only enablement section all other architectures are no longer automatically enabled. In addition architecture related capabilities enablements were refactored into a new architecture bound capabilities initialization function. Signed-off-by: Boris Fiuczynski <fiuczy@xxxxxxxxxxxxxxxxxx> Signed-off-by: Viktor Mihajlovski <mihajlov@xxxxxxxxxxxxxxxxxx> --- src/qemu/qemu_capabilities.c | 55 ++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a95f23c..028e77c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2367,13 +2367,48 @@ virQEMUCapsInitQMPBasic(virQEMUCapsPtr qemuCaps) virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_USER_CONFIG); virQEMUCapsSet(qemuCaps, QEMU_CAPS_NETDEV_BRIDGE); virQEMUCapsSet(qemuCaps, QEMU_CAPS_SECCOMP_SANDBOX); - virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT); virQEMUCapsSet(qemuCaps, QEMU_CAPS_DTB); virQEMUCapsSet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION); virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_OPT); virQEMUCapsSet(qemuCaps, QEMU_CAPS_DUMP_GUEST_CORE); } +/* Capabilities that are architecture depending + * initialized for QEMU. + */ +static int +virQEMUCapsInitArchQMPBasic(virQEMUCapsPtr qemuCaps, + qemuMonitorPtr mon) +{ + char *archstr = NULL; + int ret = -1; + + if (!(archstr = qemuMonitorGetTargetArch(mon))) + return -1; + + if ((qemuCaps->arch = virQEMUCapsArchFromString(archstr)) == VIR_ARCH_NONE) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown QEMU arch %s"), archstr); + goto cleanup; + } + + /* + * Currently only x86_64 and i686 support PCI-multibus, + * -no-acpi and -no-kvm-pit-reinjection. + */ + if (qemuCaps->arch == VIR_ARCH_X86_64 || + qemuCaps->arch == VIR_ARCH_I686) { + virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_ACPI); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_KVM_PIT); + } + + ret = 0; + +cleanup: + VIR_FREE(archstr); + return ret; +} static int virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, @@ -2391,7 +2426,6 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, char *monarg = NULL; char *monpath = NULL; char *pidfile = NULL; - char *archstr; pid_t pid = 0; virDomainObj vm; @@ -2508,23 +2542,8 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, if (qemuCaps->version >= 1003000) virQEMUCapsSet(qemuCaps, QEMU_CAPS_MACHINE_USB_OPT); - if (!(archstr = qemuMonitorGetTargetArch(mon))) - goto cleanup; - - if ((qemuCaps->arch = virQEMUCapsArchFromString(archstr)) == VIR_ARCH_NONE) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown QEMU arch %s"), archstr); - VIR_FREE(archstr); + if (virQEMUCapsInitArchQMPBasic(qemuCaps, mon) < 0) goto cleanup; - } - VIR_FREE(archstr); - - /* Currently only x86_64 and i686 support PCI-multibus and -no-acpi. */ - if (qemuCaps->arch == VIR_ARCH_X86_64 || - qemuCaps->arch == VIR_ARCH_I686) { - virQEMUCapsSet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS); - virQEMUCapsSet(qemuCaps, QEMU_CAPS_NO_ACPI); - } if (virQEMUCapsProbeQMPCommands(qemuCaps, mon) < 0) goto cleanup; -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list