[libvirt] [PATCH v2 15/21] conf: Add target type and model for spapr-vty

Pavel Hrdina phrdina at redhat.com
Thu Nov 23 16:35:42 UTC 2017


On Tue, Nov 21, 2017 at 05:42:25PM +0100, Andrea Bolognani wrote:
> We can finally introduce a specific target model for the spapr-vty
> device used by pSeries guests, which means isa-serial will no longer
> show up to confuse users.
> 
> We make sure migration works in both directions by interpreting the
> isa-serial target type, or the lack of target type, appropriately
> when parsing the guest XML, and skipping the newly-introduced type
> when formatting if for migration. We also verify that spapr-vty is
> not used for non-pSeries guests and add a bunch of test cases.
> 
> This commit is best viewed with 'git diff -w'.

s/diff/show/ since the change would be most likely committed :).

> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1511421
> 
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>
> ---
>  docs/formatdomain.html.in                          | 11 ++--
>  docs/schemas/domaincommon.rng                      |  2 +
>  src/conf/domain_conf.c                             |  4 ++
>  src/conf/domain_conf.h                             |  2 +
>  src/qemu/qemu_command.c                            | 74 ++++++++++------------
>  src/qemu/qemu_domain.c                             | 74 ++++++++++++++++++----
>  src/qemu/qemu_domain_address.c                     |  1 +
>  .../qemuxml2argv-pseries-basic.args                |  2 +-
>  .../qemuxml2argv-pseries-console-native.args       |  1 +
>  .../qemuxml2argv-pseries-console-native.xml        | 17 +++++
>  ...gs => qemuxml2argv-pseries-console-virtio.args} | 10 +--
>  .../qemuxml2argv-pseries-console-virtio.xml        | 19 ++++++
>  .../qemuxml2argv-pseries-cpu-compat-power9.args    |  2 +-
>  .../qemuxml2argv-pseries-cpu-compat.args           |  2 +-
>  .../qemuxml2argv-pseries-cpu-exact.args            |  2 +-
>  .../qemuxml2argv-pseries-cpu-le.args               |  2 +-
>  .../qemuxml2argv-pseries-panic-missing.args        |  2 +-
>  .../qemuxml2argv-pseries-panic-no-address.args     |  2 +-
>  ...qemuxml2argv-pseries-serial+console-native.args |  1 +
>  .../qemuxml2argv-pseries-serial+console-native.xml | 18 ++++++
>  .../qemuxml2argv-pseries-serial-compat.args        |  1 +
>  .../qemuxml2argv-pseries-serial-compat.xml         | 19 ++++++
>  ...qemuxml2argv-pseries-serial-invalid-machine.xml | 19 ++++++
>  ...rgs => qemuxml2argv-pseries-serial-native.args} |  7 +-
>  .../qemuxml2argv-pseries-serial-native.xml         | 16 +++++
>  .../qemuxml2argv-pseries-usb-default.args          |  2 +-
>  .../qemuxml2argv-pseries-usb-kbd.args              |  2 +-
>  .../qemuxml2argv-pseries-usb-multi.args            |  2 +-
>  .../qemuxml2argv-pseries-vio-user-assigned.args    |  4 +-
>  .../qemuxml2argvdata/qemuxml2argv-pseries-vio.args |  4 +-
>  tests/qemuxml2argvtest.c                           | 16 +++++
>  .../qemuxml2xmlout-panic-pseries.xml               |  4 +-
>  .../qemuxml2xmlout-pseries-console-native.xml      |  1 +
>  ...l => qemuxml2xmlout-pseries-console-virtio.xml} | 18 ++----
>  .../qemuxml2xmlout-pseries-cpu-compat-power9.xml   |  4 +-
>  .../qemuxml2xmlout-pseries-cpu-compat.xml          |  4 +-
>  .../qemuxml2xmlout-pseries-cpu-exact.xml           |  4 +-
>  .../qemuxml2xmlout-pseries-panic-missing.xml       |  4 +-
>  .../qemuxml2xmlout-pseries-panic-no-address.xml    |  4 +-
>  ...emuxml2xmlout-pseries-serial+console-native.xml |  1 +
>  .../qemuxml2xmlout-pseries-serial-compat.xml       |  1 +
>  ...ml => qemuxml2xmlout-pseries-serial-native.xml} | 10 ++-
>  tests/qemuxml2xmltest.c                            | 15 +++++
>  43 files changed, 301 insertions(+), 109 deletions(-)
>  create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-native.xml
>  copy tests/qemuxml2argvdata/{qemuxml2argv-pseries-basic.args => qemuxml2argv-pseries-console-virtio.args} (59%)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-console-virtio.xml
>  create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial+console-native.xml
>  create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-compat.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-invalid-machine.xml
>  copy tests/qemuxml2argvdata/{qemuxml2argv-pseries-basic.args => qemuxml2argv-pseries-serial-native.args} (70%)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-serial-native.xml
>  create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-console-native.xml
>  copy tests/qemuxml2xmloutdata/{qemuxml2xmlout-panic-pseries.xml => qemuxml2xmlout-pseries-console-virtio.xml} (71%)
>  create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial+console-native.xml
>  create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-serial-compat.xml
>  copy tests/qemuxml2xmloutdata/{qemuxml2xmlout-panic-pseries.xml => qemuxml2xmlout-pseries-serial-native.xml} (79%)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 2edc61a01..92622d031 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -6530,10 +6530,13 @@ qemu-kvm -net nic,model=? /dev/null
>        specifies the port number. Ports are numbered starting from 0. There are
>        usually 0, 1 or 2 serial ports. There is also an optional
>        <code>type</code> attribute <span class="since">since 1.0.2</span>
> -      which has three choices for its value, one is <code>isa</code>,
> -      then <code>usb</code> and last one is <code>pci</code>.
> -      If <code>type</code> is missing, <code>isa</code> will be used by
> -      default. For <code>usb</code> an optional sub-element
> +      which can be used to pick between <code>isa</code>, <code>usb</code>,
> +      <code>pci</code> and, <span class="since">since 3.10.0</span>,
> +      <code>spapr-vio</code>.
> +      Some values are not compatible with all architecture and machine types;
> +      if the value is missing altogether, libvirt will try to pick an
> +      appropriate default.
> +      For <code>usb</code> an optional sub-element
>        <code><address/></code> with <code>type='usb'</code> can tie the
>        device to a particular controller, <a href="#elementsAddress">documented above</a>.
>        Similarly, <code>pci</code> can be used to attach the device to
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 93beabc5e..b7a13660d 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -3585,6 +3585,7 @@
>          <value>isa</value>
>          <value>usb</value>
>          <value>pci</value>
> +        <value>spapr-vio</value>

