[libvirt] [RFC] default video device type

Pavel Mores pmores at redhat.com
Mon Oct 7 12:56:11 UTC 2019


Hi,

I'm looking into fixing

https://bugzilla.redhat.com/show_bug.cgi?id=1668141

(as a short summary, if a graphics device is added to XML that has no video
device, libvirt automatically adds a video device which is always of type
'cirrus' - even if the underlying qemu doesn't support cirrus).

I'm able to affect the behaviour in question by using qemu capabilities in
qemuDomainDeviceVideoDefPostParse(), see proof-of-concept change in [1].  I
have a couple of questions though:

1) is this a proper place and approach to fix the bug?
2) what would be the full specification of expected behaviour?  The bug report
   only states that the video type shouldn't be cirrus but doesn't say what it
   should be. [2] gives some information about the order of preference of video
   device types but I was wondering if there are any opinions about this on this
   list?

Cheers,

	pvl

[1]
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index b4175a846e..0de491b79f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7821,7 +7821,8 @@ qemuDomainDeviceNetDefPostParse(virDomainNetDefPtr net,
 
 static int
 qemuDomainDeviceVideoDefPostParse(virDomainVideoDefPtr video,
-                                  const virDomainDef *def)
+                                  const virDomainDef *def,
+                                  virQEMUCapsPtr qemuCaps)
 {
     if (video->type == VIR_DOMAIN_VIDEO_TYPE_DEFAULT) {
         if (ARCH_IS_PPC64(def->os.arch))
@@ -7830,8 +7831,16 @@ qemuDomainDeviceVideoDefPostParse(virDomainVideoDefPtr video,
                  qemuDomainIsRISCVVirt(def) ||
                  ARCH_IS_S390(def->os.arch))
             video->type = VIR_DOMAIN_VIDEO_TYPE_VIRTIO;
-        else
-            video->type = VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
+        else {
+            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE)
+                    && virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) {
+                video->type = VIR_DOMAIN_VIDEO_TYPE_QXL;
+                video->vgamem = QEMU_QXL_VGAMEM_DEFAULT;
+            } else {
+                video->type = VIR_DOMAIN_VIDEO_TYPE_VGA;
+            }
+        }
     }
 
     if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL &&
@@ -7926,7 +7935,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
         break;
 
     case VIR_DOMAIN_DEVICE_VIDEO:
-        ret = qemuDomainDeviceVideoDefPostParse(dev->data.video, def);
+        ret = qemuDomainDeviceVideoDefPostParse(dev->data.video, def, qemuCaps);
         break;
 
     case VIR_DOMAIN_DEVICE_PANIC:



[2] https://www.kraxel.org/blog/2019/09/display-devices-in-qemu/




More information about the libvir-list mailing list