[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v3 03/19] conf: format/parse/rng/docs for video <driver name='qemu|vhostuser'/>



From: Marc-André Lureau <marcandre lureau redhat com>

Accept a new driver name attribute to specify usage of helper process, ex:

  <video>
    <driver name='vhostuser'/>
    <model type='virtio'/>
  </video>

Signed-off-by: Marc-André Lureau <marcandre lureau redhat com>
---
 docs/formatdomain.html.in                 | 12 ++++++-
 docs/schemas/domaincommon.rng             |  8 +++++
 src/conf/domain_conf.c                    | 42 ++++++++++++++++++++++-
 src/conf/domain_conf.h                    | 12 +++++++
 tests/qemuxml2argvdata/virtio-options.xml |  2 +-
 5 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index fcb7c59c00..f56d04eac3 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -6969,6 +6969,7 @@ qemu-kvm -net nic,model=? /dev/null
     &lt;model type='vga' vram='16384' heads='1'&gt;
       &lt;acceleration accel3d='yes' accel2d='yes'/&gt;
     &lt;/model&gt;
+    &lt;driver name='qemu'/&gt;
   &lt;/video&gt;
 &lt;/devices&gt;
 ...</pre>
@@ -7069,7 +7070,16 @@ qemu-kvm -net nic,model=? /dev/null
       <dd>
         The subelement <code>driver</code> can be used to tune the device:
         <dl>
-          <dt>virtio options</dt>
+          <dt><code>name</code></dt>
+          <dd>
+            Specify the backend driver to use, either "qemu" or
+            "vhostuser" depending on the hypervisor features available
+            (<span class="since">since 5.8.0</span>).  "qemu" is the
+            default QEMU backend. "vhostuser" will use a separate
+            vhost-user process backend (for <code>virtio</code>
+            device).
+          </dd>
+        <dt>virtio options</dt>
           <dd>
           <a href="#elementsVirtio">Virtio-specific options</a> can also be
           set (<span class="since">Since 3.5.0</span>)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index c48f8c4f56..7e0b63f0a6 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3560,6 +3560,14 @@
           <optional>
             <ref name="virtioOptions"/>
           </optional>
+          <optional>
+            <attribute name="name">
+              <choice>
+                <value>qemu</value>
+                <value>vhostuser</value>
+              </choice>
+            </attribute>
+          </optional>
           <optional>
             <attribute name="vgaconf">
               <choice>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b7a342bb91..dc5b7eac5c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -728,6 +728,13 @@ VIR_ENUM_IMPL(virDomainPanicModel,
               "s390",
 );
 
+VIR_ENUM_IMPL(virDomainVideoBackend,
+              VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST,
+              "default",
+              "qemu",
+              "vhostuser",
+);
+
 VIR_ENUM_IMPL(virDomainVideo,
               VIR_DOMAIN_VIDEO_TYPE_LAST,
               "default",
@@ -6249,6 +6256,23 @@ virDomainVideoDefValidate(const virDomainVideoDef *video,
         }
     }
 
+    switch (video->backend) {
+    case VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER:
+        if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("'vhostuser' driver is only supported with 'virtio' device"));
+            return -1;
+        }
+        break;
+    case VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT:
+    case VIR_DOMAIN_VIDEO_BACKEND_TYPE_QEMU:
+        break;
+    case VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST:
+    default:
+        virReportEnumRangeError(virDomainInputType, video->backend);
+        return -1;
+    }
+
     return 0;
 }
 
@@ -15358,6 +15382,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
     xmlNodePtr cur;
     VIR_XPATH_NODE_AUTORESTORE(ctxt);
     VIR_AUTOFREE(char *) type = NULL;
+    VIR_AUTOFREE(char *) driver_name = NULL;
     VIR_AUTOFREE(char *) heads = NULL;
     VIR_AUTOFREE(char *) vram = NULL;
     VIR_AUTOFREE(char *) vram64 = NULL;
