[libvirt] [PATCHv5 4/9] qemu: add support for hv_crash feature as a panic device

Jiri Denemark jdenemar at redhat.com
Wed Nov 25 14:08:43 UTC 2015


On Tue, Nov 24, 2015 at 15:26:33 +0300, Dmitry Andreev wrote:
> 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:
> <devices>
>   <panic model='hyperv'/>
> </devices>
> 
> QEMU command line:
> qemu -cpu <cpu_model>,hv_crash
> ---
> v5:
> * autoselection of panic device model in post parse was moved
>   from another patch
> * ARCH_IS_X86 check for 'hyperv' panic device was added
> 
>  src/qemu/qemu_command.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-----
>  src/qemu/qemu_domain.c  |  9 ++++++++
>  2 files changed, 64 insertions(+), 5 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 4d00fd9..bb6d5fe 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
...
> @@ -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 architectures are 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:
> +            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 "
> +                                 "of model 'pseries'"));
> +                goto error;
> +            }
> +            break;

This could be reorganized a bit so that the flow is similar to heprv
panic model.

> +
> +        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 "

Some tests fail after this patch, the next patch (5/9) needs to be
squashed in this one to make them succeed again. The following patch
(6/9) is not necessary, but it is small enough and it logically fits
here, which makes it a good candidate for squashing.

ACK with patches 5/9 and 6/9, and the following diff squashed in.

Jirka

diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c
index bb6d5fe..e83be58 100644
--- i/src/qemu/qemu_command.c
+++ w/src/qemu/qemu_command.c
@@ -11067,7 +11067,7 @@ qemuBuildCommandLine(virConnectPtr conn,
              * cannot be configured by the user */
             if (!ARCH_IS_X86(def->os.arch)) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("only i686 and x86_64 architectures are support "
+                               _("only i686 and x86_64 guests support "
                                  "panic device of model 'hyperv'"));
                 goto error;
             }
@@ -11080,22 +11080,22 @@ qemuBuildCommandLine(virConnectPtr conn,
             break;
 
         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 {
+            /* 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:




More information about the libvir-list mailing list