]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Validate virtio-mem-ccw
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 15 Jan 2025 14:48:41 +0000 (15:48 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 4 Feb 2025 08:15:45 +0000 (09:15 +0100)
There are basically two differences between virtio-mem-ccw and
virtio-mem-pci. s390 doesn't allow mixing different page sizes
and there's no NUMA support in QEMU.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
src/qemu/qemu_validate.c

index c8ea8b63d2a53b1b10ad8fc7def0fed6cdd04c0d..76f2eafe49555df6508bf38f0c5e47aafdcb0fd1 100644 (file)
@@ -5224,7 +5224,8 @@ qemuValidateDomainDeviceDefHub(virDomainHubDef *hub,
 
 
 static int
-qemuValidateDomainDeviceDefMemory(virDomainMemoryDef *mem,
+qemuValidateDomainDeviceDefMemory(const virDomainMemoryDef *mem,
+                                  const virDomainDef *def,
                                   virQEMUCaps *qemuCaps)
 {
     virSGXCapability *sgxCaps;
@@ -5263,12 +5264,40 @@ qemuValidateDomainDeviceDefMemory(virDomainMemoryDef *mem,
         break;
 
     case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
-        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MEM_PCI)) {
+        if ((mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
+             !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MEM_PCI)) ||
+            (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
+             !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MEM_CCW))) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                            _("virtio-mem isn't supported by this QEMU binary"));
             return -1;
         }
 
+        if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
+            /* virtio-mem-ccw has a few differences compared to virtio-mem-pci:
+             *
+             * 1) corresponding memory-backing-* object can't have a different
+             *    page size than the boot memory (see s390_machine_device_plug()
+             *    in qemu sources).
+             * 2) Since its commit v2.12.0-rc0~41^2~6 QEMU doesn't allow NUMA
+             *    for s390.
+             */
+
+            if (mem->source.virtio_mem.pagesize != 0 &&
+                def->mem.nhugepages &&
+                mem->source.virtio_mem.pagesize != def->mem.hugepages[0].size) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("virtio-mem-ccw can't use different page size than the boot memory"));
+                return -1;
+            }
+
+            if (mem->targetNode != 0 && mem->targetNode != -1) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("NUMA nodes are not supported for virtio-mem-ccw"));
+                return -1;
+            }
+        }
+
         if (mem->target.virtio_mem.dynamicMemslots == VIR_TRISTATE_BOOL_YES &&
             !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MEM_PCI_DYNAMIC_MEMSLOTS)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -5455,7 +5484,7 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev,
         return qemuValidateDomainDeviceDefSound(dev->data.sound, qemuCaps);
 
     case VIR_DOMAIN_DEVICE_MEMORY:
-        return qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCaps);
+        return qemuValidateDomainDeviceDefMemory(dev->data.memory, def, qemuCaps);
 
     case VIR_DOMAIN_DEVICE_SHMEM:
         return qemuValidateDomainDeviceDefShmem(dev->data.shmem, qemuCaps);