[libvirt] [PATCH 3/7] conf: Use virGICVersion enumeration in virDomainDef

John Ferlan jferlan at redhat.com
Sun Feb 7 14:37:14 UTC 2016



On 02/03/2016 03:25 PM, Andrea Bolognani wrote:
> Instead of allowing any random positive number, restrict the possible
> values to the ones that are part of the virGICVersion enumeration.
> ---
>  src/conf/domain_conf.c   | 15 ++++++++-------
>  src/conf/domain_conf.h   |  3 ++-
>  src/libvirt_private.syms |  5 +++++
>  src/qemu/qemu_command.c  |  8 +++++---
>  4 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 55e7ed9..1785b83 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -15451,8 +15451,8 @@ virDomainDefParseXML(xmlDocPtr xml,
>              node = ctxt->node;
>              ctxt->node = nodes[i];
>              if ((tmp = virXPathString("string(./@version)", ctxt))) {
> -                if (virStrToLong_uip(tmp, NULL, 10, &def->gic_version) < 0 ||
> -                    def->gic_version == 0) {
> +                if ((def->gic_version = virGICVersionTypeFromString(tmp)) < 0 ||
> +                    def->gic_version == VIR_GIC_VERSION_NONE) {
>                      virReportError(VIR_ERR_XML_ERROR,
>                                     _("malformed gic version: %s"), tmp);
>                      goto error;
> @@ -17528,8 +17528,9 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
>      /* GIC version */
>      if (src->gic_version != dst->gic_version) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                       _("Source GIC version '%u' does not match destination '%u'"),
> -                       src->gic_version, dst->gic_version);
> +                       _("Source GIC version '%s' does not match destination '%s'"),
> +                       virGICVersionTypeToString(src->gic_version),
> +                       virGICVersionTypeToString(dst->gic_version));
>          return false;
>      }
>  
> @@ -22206,9 +22207,9 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>              case VIR_DOMAIN_FEATURE_GIC:
>                  if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
>                      virBufferAddLit(buf, "<gic");
> -                    if (def->gic_version)
> -                        virBufferAsprintf(buf, " version='%u'",
> -                                          def->gic_version);
> +                    if (def->gic_version != VIR_GIC_VERSION_NONE)
> +                        virBufferAsprintf(buf, " version='%s'",
> +                                          virGICVersionTypeToString(def->gic_version));

If you went with 'host' being the default from 1/7, then this becomes
optional...

On input the XML would have <gic>; however, on output the XML would be
<gic version='2'> thus tying this domain to using gic v2 unless someone
changes it to '3' (or 'host' or whatever else in the future).  Thus your
5/7 patch to change qemuxml2argv-aarch64-aavmf-virtio-mmio.xml

John
>                      virBufferAddLit(buf, "/>\n");
>                  }
>                  break;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 9fdfdf2..c14857a 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -50,6 +50,7 @@
>  # include "virstoragefile.h"
>  # include "virseclabel.h"
>  # include "virprocess.h"
> +# include "virgic.h"
>  
>  /* forward declarations of all device types, required by
>   * virDomainDeviceDef
> @@ -2262,7 +2263,7 @@ struct _virDomainDef {
>      int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
>      int kvm_features[VIR_DOMAIN_KVM_LAST];
>      unsigned int hyperv_spinlocks;
> -    unsigned int gic_version;
> +    virGICVersion gic_version;
>  
>      /* These options are of type virTristateSwitch: ON = keep, OFF = drop */
>      int caps_features[VIR_DOMAIN_CAPS_FEATURE_LAST];
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 69be352..8e9c986 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1515,6 +1515,11 @@ virFirewallStartRollback;
>  virFirewallStartTransaction;
>  
>  
> +# util/virgic.h
> +virGICVersionTypeFromString;
> +virGICVersionTypeToString;
> +
> +
>  # util/virhash.h
>  virHashAddEntry;
>  virHashAtomicNew;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 8943270..1f2b142 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -56,6 +56,7 @@
>  #include "virtpm.h"
>  #include "virscsi.h"
>  #include "virnuma.h"
> +#include "virgic.h"
>  #if defined(__linux__)
>  # include <linux/capability.h>
>  #endif
> @@ -8007,7 +8008,7 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
>          }
>  
>          if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON) {
> -            if (def->gic_version) {
> +            if (def->gic_version != VIR_GIC_VERSION_NONE) {
>                  if ((def->os.arch != VIR_ARCH_ARMV7L &&
>                       def->os.arch != VIR_ARCH_AARCH64) ||
>                      (STRNEQ(def->os.machine, "virt") &&
> @@ -8022,7 +8023,7 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
>                  /* 2 is the default, so we don't put it as option for
>                   * backwards compatibility
>                   */
> -                if (def->gic_version != 2) {
> +                if (def->gic_version != VIR_GIC_VERSION_2) {
>                      if (!virQEMUCapsGet(qemuCaps,
>                                          QEMU_CAPS_MACH_VIRT_GIC_VERSION)) {
>                          virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> @@ -8032,7 +8033,8 @@ qemuBuildMachineArgStr(virCommandPtr cmd,
>                          return -1;
>                      }
>  
> -                    virBufferAsprintf(&buf, ",gic-version=%d", def->gic_version);
> +                    virBufferAsprintf(&buf, ",gic-version=%s",
> +                                      virGICVersionTypeToString(def->gic_version));
>                  }
>              }
>          }
> 




More information about the libvir-list mailing list