From ca6ddffe2cdb8ae33fdcdbc7e9cf2d3fbd144277 Mon Sep 17 00:00:00 2001 From: Dmitry Andreev Date: Tue, 24 Nov 2015 15:26:33 +0300 Subject: [PATCH] qemu: add support for hv_crash feature as a panic device Panic device type used depends on 'model' attribute. If no model is specified then device type depends on hypervisor and guest arch. 'pseries' model is used for pSeries guest and 'isa' model is used in other cases. XML: QEMU command line: qemu -cpu ,hv_crash --- src/qemu/qemu_command.c | 60 +++++++++++++++++-- src/qemu/qemu_domain.c | 9 +++ tests/qemuargv2xmltest.c | 1 + .../qemuxml2argv-hyperv-panic.args | 21 +++++++ .../qemuxml2argv-panic-no-address.xml | 2 +- .../qemuxml2argv-pseries-disk.xml | 2 +- .../qemuxml2argv-pseries-nvram.xml | 2 +- tests/qemuxml2argvtest.c | 1 + .../qemuxml2xmlout-panic.xml | 31 ++++++++++ .../qemuxml2xmlout-pseries-panic-missing.xml | 2 +- ...emuxml2xmlout-pseries-panic-no-address.xml | 30 ++++++++++ tests/qemuxml2xmltest.c | 4 +- 12 files changed, 154 insertions(+), 11 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4d00fd963d..e83be585e9 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7577,6 +7577,16 @@ qemuBuildCpuArgStr(virQEMUDriverPtr driver, } } + if (def->panic && + def->panic->model == VIR_DOMAIN_PANIC_MODEL_HYPERV) { + if (!have_cpu) { + virBufferAdd(&buf, default_model, -1); + have_cpu = true; + } + + virBufferAddLit(&buf, ",hv_crash"); + } + if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON) { if (!have_cpu) { virBufferAdd(&buf, default_model, -1); @@ -11050,17 +11060,45 @@ qemuBuildCommandLine(virConnectPtr conn, } if (def->panic) { - if (ARCH_IS_PPC64(def->os.arch) && STRPREFIX(def->os.machine, "pseries")) { - /* For pSeries guests, the firmware provides the same - * functionality as the pvpanic device. The address + switch ((virDomainPanicModel) def->panic->model) { + case VIR_DOMAIN_PANIC_MODEL_HYPERV: + /* Panic with model 'hyperv' is not a device, it should + * be configured in cpu commandline. The address * cannot be configured by the user */ + if (!ARCH_IS_X86(def->os.arch)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("only i686 and x86_64 guests support " + "panic device of model 'hyperv'")); + goto error; + } if (def->panic->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("setting the panic device address is not " - "supported for pSeries guests")); + "supported for model 'hyperv'")); goto error; } - } else { + break; + + case VIR_DOMAIN_PANIC_MODEL_PSERIES: + /* For pSeries guests, the firmware provides the same + * functionality as the pvpanic device. The address + * cannot be configured by the user */ + if (!ARCH_IS_PPC64(def->os.arch) || + !STRPREFIX(def->os.machine, "pseries")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("only pSeries guests support panic device " + "of model 'pseries'")); + goto error; + } + if (def->panic->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("setting the panic device address is not " + "supported for model 'pseries'")); + goto error; + } + break; + + case VIR_DOMAIN_PANIC_MODEL_ISA: if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PANIC)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("the QEMU binary does not support the " @@ -11085,6 +11123,11 @@ qemuBuildCommandLine(virConnectPtr conn, "with ISA address type")); goto error; } + + /* default model value was changed before in post parse */ + case VIR_DOMAIN_PANIC_MODEL_DEFAULT: + case VIR_DOMAIN_PANIC_MODEL_LAST: + break; } } @@ -12436,6 +12479,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom, if (virCPUDefAddFeature(cpu, feature, policy) < 0) goto cleanup; } + } else if (STREQ(tokens[i], "hv_crash")) { + virDomainPanicDefPtr panic; + if (VIR_ALLOC(panic) < 0) + goto cleanup; + + panic->model = VIR_DOMAIN_PANIC_MODEL_HYPERV; + dom->panic = panic; } else if (STRPREFIX(tokens[i], "hv_")) { const char *token = tokens[i] + 3; /* "hv_" */ const char *feature, *value; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 18513f9bb4..689abc2830 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1350,6 +1350,15 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, } } + if (dev->type == VIR_DOMAIN_DEVICE_PANIC && + dev->data.panic->model == VIR_DOMAIN_PANIC_MODEL_DEFAULT) { + if (ARCH_IS_PPC64(def->os.arch) && + STRPREFIX(def->os.machine, "pseries")) + dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_PSERIES; + else + dev->data.panic->model = VIR_DOMAIN_PANIC_MODEL_ISA; + } + ret = 0; cleanup: diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 34f3e5c111..7759a09488 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -261,6 +261,7 @@ mymain(void) DO_TEST("smp"); DO_TEST("hyperv"); + DO_TEST("hyperv-panic"); DO_TEST("kvm-features"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args b/tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args new file mode 100644 index 0000000000..a9f13e01e3 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-hyperv-panic.args @@ -0,0 +1,21 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-cpu qemu32,hv_crash \ +-m 214 \ +-smp 6 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-monitor unix:/tmp/test-monitor,server,nowait \ +-boot n \ +-usb \ +-net none \ +-serial none \ +-parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-panic-no-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-panic-no-address.xml index 79f8a1e150..f3f3fbb3af 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-panic-no-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-panic-no-address.xml @@ -24,6 +24,6 @@ - + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml index 3a96209803..39f4a1f726 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml @@ -37,6 +37,6 @@ - + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml index 619186a526..2da28323d8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml @@ -20,6 +20,6 @@
- + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index dc8654ed70..a15305d2a5 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -692,6 +692,7 @@ mymain(void) DO_TEST("hyperv", NONE); DO_TEST("hyperv-off", NONE); + DO_TEST("hyperv-panic", NONE); DO_TEST("kvm-features", NONE); DO_TEST("kvm-features-off", NONE); diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml new file mode 100644 index 0000000000..b9595a8481 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic.xml @@ -0,0 +1,31 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + +
+ + + + + + + +
+ + + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml index 9312975800..8fcd644a77 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml @@ -25,6 +25,6 @@
- + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml new file mode 100644 index 0000000000..8fcd644a77 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml @@ -0,0 +1,30 @@ + + QEMUGuest1 + 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 + 524288 + 524288 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-ppc64 + + + + +
+ + + +
+ + + + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index fbb46d6089..0e43ee92de 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -535,7 +535,7 @@ mymain(void) DO_TEST("pseries-nvram"); DO_TEST_DIFFERENT("pseries-panic-missing"); - DO_TEST("pseries-panic-no-address"); + DO_TEST_DIFFERENT("pseries-panic-no-address"); /* These tests generate different XML */ DO_TEST_DIFFERENT("balloon-device-auto"); @@ -591,7 +591,7 @@ mymain(void) DO_TEST("pcihole64-none"); DO_TEST("pcihole64-q35"); - DO_TEST("panic"); + DO_TEST_DIFFERENT("panic"); DO_TEST("panic-isa"); DO_TEST("panic-pseries"); DO_TEST("panic-no-address");