[libvirt] [PATCH v2 09/17] qemu_process: move video validation out of qemu_command

Pavel Hrdina phrdina at redhat.com
Wed Oct 12 12:12:50 UTC 2016


Runtime validation that depend on qemu capabilities should be moved
into qemuProcessStartValidateXML.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---

Changes in v2:
    - now it only moves the validation, there is no other side effect

 src/qemu/qemu_command.c | 33 +--------------------------------
 src/qemu/qemu_process.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 32 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b9869f3..e590f2b 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4271,26 +4271,12 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
             model = "virtio-gpu-pci";
         }
     } else {
-        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           "%s", _("only one video card is currently supported"));
-            goto error;
-        }
-
         model = "qxl";
     }
 
     virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
 
     if (video->accel && video->accel->accel3d == VIR_TRISTATE_SWITCH_ON) {
-        if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO ||
-            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("%s 3d acceleration is not supported"),
-                           virDomainVideoTypeToString(video->type));
-            goto error;
-        }
-
         virBufferAsprintf(&buf, ",virgl=%s",
                           virTristateSwitchTypeToString(video->accel->accel3d));
     }
@@ -4356,17 +4342,7 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
 
     primaryVideoType = def->videos[0]->type;
 
-    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY) &&
-         ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VGA &&
-             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VGA)) ||
-         (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_CIRRUS &&
-             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_CIRRUS_VGA)) ||
-         (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VMVGA &&
-             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMWARE_SVGA)) ||
-         (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL &&
-             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) ||
-         (primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
-             virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU)))) {
+    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY)) {
         for (i = 0; i < def->nvideos; i++) {
             char *str;
             virCommandAddArg(cmd, "-device");
@@ -4378,13 +4354,6 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
             VIR_FREE(str);
         }
     } else {
-        if ((primaryVideoType == VIR_DOMAIN_VIDEO_TYPE_QXL) &&
-            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("This QEMU does not support QXL graphics adapters"));
-            return -1;
-        }
-
         const char *vgastr = qemuVideoTypeToString(primaryVideoType);
         if (!vgastr || STREQ(vgastr, "")) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ab69811..b903cec 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4448,6 +4448,50 @@ qemuProcessStartValidateGraphics(virDomainObjPtr vm)
 
 
 static int
+qemuProcessStartValidateVideo(virDomainObjPtr vm,
+                              virQEMUCapsPtr qemuCaps)
+{
+    size_t i;
+    virDomainVideoDefPtr video;
+
+    for (i = 0; i < vm->def->nvideos; i++) {
+        video = vm->def->videos[i];
+
+        if (video->primary &&
+            virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY) &&
+            ((video->type == VIR_DOMAIN_VIDEO_TYPE_VGA &&
+              !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VGA)) ||
+             (video->type == VIR_DOMAIN_VIDEO_TYPE_CIRRUS &&
+              !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_CIRRUS_VGA)) ||
+             (video->type == VIR_DOMAIN_VIDEO_TYPE_VMVGA &&
+              !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VMWARE_SVGA)) ||
+             (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL &&
+              !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) ||
+             (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
+              !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU)))) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("this QEMU does not support '%s' video device"),
+                           virDomainVideoTypeToString(video->type));
+            return -1;
+        }
+
+        if (video->accel) {
+            if (video->accel->accel3d == VIR_TRISTATE_SWITCH_ON &&
+                (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO ||
+                 !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_VIRGL))) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("%s 3d acceleration is not supported"),
+                               virDomainVideoTypeToString(video->type));
+                return -1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+static int
 qemuProcessStartValidateXML(virQEMUDriverPtr driver,
                             virDomainObjPtr vm,
                             virQEMUCapsPtr qemuCaps,
@@ -4520,6 +4564,9 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
     if (qemuProcessStartValidateGraphics(vm) < 0)
         return -1;
 
+    if (qemuProcessStartValidateVideo(vm, qemuCaps) < 0)
+        return -1;
+
     VIR_DEBUG("Checking for any possible (non-fatal) issues");
 
     qemuProcessStartWarnShmem(vm);
-- 
2.10.1




More information about the libvir-list mailing list