Since we cannot reduce isa-serial into isa, I guest having spapr-vio in
addition to other ${BUS}-serial would be weird, so how about
spapr-vio-serial or even only spapr-serial?

>          <!-- Legacy values, for backwards compatibility -->
>          <value>isa-serial</value>
>          <value>usb-serial</value>
> @@ -3600,6 +3601,7 @@
>            <value>isa-serial</value>
>            <value>usb-serial</value>
>            <value>pci-serial</value>
> +          <value>spapr-vty</value>
>          </choice>
>        </attribute>
>      </element>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 0d8c88db9..d90acd31e 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -452,6 +452,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTarget,
>                "isa",
>                "usb",
>                "pci",
> +              "spapr-vio",
>  );
>  
>  VIR_ENUM_IMPL(virDomainChrChannelTarget,
> @@ -479,6 +480,7 @@ VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
>                "isa-serial",
>                "usb-serial",
>                "pci-serial",
> +              "spapr-vty",
>  );
>  
>  VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
> @@ -4051,6 +4053,7 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def)
>  
>          switch ((virDomainChrSerialTargetType) def->serials[0]->targetType) {
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
> +        case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: {
>  
>              /* Create a stub console to match the serial port.
> @@ -24091,6 +24094,7 @@ virDomainChrTargetDefFormat(virBufferPtr buf,
>                  case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
>                      virBufferAddLit(buf, "-serial");
>                      break;
> +                case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
>                  case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
>                  case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
>                      /* No conversion necessary */
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 3e74c635b..dc376de49 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1085,6 +1085,7 @@ typedef enum {
>      VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA,
>      VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB,
>      VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI,
> +    VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO,
>  
>      VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST
>  } virDomainChrSerialTargetType;
> @@ -1117,6 +1118,7 @@ typedef enum {
>      VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL,
>      VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL,
>      VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL,
> +    VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY,
>  
>      VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST
>  } virDomainChrSerialTargetModel;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index d49183931..d1dd60d8f 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -10269,55 +10269,49 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
>  {
>      virBuffer cmd = VIR_BUFFER_INITIALIZER;
>  
> -    if (qemuDomainIsPSeries(def)) {
> -        if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
> -            serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
> -            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_VTY)) {
> -                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                               _("spapr-vty not supported in this QEMU binary"));
> -                goto error;
> -            }
> -
> -            virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
> -                              serial->info.alias);
> +    switch ((virDomainChrSerialTargetModel) serial->targetModel) {
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_SERIAL)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("usb-serial is not supported in this QEMU binary"));
> +            goto error;
>          }
> -    } else {
> -        switch ((virDomainChrSerialTargetModel) serial->targetModel) {
> -        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL:
> -            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_SERIAL)) {
> -                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                               _("usb-serial is not supported in this QEMU binary"));
> -                goto error;
> -            }
> -            break;
> +        break;
>  
> -        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
> -            break;
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL:
> +        break;
>  
> -        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
> -            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_SERIAL)) {
> -                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                               _("pci-serial is not supported with this QEMU binary"));
> -                goto error;
> -            }
> -            break;
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL:
> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_SERIAL)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("pci-serial is not supported with this QEMU binary"));
> +            goto error;
> +        }
> +        break;
>  
> -        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
> -        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
> -            /* Except from _LAST, which is just a guard value and will never
> -             * be used, all of the above are platform devices, which means
> -             * qemuBuildSerialCommandLine() will have taken the appropriate
> -             * branch and we will not have ended up here. */
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("Invalid target type for serial device"));
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPAPR_VTY)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("spapr-vty not supported in this QEMU binary"));
>              goto error;
>          }
> +        break;
>  
> -        virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
> -                          virDomainChrSerialTargetModelTypeToString(serial->targetModel),
> -                          serial->info.alias, serial->info.alias);
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
> +    case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
> +        /* Except from _LAST, which is just a guard value and will never
> +         * be used, all of the above are platform devices, which means
> +         * qemuBuildSerialCommandLine() will have taken the appropriate
> +         * branch and we will not have ended up here. */
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Invalid target type for serial device"));
> +        goto error;
>      }
>  
> +    virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
> +                      virDomainChrSerialTargetModelTypeToString(serial->targetModel),
> +                      serial->info.alias, serial->info.alias);
> +
>      if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
>          goto error;
>  
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 06ce382fa..785a93207 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3491,8 +3491,7 @@ qemuDomainChrSourceDefValidate(const virDomainChrSourceDef *def)
>  
>  
>  static int
> -qemuDomainChrTargetDefValidate(const virDomainDef *def,
> -                               const virDomainChrDef *chr)
> +qemuDomainChrTargetDefValidate(const virDomainChrDef *chr)
>  {
>      switch ((virDomainChrDeviceType) chr->deviceType) {
>      case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
> @@ -3500,11 +3499,6 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
>          /* Validate target type */
>          switch ((virDomainChrSerialTargetType) chr->targetType) {
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
> -            /* Hack required until we have a proper type for pSeries
> -             * serial consoles */
> -            if (qemuDomainIsPSeries(def))
> -                return 0;
> -
>              if (chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
>                  chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA) {
>                  virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> @@ -3534,6 +3528,16 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
>              }
>              break;
>  
> +        case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO:
> +            if (chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
> +                chr->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("Target type 'spapr-vio' requires address "
> +                                 "of type 'spapr-vio'"));
> +                return -1;
> +            }
> +            break;
> +
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE:
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
>              break;
> @@ -3571,6 +3575,16 @@ qemuDomainChrTargetDefValidate(const virDomainDef *def,
>              }
>              break;
>  
> +        case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY:
> +            if (chr->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("Target model '%s' requires "
> +                                 "target type 'spapr-vio'"),
> +                               virDomainChrSerialTargetModelTypeToString(chr->targetModel));
> +                return -1;
> +            }
> +            break;
> +
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE:
>          case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST:
>              break;
> @@ -3596,7 +3610,7 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
>      if (qemuDomainChrSourceDefValidate(dev->source) < 0)
>          return -1;
>  
> -    if (qemuDomainChrTargetDefValidate(def, dev) < 0)
> +    if (qemuDomainChrTargetDefValidate(dev) < 0)
>          return -1;
>  
>      if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL &&
> @@ -3606,6 +3620,17 @@ qemuDomainChrDefValidate(const virDomainChrDef *dev,
>              return -1;
>      }
>  
> +    if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
> +        (dev->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO ||
> +         dev->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY) &&
> +        !qemuDomainIsPSeries(def)) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Serial devices with target type 'spapr-vio' and "
> +                         "target model 'spapr-vty' are only supported on "
> +                         "pSeries guests"));

I know that it's unlikely to happen but what if there will be new model
for spapr-vio?  I would suggest to split this condition:

    if (serial && sparp_vio && !pseries)
        error("spapr-vio is supported only on pSeries machine")

    if (serial && sparp_vty && !pseries)
        error("spapr-vio is supported only on pSeries machine")

Otherwise the patch looks good.

Pavel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20171123/3c07c0a6/attachment-0001.sig>


More information about the libvir-list mailing list