diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 838e838bad..8cba755c9b 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2843,6 +2843,56 @@ qemuDomainChrDefDropDefaultPath(virDomainChrDefPtr chr,
}
+static int
+qemuDomainShmemDefPostParse(virDomainShmemDefPtr shm)
+{
+ /* This was the default since the introduction of this device. */
+ if (shm->model != VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL && !shm->size)
+ shm->size = 4 << 20;
+
+ /* Nothing more to check/change for IVSHMEM */
+ if (shm->model == VIR_DOMAIN_SHMEM_MODEL_IVSHMEM)
+ return 0;
+
+ if (!shm->server.enabled) {
+ if (shm->model == VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("shmem model '%s' is supported "
+ "only with server option enabled"),
+ virDomainShmemModelTypeToString(shm->model));
+ return -1;
+ }
+
+ if (shm->msi.enabled) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("shmem model '%s' doesn't support "
+ "msi"),
+ virDomainShmemModelTypeToString(shm->model));
+ }
+ } else {
+ if (shm->model == VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_PLAIN) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("shmem model '%s' is supported "
+ "only with server option disabled"),
+ virDomainShmemModelTypeToString(shm->model));
+ return -1;
+ }
+
+ if (shm->size) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("shmem model '%s' does not support size setting"),
+ virDomainShmemModelTypeToString(shm->model));
+ return -1;
+ }
+ shm->msi.enabled = true;
+ if (!shm->msi.ioeventfd)
+ shm->msi.ioeventfd = VIR_TRISTATE_SWITCH_ON;
+ }
+
+ return 0;
+}
+
+
static int
qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
const virDomainDef *def,
@@ -3047,6 +3097,10 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
}
}
+ if (dev->type == VIR_DOMAIN_DEVICE_SHMEM &&
+ qemuDomainShmemDefPostParse(dev->data.shmem) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-shmem.args b/tests/qemuxml2argvdata/qemuxml2argv-shmem.args
index 99fac119b0..bdf660a3c4 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-shmem.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-shmem.args
@@ -17,7 +17,7 @@ QEMU_AUDIO_DRV=none \
-no-acpi \
-boot c \
-usb \
--device ivshmem,id=shmem0,shm=shmem0,bus=pci.0,addr=0x3 \
+-device ivshmem,id=shmem0,size=4m,shm=shmem0,bus=pci.0,addr=0x3 \
-device ivshmem,id=shmem1,size=128m,shm=shmem1,bus=pci.0,addr=0x5 \
-device ivshmem,id=shmem2,size=256m,shm=shmem2,bus=pci.0,addr=0x4 \
-device ivshmem,id=shmem3,size=512m,chardev=charshmem3,bus=pci.0,addr=0x6 \
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem-plain-doorbell.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem-plain-doorbell.xml
index ab9c69bfcc..7872e1c8a1 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem-plain-doorbell.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem-plain-doorbell.xml
@@ -23,6 +23,7 @@
+ 4
@@ -38,11 +39,13 @@
+
+
@@ -54,7 +57,7 @@
-
+
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
index 5602913648..04b463a278 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml
@@ -23,6 +23,7 @@
+ 4