diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 225d1d7491..7008f14028 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8410,13 +8410,6 @@ qemuBuildShmemDevLegacyStr(virDomainDefPtr def, { g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("ivshmem device is not supported " - "with this QEMU binary")); - return NULL; - } - virBufferAddLit(&buf, "ivshmem"); virBufferAsprintf(&buf, ",id=%s", shmem->info.alias); @@ -8450,17 +8443,6 @@ qemuBuildShmemDevStr(virDomainDefPtr def, { g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - if ((shmem->model == VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_PLAIN && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM_PLAIN)) || - (shmem->model == VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM_DOORBELL))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("shmem model '%s' is not supported " - "by this QEMU binary"), - virDomainShmemModelTypeToString(shmem->model)); - return NULL; - } - virBufferAdd(&buf, virDomainShmemModelTypeToString(shmem->model), -1); virBufferAsprintf(&buf, ",id=%s", shmem->info.alias); diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index f24e58c5ed..3df615a84d 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4398,6 +4398,44 @@ qemuValidateDomainDeviceDefMemory(virDomainMemoryDefPtr mem, } +static int +qemuValidateDomainDeviceDefShmem(virDomainShmemDefPtr shmem, + virQEMUCapsPtr qemuCaps) +{ + switch (shmem->model) { + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("ivshmem device is not supported " + "with this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_PLAIN: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM_PLAIN)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("shmem model '%s' is not supported " + "by this QEMU binary"), + virDomainShmemModelTypeToString(shmem->model)); + return -1; + } + break; + + case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_IVSHMEM_DOORBELL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("shmem model '%s' is not supported " + "by this QEMU binary"), + virDomainShmemModelTypeToString(shmem->model)); + return -1; + } + } + + return 0; +} + + int qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -4512,8 +4550,11 @@ qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev, ret = qemuValidateDomainDeviceDefMemory(dev->data.memory, qemuCaps); break; - case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_SHMEM: + ret = qemuValidateDomainDeviceDefShmem(dev->data.shmem, qemuCaps); + break; + + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_AUDIO: case VIR_DOMAIN_DEVICE_NONE: diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 67e29ba085..6c3104b256 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2946,7 +2946,7 @@ mymain(void) DO_TEST("shmem-plain-doorbell", QEMU_CAPS_DEVICE_IVSHMEM, QEMU_CAPS_DEVICE_IVSHMEM_PLAIN, QEMU_CAPS_DEVICE_IVSHMEM_DOORBELL); - DO_TEST_FAILURE("shmem", NONE); + DO_TEST_PARSE_ERROR("shmem", NONE); DO_TEST_FAILURE("shmem-invalid-size", QEMU_CAPS_DEVICE_IVSHMEM); DO_TEST_FAILURE("shmem-invalid-address", diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 93287d0a55..a897dfe17a 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1148,7 +1148,7 @@ mymain(void) DO_TEST("tap-vhost", NONE); DO_TEST("tap-vhost-incorrect", NONE); - DO_TEST("shmem", NONE); + DO_TEST("shmem", QEMU_CAPS_DEVICE_IVSHMEM); DO_TEST("shmem-plain-doorbell", QEMU_CAPS_DEVICE_IVSHMEM_PLAIN, QEMU_CAPS_DEVICE_IVSHMEM_DOORBELL); DO_TEST("smbios", NONE);