[libvirt] [PATCHv2 2/3] qemu: add support for hv_crash feature as a panic device
Jiri Denemark
jdenemar at redhat.com
Thu Nov 12 12:03:31 UTC 2015
On Thu, Nov 12, 2015 at 14:07:39 +0300, Dmitry Andreev wrote:
> XML:
> <devices>
> <panic model='hyperv'/>
> </devices>
>
> QEMU command line:
> qemu -cpu <cpu_model>,hv_crash
> ---
> src/qemu/qemu_command.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 42 insertions(+), 6 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 792ada3..6ad4240 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7623,6 +7623,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);
> @@ -11150,17 +11160,36 @@ 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
> - * cannot be configured by the user */
> + switch (def->panic->model) {
Typecast the model to let compiler check we didn't forget any:
switch ((virDomainPanicModel) def->panic->model) {
> + case VIR_DOMAIN_PANIC_MODEL_PSERIES:
> + 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
> + * cannot be configured by the user */
> + 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;
> + }
> + } else {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Only pSeries guests support panic device "
> + "with model 'pseries'"));
> + goto error;
> + }
> + break;
An empty line would be nice here.
> + case VIR_DOMAIN_PANIC_MODEL_HYPERV:
> + /* Panic with model 'hyperv' is not a device, it should
> + * be configured in cpu commandline.*/
> 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;
> + default:
Avoid using default: in switch statements. Explicitly handle all
possible values instead.
> if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PANIC)) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("the QEMU binary does not support the "
> @@ -12534,6 +12563,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;
Jirka
More information about the libvir-list
mailing list