From 988f8443fb607acfa81d486b6904a3f19cf6fa63 Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Tue, 18 Jul 2023 08:55:13 -0500 Subject: [PATCH] qemu: require memfd memory for virtio 'blob' support 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 Reviewed-by: Michal Privoznik --- src/qemu/qemu_validate.c | 20 +++++++++++++------ .../video-virtio-blob-on.x86_64-latest.args | 2 +- .../qemuxml2argvdata/video-virtio-blob-on.xml | 3 +++ .../video-virtio-blob-on.x86_64-latest.xml | 3 +++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 477ae997fe..9695d50217 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; + } } } @@ -5209,7 +5217,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); diff --git a/tests/qemuxml2argvdata/video-virtio-blob-on.x86_64-latest.args b/tests/qemuxml2argvdata/video-virtio-blob-on.x86_64-latest.args index ef37e32e5e..577422426b 100644 --- a/tests/qemuxml2argvdata/video-virtio-blob-on.x86_64-latest.args +++ b/tests/qemuxml2argvdata/video-virtio-blob-on.x86_64-latest.args @@ -14,7 +14,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ -accel tcg \ -cpu qemu64 \ -m size=1048576k \ --object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":1073741824}' \ +-object '{"qom-type":"memory-backend-memfd","id":"pc.ram","x-use-canonical-path-for-ramblock-id":false,"size":1073741824}' \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/video-virtio-blob-on.xml b/tests/qemuxml2argvdata/video-virtio-blob-on.xml index 2b8a913f49..96ccf13079 100644 --- a/tests/qemuxml2argvdata/video-virtio-blob-on.xml +++ b/tests/qemuxml2argvdata/video-virtio-blob-on.xml @@ -3,6 +3,9 @@ c7a5fdbd-edaf-9455-926a-d65c16db1809 1048576 1048576 + + + 1 hvm diff --git a/tests/qemuxml2xmloutdata/video-virtio-blob-on.x86_64-latest.xml b/tests/qemuxml2xmloutdata/video-virtio-blob-on.x86_64-latest.xml index 410db67592..40f40b4132 100644 --- a/tests/qemuxml2xmloutdata/video-virtio-blob-on.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/video-virtio-blob-on.x86_64-latest.xml @@ -3,6 +3,9 @@ c7a5fdbd-edaf-9455-926a-d65c16db1809 1048576 1048576 + + + 1 hvm