@@ -15393,6 +15418,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
             if (virXMLNodeNameEqual(cur, "driver")) {
                 if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
                     goto error;
+                driver_name = virXMLPropString(cur, "name");
             }
         }
         cur = cur->next;
@@ -15408,6 +15434,16 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
         def->type = virDomainVideoDefaultType(dom);
     }
 
+    if (driver_name) {
+        if ((def->backend = virDomainVideoBackendTypeFromString(driver_name)) < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown video driver '%s'"), driver_name);
+            goto error;
+        }
+    } else {
+        def->backend = VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT;
+    }
+
     if (ram) {
         if (def->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
             virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -26463,13 +26499,17 @@ virDomainVideoDefFormat(virBufferPtr buf,
     virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
     if (virBufferCheckError(&driverBuf) < 0)
         goto cleanup;
-    if (virBufferUse(&driverBuf) || (def->driver && def->driver->vgaconf)) {
+    if (virBufferUse(&driverBuf) || (def->driver && def->driver->vgaconf) ||
+        def->backend != VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT) {
         virBufferAddLit(buf, "<driver");
         if (virBufferUse(&driverBuf))
             virBufferAddBuffer(buf, &driverBuf);
         if (def->driver && def->driver->vgaconf)
             virBufferAsprintf(buf, " vgaconf='%s'",
                               virDomainVideoVGAConfTypeToString(def->driver->vgaconf));
+        if (def->backend != VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT)
+            virBufferAsprintf(buf, " name='%s'",
+                              virDomainVideoBackendTypeToString(def->backend));
         virBufferAddLit(buf, "/>\n");
     }
     virBufferAsprintf(buf, "<model type='%s'",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 33cef5b75c..af7fec6e22 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1374,6 +1374,16 @@ struct _virDomainWatchdogDef {
 };
 
 
+/* the backend driver used for virtio interfaces */
+typedef enum {
+    VIR_DOMAIN_VIDEO_BACKEND_TYPE_DEFAULT,
+    VIR_DOMAIN_VIDEO_BACKEND_TYPE_QEMU,
+    VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER,
+
+    VIR_DOMAIN_VIDEO_BACKEND_TYPE_LAST
+} virDomainVideoBackendType;
+
+
 typedef enum {
     VIR_DOMAIN_VIDEO_TYPE_DEFAULT,
     VIR_DOMAIN_VIDEO_TYPE_VGA,
@@ -1424,6 +1434,7 @@ struct _virDomainVideoDef {
     virDomainVideoDriverDefPtr driver;
     virDomainDeviceInfo info;
     virDomainVirtioOptionsPtr virtio;
+    virDomainVideoBackendType backend;
 };
 
 /* graphics console modes */
@@ -3409,6 +3420,7 @@ VIR_ENUM_DECL(virDomainWatchdogModel);
 VIR_ENUM_DECL(virDomainWatchdogAction);
 VIR_ENUM_DECL(virDomainPanicModel);
 VIR_ENUM_DECL(virDomainVideo);
+VIR_ENUM_DECL(virDomainVideoBackend);
 VIR_ENUM_DECL(virDomainHostdevMode);
 VIR_ENUM_DECL(virDomainHostdevSubsys);
 VIR_ENUM_DECL(virDomainHostdevCaps);
diff --git a/tests/qemuxml2argvdata/virtio-options.xml b/tests/qemuxml2argvdata/virtio-options.xml
index 773038a320..bdfadca22d 100644
--- a/tests/qemuxml2argvdata/virtio-options.xml
+++ b/tests/qemuxml2argvdata/virtio-options.xml
@@ -73,7 +73,7 @@
     <input type='mouse' bus='ps2'/>
     <input type='keyboard' bus='ps2'/>
     <video>
-      <driver iommu='on' ats='on'/>
+      <driver iommu='on' ats='on' name='vhostuser'/>
       <model type='virtio' heads='1' primary='yes'>
         <acceleration accel3d='yes'/>
       </model>
-- 
2.23.0


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]