]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: ensure only one vgpu has ramfb enabled
authorJonathon Jongsma <jjongsma@redhat.com>
Fri, 29 Apr 2022 20:07:26 +0000 (15:07 -0500)
committerJonathon Jongsma <jjongsma@redhat.com>
Mon, 9 May 2022 19:39:43 +0000 (14:39 -0500)
Validate the domain configuration to ensure that if there are more than
one vgpu assigned to a domain, only one of them has 'ramfb' enabled.

This was never a supported configuration. QEMU failed confusingly when
attempting to start a domain with this configuration. This change
attempts to provide better information about the error.

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

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/conf/domain_validate.c
tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.x86_64-latest.err [new file with mode: 0644]
tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.xml [new file with mode: 0644]
tests/qemuxml2argvtest.c

index 7219e95e294b18d37b09237c16b660d8698dd438..b9cb50ed31006b03231dcc81d9c320c267791dd2 100644 (file)
@@ -1228,20 +1228,33 @@ virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def)
 }
 
 static int
-virDomainDefDuplicateHostdevInfoValidate(const virDomainDef *def)
+virDomainDefHostdevValidate(const virDomainDef *def)
 {
     size_t i;
     size_t j;
+    bool ramfbEnabled = false;
 
     for (i = 0; i < def->nhostdevs; i++) {
+        virDomainHostdevDef *dev = def->hostdevs[i];
+
         for (j = i + 1; j < def->nhostdevs; j++) {
-            if (virDomainHostdevMatch(def->hostdevs[i],
+            if (virDomainHostdevMatch(dev,
                                       def->hostdevs[j])) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                     _("Hostdev already exists in the domain configuration"));
                 return -1;
             }
         }
+
+        if (dev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
+            dev->source.subsys.u.mdev.ramfb == VIR_TRISTATE_SWITCH_ON) {
+            if (ramfbEnabled) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Only one vgpu device can have 'ramfb' enabled"));
+                return -1;
+            }
+            ramfbEnabled = true;
+        }
     }
 
     return 0;
@@ -1698,7 +1711,7 @@ virDomainDefValidateInternal(const virDomainDef *def,
     if (virDomainDefDuplicateDiskInfoValidate(def) < 0)
         return -1;
 
-    if (virDomainDefDuplicateHostdevInfoValidate(def) < 0)
+    if (virDomainDefHostdevValidate(def) < 0)
         return -1;
 
     if (virDomainDefDuplicateDriveAddressesValidate(def) < 0)
diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.x86_64-latest.err b/tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.x86_64-latest.err
new file mode 100644 (file)
index 0000000..07ce47a
--- /dev/null
@@ -0,0 +1 @@
+unsupported configuration: Only one vgpu device can have 'ramfb' enabled
diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.xml b/tests/qemuxml2argvdata/hostdev-mdev-display-ramfb-multiple.xml
new file mode 100644 (file)
index 0000000..1fe5372
--- /dev/null
@@ -0,0 +1,38 @@
+<domain type='qemu'>
+  <name>QEMUGuest2</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0'>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <controller type='ide' index='0'>
+    </controller>
+    <graphics type='vnc'/>
+    <hostdev mode='subsystem' type='mdev' model='vfio-pci' display='on' ramfb='on'>
+      <source>
+        <address uuid='53764d0e-85a0-42b4-af5c-2046b460b1dc'/>
+      </source>
+    </hostdev>
+    <hostdev mode='subsystem' type='mdev' model='vfio-pci' display='on' ramfb='on'>
+      <source>
+        <address uuid='53764d0e-85a0-42b4-af5c-2046b460b1dd'/>
+      </source>
+    </hostdev>
+    <video>
+      <model type='qxl' heads='1'/>
+    </video>
+    <memballoon model='none'/>
+  </devices>
+</domain>
index 1a49d2cfb026d00d3364fbf598cc7405af460c50..a23a89a506b68dd192845cdc059e33e30b380297 100644 (file)
@@ -1897,6 +1897,7 @@ mymain(void)
             QEMU_CAPS_DEVICE_VFIO_PCI,
             QEMU_CAPS_VFIO_PCI_DISPLAY);
     DO_TEST_CAPS_LATEST("hostdev-mdev-display-ramfb");
+    DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-mdev-display-ramfb-multiple");
     DO_TEST_PARSE_ERROR("hostdev-vfio-zpci-wrong-arch",
                         QEMU_CAPS_DEVICE_VFIO_PCI);
     DO_TEST("hostdev-vfio-zpci",