127bba
From c07ec81488d9bba54d5ea209479c798f005faa47 Mon Sep 17 00:00:00 2001
127bba
Message-Id: <c07ec81488d9bba54d5ea209479c798f005faa47@dist-git>
127bba
From: Martin Kletzander <mkletzan@redhat.com>
127bba
Date: Fri, 4 Nov 2016 10:29:49 +0100
127bba
Subject: [PATCH] conf, qemu: Add support for shmem model
127bba
127bba
Just the default one now, new ones will be added in following commits.
127bba
127bba
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
127bba
(cherry picked from commit 64530a9c667e4f875992ec0d85cffd2072b8cfd7)
127bba
127bba
https://bugzilla.redhat.com/show_bug.cgi?id=1392031
127bba
127bba
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
127bba
---
127bba
 docs/formatdomain.html.in                         |  8 +++++
127bba
 docs/schemas/domaincommon.rng                     |  9 +++++
127bba
 src/conf/domain_conf.c                            | 44 +++++++++++++++++------
127bba
 src/conf/domain_conf.h                            |  8 +++++
127bba
 src/libvirt_private.syms                          |  2 ++
127bba
 src/qemu/qemu_command.c                           | 11 +++++-
127bba
 tests/qemuxml2argvdata/qemuxml2argv-shmem.xml     |  2 ++
127bba
 tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml |  8 +++++
127bba
 8 files changed, 80 insertions(+), 12 deletions(-)
127bba
127bba
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
127bba
index 4970d61..a39d730 100644
127bba
--- a/docs/formatdomain.html.in
127bba
+++ b/docs/formatdomain.html.in
127bba
@@ -6689,6 +6689,7 @@ qemu-kvm -net nic,model=? /dev/null
127bba
       <size unit='M'>4</size>
127bba
     </shmem>
127bba
     <shmem name='shmem_server'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>2</size>
127bba
       <server path='/tmp/socket-shmem'/>
127bba
       <msi vectors='32' ioeventfd='on'/>
127bba
@@ -6703,6 +6704,13 @@ qemu-kvm -net nic,model=? /dev/null
127bba
       The shmem element has one mandatory attribute,
127bba
       name to identify the shared memory.
127bba
     
127bba
+    
model
127bba
+    
127bba
+      Attribute type of the optional element model
127bba
+      specifies the model of the underlying device providing the
127bba
+      shmem device.  Currently the only supported model is
127bba
+      ivshmem.
127bba
+    
127bba
     
size
127bba
     
127bba
       The optional size element specifies the size of the shared
127bba
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
127bba
index d88ff3e..7d16536 100644
127bba
--- a/docs/schemas/domaincommon.rng
127bba
+++ b/docs/schemas/domaincommon.rng
127bba
@@ -3553,6 +3553,15 @@
127bba
       <attribute name="name"/>
127bba
       <interleave>
127bba
         <optional>
127bba
+          <element name="model">
127bba
+            <attribute name="type">
127bba
+              <choice>
127bba
+                <value>ivshmem</value>
127bba
+              </choice>
127bba
+            </attribute>
127bba
+          </element>
127bba
+        </optional>
127bba
+        <optional>
127bba
           <element name="size">
127bba
             <ref name="scaledInteger"/>
127bba
           </element>
