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

Martin Kletzander mkletzan at redhat.com
Thu Sep 15 16:14:30 UTC 2016


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
@@ -6747,7 +6747,7 @@ qemu-kvm -net nic,model=? /dev/null
 <pre>
   ...
   <devices>
-    <shmem name='my_shmem0'>
+    <shmem name='my_shmem0' role='peer'>
       <size unit='M'>4</size>
     </shmem>
     <shmem name='shmem_server'>
@@ -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.
     </dd>
     <dt><code>size</code></dt>
     <dd>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 3fb4f3999a01..fd7d52d72515 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3584,6 +3584,14 @@
   <define name="shmem">
     <element name="shmem">
       <attribute name="name"/>
+      <optional>
+        <attribute name="role">
+          <choice>
+            <value>master</value>
+            <value>peer</value>
+          </choice>
+        </attribute>
+      </optional>
       <interleave>
         <optional>
           <element name="model">
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
@@ -846,6 +846,11 @@ VIR_ENUM_IMPL(virDomainMemoryModel, VIR_DOMAIN_MEMORY_MODEL_LAST,
 VIR_ENUM_IMPL(virDomainShmemModel, VIR_DOMAIN_SHMEM_MODEL_LAST,
               "ivshmem")

+VIR_ENUM_IMPL(virDomainShmemRole, VIR_DOMAIN_SHMEM_ROLE_LAST,
+              "default",
+              "master",
+              "peer")
+
 static virClassPtr virDomainObjClass;
 static virClassPtr virDomainXMLOptionClass;
 static void virDomainObjDispose(void *obj);
@@ -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;
+    }
+
+    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;
+    }
+
     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",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 5556b6d535f0..bd674a565373 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1560,10 +1560,20 @@ typedef enum {
     VIR_DOMAIN_SHMEM_MODEL_LAST
 } virDomainShmemModel;

+typedef enum {
+    VIR_DOMAIN_SHMEM_ROLE_DEFAULT,
+
+    VIR_DOMAIN_SHMEM_ROLE_MASTER,
+    VIR_DOMAIN_SHMEM_ROLE_PEER,
+
+    VIR_DOMAIN_SHMEM_ROLE_LAST
+} virDomainShmemRole;
+
 struct _virDomainShmemDef {
     char *name;
     unsigned long long size;
     int model; /* enum virDomainShmemModel */
+    int role; /* enum virDomainShmemRole */
     struct {
         bool enabled;
         virDomainChrSourceDef chr;
@@ -3052,6 +3062,7 @@ VIR_ENUM_DECL(virDomainMemoryModel)
 VIR_ENUM_DECL(virDomainMemoryBackingModel)
 VIR_ENUM_DECL(virDomainIOMMUModel)
 VIR_ENUM_DECL(virDomainShmemModel)
+VIR_ENUM_DECL(virDomainShmemRole)
 /* from libvirt.h */
 VIR_ENUM_DECL(virDomainState)
 VIR_ENUM_DECL(virDomainNostateReason)
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml b/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
index b56e9e187895..977947eb3355 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
@@ -20,10 +20,10 @@
     <input type='keyboard' bus='ps2'/>
     <memballoon model='none'/>
     <shmem name='shmem0'/>
-    <shmem name='shmem1'>
+    <shmem name='shmem1' role='peer'>
       <size unit='M'>128</size>
     </shmem>
-    <shmem name='shmem2'>
+    <shmem name='shmem2' role='master'>
       <size unit='M'>256</size>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
     </shmem>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
index 5602913648bc..0a1579155170 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
@@ -25,12 +25,12 @@
       <model type='ivshmem'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
     </shmem>
-    <shmem name='shmem1'>
+    <shmem name='shmem1' role='peer'>
       <model type='ivshmem'/>
       <size unit='M'>128</size>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
     </shmem>
-    <shmem name='shmem2'>
+    <shmem name='shmem2' role='master'>
       <model type='ivshmem'/>
       <size unit='M'>256</size>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
-- 
2.10.0




More information about the libvir-list mailing list