All definition validation that don't depend on qemu capabilities and
was allowed previously as valid definition should be placed into
qemuDomainDefValidate.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/qemu/qemu_command.c | 58 ------------------------------------------
src/qemu/qemu_domain.c | 57 +++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_domain_address.c | 6 -----
3 files changed, 57 insertions(+), 64 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 15cbc23..761968b 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4312,12 +4312,6 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
model = "virtio-gpu-pci";
}
} else {
- if (video->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- "%s", _("non-primary video device must be type
of 'qxl'"));
- goto error;
- }
-
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
"%s", _("only one video card is currently
supported"));
@@ -4329,12 +4323,6 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
- if (video->accel && video->accel->accel2d == VIR_TRISTATE_SWITCH_ON)
{
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("qemu does not support the accel2d setting"));
- goto error;
- }
-
if (video->accel && video->accel->accel3d == VIR_TRISTATE_SWITCH_ON)
{
if (video->type != VIR_DOMAIN_VIDEO_TYPE_VIRTIO ||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU_VIRGL)) {
@@ -4349,19 +4337,6 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
}
if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
- if (video->vram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_OVERFLOW,
- _("value for 'vram' must be less than
'%u'"),
- UINT_MAX / 1024);
- goto error;
- }
- if (video->ram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_OVERFLOW,
- _("value for 'ram' must be less than
'%u'"),
- UINT_MAX / 1024);
- goto error;
- }
-
if (video->ram) {
/* QEMU accepts bytes for ram_size. */
virBufferAsprintf(&buf, ",ram_size=%u", video->ram * 1024);
@@ -4392,13 +4367,6 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
(video->type == VIR_DOMAIN_VIDEO_TYPE_VMVGA &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_VMWARE_SVGA_VGAMEM)))) {
- if (video->vram < 1024) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- "%s", _("value for 'vram' must be at
least 1 MiB "
- "(1024 KiB)"));
- goto error;
- }
-
virBufferAsprintf(&buf, ",vgamem_mb=%u", video->vram / 1024);
}
@@ -4491,19 +4459,6 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
unsigned int vram64 = def->videos[0]->vram64;
unsigned int vgamem = def->videos[0]->vgamem;
- if (vram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_OVERFLOW,
- _("value for 'vram' must be less than
'%u'"),
- UINT_MAX / 1024);
- return -1;
- }
- if (ram > (UINT_MAX / 1024)) {
- virReportError(VIR_ERR_OVERFLOW,
- _("value for 'ram' must be less than
'%u'"),
- UINT_MAX / 1024);
- return -1;
- }
-
if (ram) {
virCommandAddArg(cmd, "-global");
virCommandAddArgFormat(cmd, "%s.ram_size=%u",
@@ -4535,13 +4490,6 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
virQEMUCapsGet(qemuCaps, QEMU_CAPS_VMWARE_SVGA_VGAMEM)))) {
unsigned int vram = def->videos[0]->vram;
- if (vram < 1024) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- "%s", _("value for 'vgamem'
must be at "
- "least 1 MiB (1024 KiB)"));
- return -1;
- }
-
virCommandAddArg(cmd, "-global");
virCommandAddArgFormat(cmd, "%s.vgamem_mb=%u",
dev, vram / 1024);
@@ -4550,12 +4498,6 @@ qemuBuildVideoCommandLine(virCommandPtr cmd,
for (i = 1; i < def->nvideos; i++) {
char *str;
- if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("video type %s is only valid as primary video
card"),
- virDomainVideoTypeToString(def->videos[0]->type));
- return -1;
- }
virCommandAddArg(cmd, "-device");
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 9b1a32e..2b7e6d4 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2395,6 +2395,60 @@ qemuDomainDefPostParse(virDomainDefPtr def,
static int
+qemuDomainDefValidateVideo(const virDomainDef *def)
+{
+ size_t i;
+ virDomainVideoDefPtr video;
+
+ for (i = 0; i < def->nvideos; i++) {
+ video = def->videos[i];
+
+ if (!video->primary &&
+ video->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("video type '%s' is only valid as primary
"
+ "video device"),
+ virDomainVideoTypeToString(video->type));
+ return -1;
+ }
+
+ if (video->accel && video->accel->accel2d ==
VIR_TRISTATE_SWITCH_ON) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("qemu does not support the accel2d setting"));
+ return -1;
+ }
+
+ if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
+ if (video->vram > (UINT_MAX / 1024)) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value for 'vram' must be less than
'%u'"),
+ UINT_MAX / 1024);
+ return -1;
+ }
+ if (video->ram > (UINT_MAX / 1024)) {
+ virReportError(VIR_ERR_OVERFLOW,
+ _("value for 'ram' must be less than
'%u'"),
+ UINT_MAX / 1024);
+ return -1;
+ }
+ }
+
+ if (video->type == VIR_DOMAIN_VIDEO_TYPE_VGA ||
+ video->type == VIR_DOMAIN_VIDEO_TYPE_VMVGA) {
+ if (video->vram && video->vram < 1024) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ "%s", _("value for 'vram' must be
at least "
+ "1 MiB (1024 KiB)"));
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+static int
qemuDomainDefValidate(const virDomainDef *def,
virCapsPtr caps,
void *opaque)
@@ -2455,6 +2509,9 @@ qemuDomainDefValidate(const virDomainDef *def,
}
}
+ if (qemuDomainDefValidateVideo(def) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index bb16738..dc67d51 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -1242,13 +1242,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def,
goto error;
}
- /* Further non-primary video cards which have to be qxl type */
for (i = 1; i < def->nvideos; i++) {
- if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("non-primary video device must be type of
'qxl'"));
- goto error;
- }
if (!virDeviceInfoPCIAddressWanted(&def->videos[i]->info))
continue;
if (virDomainPCIAddressReserveNextSlot(addrs, &def->videos[i]->info,
--
2.10.0