[libvirt] [PATCH 05/20] conf: Add support for shmem role

Peter Krempa pkrempa at redhat.com
Fri Sep 16 07:20:16 UTC 2016


On Thu, Sep 15, 2016 at 18:14:30 +0200, Martin Kletzander wrote:
> Role controls how the domain behaves on migration.
> 
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
>  docs/formatdomain.html.in                         | 10 +++++-
>  docs/schemas/domaincommon.rng                     |  8 +++++
>  src/conf/domain_conf.c                            | 39 ++++++++++++++++++++++-
>  src/conf/domain_conf.h                            | 11 +++++++
>  tests/qemuxml2argvdata/qemuxml2argv-shmem.xml     |  4 +--
>  tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml |  4 +--
>  6 files changed, 70 insertions(+), 6 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index f48a4d8b813f..f4d08959c787 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in

[...]

> @@ -6764,6 +6764,14 @@ qemu-kvm -net nic,model=? /dev/null
>      <dd>
>        The <code>shmem</code> element has one mandatory attribute,
>        <code>name</code> to identify the shared memory.
> +      Optional attribute <code>role</code> can be set to values
> +      "master" or "peer".  The former will mean that upon migration,
> +      the data in the shared memory is migrated with the domain.
> +      There should be only one "master" per shared memory object.
> +      Migration with "peer" role is disabled.  If migration of such
> +      domain is required, the shmem device needs to be unplugged
> +      before migration and plugged in at the destination upon
> +      successful migration.

I'm not in favor of adding the workaround suggestion. I'd change it for
a more thoroguh explanation what this configuration does besides
controlling migratability.

>      </dd>
>      <dt><code>size</code></dt>
>      <dd>

[...]

> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 97cb3de95529..2ccc10515f30 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c

[...]

> @@ -12201,6 +12206,23 @@ virDomainShmemDefParseXML(xmlNodePtr node,
> 
>      ctxt->node = node;
> 
> +    if (!(def->name = virXMLPropString(node, "name"))) {
> +        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                       _("shmem element must contain 'name' attribute"));
> +        goto cleanup;
> +    }

This code is already in the function a few lines after this hunk. You
probably forgot to delete it.

> +
> +    tmp = virXMLPropString(node, "role");
> +    if (tmp) {
> +        if ((def->role = virDomainShmemRoleTypeFromString(tmp)) <= 0) {
> +            virReportError(VIR_ERR_XML_ERROR,
> +                           _("Unknown shmem role type '%s'"), tmp);
> +            goto cleanup;
> +        }
> +
> +        VIR_FREE(tmp);
> +    }
> +
>      tmp = virXPathString("string(./model/@type)", ctxt);
>      if (tmp) {
>          /* If there's none, we will automatically have the first one
> @@ -18704,6 +18726,15 @@ virDomainShmemDefCheckABIStability(virDomainShmemDefPtr src,
>          return false;
>      }
> 
> +    if (src->role != dst->role) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("Target shared memory role '%s' does not match "
> +                         "source role '%s'"),
> +                       virDomainShmemRoleTypeToString(dst->role),
> +                       virDomainShmemRoleTypeToString(src->role));
> +        return false;
> +    }

Is this really guest ABI? Since it's not used in this patch I'll see
later.

> +
>      if (src->model != dst->model) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                         _("Target shared memory model '%s' does not match "
> @@ -21790,8 +21821,14 @@ virDomainShmemDefFormat(virBufferPtr buf,
>                          virDomainShmemDefPtr def,
>                          unsigned int flags)
>  {
> -    virBufferEscapeString(buf, "<shmem name='%s'>\n", def->name);
> +    virBufferEscapeString(buf, "<shmem name='%s'", def->name);
> 
> +    if (def->role) {
> +        virBufferEscapeString(buf, " role='%s'",
> +                              virDomainShmemRoleTypeToString(def->role));
> +    }
> +
> +    virBufferAddLit(buf, ">\n");
>      virBufferAdjustIndent(buf, 2);
> 
>      virBufferAsprintf(buf, "<model type='%s'/>\n",

Peter




More information about the libvir-list mailing list