127bba
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
127bba
index 25e4ba2..25b1c63 100644
127bba
--- a/src/conf/domain_conf.c
127bba
+++ b/src/conf/domain_conf.c
127bba
@@ -840,6 +840,9 @@ VIR_ENUM_IMPL(virDomainBlockJob, VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
127bba
 VIR_ENUM_IMPL(virDomainMemoryModel, VIR_DOMAIN_MEMORY_MODEL_LAST,
127bba
               "", "dimm")
127bba
 
127bba
+VIR_ENUM_IMPL(virDomainShmemModel, VIR_DOMAIN_SHMEM_MODEL_LAST,
127bba
+              "ivshmem")
127bba
+
127bba
 static virClassPtr virDomainObjClass;
127bba
 static virClassPtr virDomainXMLOptionClass;
127bba
 static void virDomainObjDispose(void *obj);
127bba
@@ -12267,6 +12270,20 @@ virDomainShmemDefParseXML(xmlNodePtr node,
127bba
 
127bba
     ctxt->node = node;
127bba
 
127bba
+    tmp = virXPathString("string(./model/@type)", ctxt);
127bba
+    if (tmp) {
127bba
+        /* If there's none, we will automatically have the first one
127bba
+         * (as default).  Unfortunately this has to be done for
127bba
+         * compatibility reasons. */
127bba
+        if ((def->model = virDomainShmemModelTypeFromString(tmp)) < 0) {
127bba
+            virReportError(VIR_ERR_XML_ERROR,
127bba
+                           _("Unknown shmem model type '%s'"), tmp);
127bba
+            goto cleanup;
127bba
+        }
127bba
+
127bba
+        VIR_FREE(tmp);
127bba
+    }
127bba
+
127bba
     if (!(def->name = virXMLPropString(node, "name"))) {
127bba
         virReportError(VIR_ERR_XML_ERROR, "%s",
127bba
                        _("shmem element must contain 'name' attribute"));
127bba
@@ -14849,6 +14866,9 @@ virDomainShmemDefEquals(virDomainShmemDefPtr src,
127bba
     if (src->size != dst->size)
127bba
         return false;
127bba
 
127bba
+    if (src->model != dst->model)
127bba
+        return false;
127bba
+
127bba
     if (src->server.enabled != dst->server.enabled)
127bba
         return false;
127bba
 
127bba
@@ -18828,6 +18848,15 @@ virDomainShmemDefCheckABIStability(virDomainShmemDefPtr src,
127bba
         return false;
127bba
     }
127bba
 
127bba
+    if (src->model != dst->model) {
127bba
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
127bba
+                       _("Target shared memory model '%s' does not match "
127bba
+                         "source model '%s'"),
127bba
+                       virDomainShmemModelTypeToString(dst->model),
127bba
+                       virDomainShmemModelTypeToString(src->model));
127bba
+        return false;
127bba
+    }
127bba
+
127bba
     if (src->size != dst->size) {
127bba
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
127bba
                        _("Target shared memory size '%llu' does not match "
127bba
@@ -21849,20 +21878,13 @@ virDomainShmemDefFormat(virBufferPtr buf,
127bba
                         virDomainShmemDefPtr def,
127bba
                         unsigned int flags)
127bba
 {
127bba
-    virBufferEscapeString(buf, "<shmem name='%s'", def->name);
127bba
-
127bba
-    if (!def->size &&
127bba
-        !def->server.enabled &&
127bba
-        !def->msi.enabled &&
127bba
-        !virDomainDeviceInfoNeedsFormat(&def->info, flags)) {
127bba
-        virBufferAddLit(buf, "/>\n");
127bba
-        return 0;
127bba
-    } else {
127bba
-        virBufferAddLit(buf, ">\n");
127bba
-    }
127bba
+    virBufferEscapeString(buf, "<shmem name='%s'>\n", def->name);
127bba
 
127bba
     virBufferAdjustIndent(buf, 2);
127bba
 
127bba
+    virBufferAsprintf(buf, "<model type='%s'/>\n",
127bba
+                      virDomainShmemModelTypeToString(def->model));
127bba
+
127bba
     if (def->size)
127bba
         virBufferAsprintf(buf, "<size unit='M'>%llu</size>\n", def->size >> 20);
127bba
 
127bba
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
127bba
index 594982e..db74d1d 100644
127bba
--- a/src/conf/domain_conf.h
127bba
+++ b/src/conf/domain_conf.h
127bba
@@ -1549,9 +1549,16 @@ struct _virDomainNVRAMDef {
127bba
     virDomainDeviceInfo info;
127bba
 };
127bba
 
127bba
+typedef enum {
127bba
+    VIR_DOMAIN_SHMEM_MODEL_IVSHMEM,
127bba
+
127bba
+    VIR_DOMAIN_SHMEM_MODEL_LAST
127bba
+} virDomainShmemModel;
127bba
+
127bba
 struct _virDomainShmemDef {
127bba
     char *name;
127bba
     unsigned long long size;
127bba
+    int model; /* enum virDomainShmemModel */
127bba
     struct {
127bba
         bool enabled;
127bba
         virDomainChrSourceDef chr;
127bba
@@ -3042,6 +3049,7 @@ VIR_ENUM_DECL(virDomainTPMBackend)
127bba
 VIR_ENUM_DECL(virDomainMemoryModel)
127bba
 VIR_ENUM_DECL(virDomainMemoryBackingModel)
127bba
 VIR_ENUM_DECL(virDomainIOMMUModel)
127bba
+VIR_ENUM_DECL(virDomainShmemModel)
127bba
 /* from libvirt.h */
127bba
 VIR_ENUM_DECL(virDomainState)
127bba
 VIR_ENUM_DECL(virDomainNostateReason)
127bba
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
127bba
index 9b7c26c..bee5676 100644
127bba
--- a/src/libvirt_private.syms
127bba
+++ b/src/libvirt_private.syms
127bba
@@ -460,6 +460,8 @@ virDomainShmemDefFind;
127bba
 virDomainShmemDefFree;
127bba
 virDomainShmemDefInsert;
127bba
 virDomainShmemDefRemove;
127bba
+virDomainShmemModelTypeFromString;
127bba
+virDomainShmemModelTypeToString;
127bba
 virDomainShutdownReasonTypeFromString;
127bba
 virDomainShutdownReasonTypeToString;
127bba
 virDomainShutoffReasonTypeFromString;
127bba
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
127bba
index e668a58..c5d29b4 100644
127bba
--- a/src/qemu/qemu_command.c
127bba
+++ b/src/qemu/qemu_command.c
127bba
@@ -8559,7 +8559,16 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager,
127bba
         return -1;
127bba
     }
127bba
 
127bba
-    if (!(devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps)))
127bba
+    switch ((virDomainShmemModel)shmem->model) {
127bba
+    case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM:
127bba
+        devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps);
127bba
+        break;
127bba
+
127bba
+    case VIR_DOMAIN_SHMEM_MODEL_LAST:
127bba
+        break;
127bba
+    }
127bba
+
127bba
+    if (!devstr)
127bba
         return -1;
127bba
     virCommandAddArgList(cmd, "-device", devstr, NULL);
127bba
     VIR_FREE(devstr);
127bba
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml b/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
127bba
index 5bc4904..b56e9e1 100644
127bba
--- a/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
127bba
+++ b/tests/qemuxml2argvdata/qemuxml2argv-shmem.xml
127bba
@@ -28,6 +28,7 @@
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem3'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>512</size>
127bba
       <server/>
127bba
     </shmem>
127bba
@@ -41,6 +42,7 @@
127bba
       <msi ioeventfd='off'/>
127bba
     </shmem>
127bba
     <shmem name='shmem6'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>4096</size>
127bba
       <server path='/tmp/shmem6-sock'/>
127bba
       <msi vectors='16'/>
127bba
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
127bba
index 1197f36..5602913 100644
127bba
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
127bba
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
127bba
@@ -22,39 +22,47 @@
127bba
     <input type='keyboard' bus='ps2'/>
127bba
     <memballoon model='none'/>
127bba
     <shmem name='shmem0'>
127bba
+      <model type='ivshmem'/>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem1'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>128</size>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem2'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>256</size>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem3'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>512</size>
127bba
       <server/>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem4'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>1024</size>
127bba
       <server path='/tmp/shmem4-sock'/>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem5'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>2048</size>
127bba
       <server path='/tmp/shmem5-sock'/>
127bba
       <msi ioeventfd='off'/>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem6'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>4096</size>
127bba
       <server path='/tmp/shmem6-sock'/>
127bba
       <msi vectors='16'/>
127bba
       <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
127bba
     </shmem>
127bba
     <shmem name='shmem7'>
127bba
+      <model type='ivshmem'/>
127bba
       <size unit='M'>8192</size>
127bba
       <server path='/tmp/shmem7-sock'/>
127bba
       <msi vectors='32' ioeventfd='on'/>
127bba
-- 
127bba
2.10.2
127bba