[libvirt] [PATCH v3 2/4] conf: Parse virtio-crypto in the domain XML

Marc Hartmayer mhartmay at linux.vnet.ibm.com
Thu Jul 6 13:19:10 UTC 2017


On Wed, Jul 05, 2017 at 01:17 PM +0200, "Longpeng(Mike)" <longpeng2 at huawei.com> wrote:
> This patch parse the domain XML with virtio-crypto
> support, the virtio-crypto XML looks like this:
>
>   <crypto model='virtio'>
>     <backend type='builtin' queues='1'/>
>   </crypto>
>
> Signed-off-by: Longpeng(Mike) <longpeng2 at huawei.com>
> ---
>  src/conf/domain_conf.c         | 213 ++++++++++++++++++++++++++++++++++++++++-
>  src/conf/domain_conf.h         |  32 +++++++
>  src/libvirt_private.syms       |   4 +
>  src/qemu/qemu_domain_address.c |   1 +
>  src/qemu/qemu_driver.c         |   6 ++
>  src/qemu/qemu_hotplug.c        |   1 +
>  6 files changed, 256 insertions(+), 1 deletion(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c

(snip)

> +
> +    switch ((virDomainCryptoBackend) def->backend) {
> +    case VIR_DOMAIN_CRYPTO_BACKEND_BUILTIN:
> +        queues = virXMLPropString(backends[0], "queues");
> +        if (queues && virStrToLong_ui(queues, NULL, 10, &def->queues) < 0) {
> +            virReportError(VIR_ERR_XML_ERROR,
> +                            _("Malformed 'queues' value '%s'"), queues);
                              ^^
                              Indentation

> +        break;
> +
> +    case VIR_DOMAIN_CRYPTO_BACKEND_LAST:
> +        break;
> +    }
> +
> +    if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
> +        goto error;
> +
> + cleanup:
> +    VIR_FREE(model);
> +    VIR_FREE(backend);
> +    VIR_FREE(queues);
> +    VIR_FREE(backends);
> +    ctxt->node = save;
> +    return def;
> +
> + error:
> +    virDomainCryptoDefFree(def);
> +    def = NULL;
> +    goto cleanup;
> +}
> +
> +
>  static virDomainMemballoonDefPtr
>  virDomainMemballoonDefParseXML(xmlNodePtr node,
>                                 xmlXPathContextPtr ctxt,
> @@ -14643,6 +14752,10 @@ virDomainDeviceDefParse(const char *xmlStr,
>          if (!(dev->data.iommu = virDomainIOMMUDefParseXML(node, ctxt)))
>              goto error;
>          break;
> +    case VIR_DOMAIN_DEVICE_CRYPTO:
> +        if (!(dev->data.crypto = virDomainCryptoDefParseXML(node, ctxt, flags)))
> +            goto error;
> +        break;
>      case VIR_DOMAIN_DEVICE_NONE:
>      case VIR_DOMAIN_DEVICE_LAST:
>          break;
> @@ -17709,6 +17822,22 @@ virDomainDefParseXML(xmlDocPtr xml,
>      }
>      VIR_FREE(nodes);
>
> +    /* Parse the crypto devices */
> +    if ((n = virXPathNodeSet("./devices/crypto", ctxt, &nodes)) < 0)
> +        goto error;
> +    if (n && VIR_ALLOC_N(def->cryptos, n) < 0)
> +        goto error;
> +    for (i = 0; i < n; i++) {
> +        virDomainCryptoDefPtr crypto = virDomainCryptoDefParseXML(nodes[i],
> +                                                                  ctxt,
> +                                                                  flags);
> +        if (!crypto)
> +            goto error;
> +
> +        def->cryptos[def->ncryptos++] = crypto;
> +    }
> +    VIR_FREE(nodes);
> +
>      if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu) < 0)
>          goto error;
>
> @@ -19815,6 +19944,25 @@ virDomainRNGDefCheckABIStability(virDomainRNGDefPtr src,
>
>
>  static bool
> +virDomainCryptoDefCheckABIStability(virDomainCryptoDefPtr src,
> +                                    virDomainCryptoDefPtr dst)
> +{
> +    if (src->model != dst->model) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("Target Crypto model '%s' does not match source '%s'"),
> +                       virDomainCryptoModelTypeToString(dst->model),
> +                       virDomainCryptoModelTypeToString(src->model));
> +        return false;
> +    }
> +
> +    if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
> +        return false;
> +
> +    return true;
> +}
> +
> +
> +static bool
>  virDomainHubDefCheckABIStability(virDomainHubDefPtr src,
>                                   virDomainHubDefPtr dst)
>  {
> @@ -20718,6 +20866,17 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
>          !xmlopt->abi.domain(src, dst))
>          goto error;
>
> +    if (src->ncryptos != dst->ncryptos) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("Target domain crypto device count %zu "
> +                         "does not match source %zu"), dst->ncryptos, src->ncryptos);
> +        goto error;
> +    }
> +
> +    for (i = 0; i < src->ncryptos; i++)
> +        if (!virDomainCryptoDefCheckABIStability(src->cryptos[i], dst->cryptos[i]))
> +            goto error;
> +
>      /* Coverity is not very happy with this - all dead_error_condition */
>  #if !STATIC_ANALYSIS
>      /* This switch statement is here to trigger compiler warning when adding
> @@ -20751,6 +20910,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr src,
>      case VIR_DOMAIN_DEVICE_SHMEM:
>      case VIR_DOMAIN_DEVICE_MEMORY:
>      case VIR_DOMAIN_DEVICE_IOMMU:
> +    case VIR_DOMAIN_DEVICE_CRYPTO:
>          break;
>      }
>  #endif
> @@ -23387,6 +23547,49 @@ virDomainRNGDefFree(virDomainRNGDefPtr def)
>
>
>  static int
> +virDomainCryptoDefFormat(virBufferPtr buf,
> +                         virDomainCryptoDefPtr def,
> +                         unsigned int flags)
> +{
> +    const char *model = virDomainCryptoModelTypeToString(def->model);
> +    const char *backend = virDomainCryptoBackendTypeToString(def->backend);
> +
> +    virBufferAsprintf(buf, "<crypto model='%s'>\n", model);
> +    virBufferAdjustIndent(buf, 2);
> +    virBufferAsprintf(buf, "<backend type='%s'", backend);
> +
> +    switch ((virDomainCryptoBackend) def->backend) {
> +    case VIR_DOMAIN_CRYPTO_BACKEND_BUILTIN:
> +        if (def->queues)
> +            virBufferAsprintf(buf, " queues='%u'", def->queues);
> +
> +        virBufferAddLit(buf, "/>\n");
> +        break;
> +
> +    case VIR_DOMAIN_CRYPTO_BACKEND_LAST:
> +        break;
> +    }
> +
> +    if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
> +        return -1;
> +
> +    virBufferAdjustIndent(buf, -2);
> +    virBufferAddLit(buf, "</crypto>\n");
> +    return 0;
> +}
> +
> +void
> +virDomainCryptoDefFree(virDomainCryptoDefPtr def)
> +{
> +    if (!def)
> +        return;
> +
> +    virDomainDeviceInfoClear(&def->info);
> +    VIR_FREE(def);
> +}

You should add 'virDomainCryptoDefFree' to libvirt_private.syms.

> +
> +
> +static int
>  virDomainMemorySourceDefFormat(virBufferPtr buf,
>                                 virDomainMemoryDefPtr def)
>  {
> @@ -25418,6 +25621,11 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>              goto error;


Beste Grüße / Kind regards
   Marc Hartmayer

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294





More information about the libvir-list mailing list