[libvirt PATCH] qemu: require memfd memory for virtio 'blob' support

Jonathon Jongsma jjongsma at redhat.com
Tue Jul 18 14:48:26 UTC 2023


The virtio-gpu 'blob' support was insufficiently validated. Qemu
requires a memfd memory backing in order to use udmabuf and enable blob
support. Example error:

    $ virsh start rhel9
    error: Failed to start domain 'rhel9'
    error: internal error: qemu unexpectedly closed the monitor: 2023-07-18T02:33:57.083178Z qemu-kvm: -device {"driver":"virtio-vga","id":"video0","max_outputs":1,"blob":true,"bus":"pcie.0","addr":"0x1"}: cannot enable blob resources without udmabuf

Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
---
 src/qemu/qemu_validate.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 7e09e2c52f..139e6f3d62 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -2598,6 +2598,7 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
 
 static int
 qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video,
+                                 const virDomainDef *def,
                                  virQEMUCaps *qemuCaps)
 {
     virDomainCapsDeviceVideo videoCaps = { 0 };
@@ -2714,11 +2715,18 @@ qemuValidateDomainDeviceDefVideo(const virDomainVideoDef *video,
     }
 
     if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
-        if (video->blob != VIR_TRISTATE_SWITCH_ABSENT &&
-            !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_BLOB)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("this QEMU does not support 'blob' for virtio-gpu devices"));
-            return -1;
+        if (video->blob != VIR_TRISTATE_SWITCH_ABSENT) {
+            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_GPU_BLOB)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("this QEMU does not support 'blob' for virtio-gpu devices"));
+                return -1;
+            }
+            if (video->blob == VIR_TRISTATE_SWITCH_ON
+                && def->mem.source != VIR_DOMAIN_MEMORY_SOURCE_MEMFD) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("'blob' support for virtio-gpu devices requires a memfd memory backend"));
+                return -1;
+            }
         }
     }
 
@@ -5217,7 +5225,7 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev,
                                                  qemuCaps);
 
     case VIR_DOMAIN_DEVICE_VIDEO:
-        return qemuValidateDomainDeviceDefVideo(dev->data.video, qemuCaps);
+        return qemuValidateDomainDeviceDefVideo(dev->data.video, def, qemuCaps);
 
     case VIR_DOMAIN_DEVICE_DISK:
         return qemuValidateDomainDeviceDefDisk(dev->data.disk, def, qemuCaps);
-- 
2.41.0



More information about the libvir-list mailing list