[Problem Description]
I read qemu-doc.texi in qemu-mster source code, which have a explain of migrating
ivshmem below
“With device property @option{master=on}, the guest will copy the shared.memory on
migration to the destination host. With @option{master=off}, the guest will not be able
to migrate with the device attached.”
However, libvirt library can not recognize the property “master=on”. When I directly
used command "qemu-kvm -device
ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,master=on,bus=pci.0,addr=0xa” to launch a
guest, qemu support ivshmem property master=on.
So, I suggest adding code to support property master=on in libvirt.
[Code Review]
The below is the part of source code in qemu-master. There's no definition here
about ivshmem master.
domain_conf.h
struct _virDomainShmemDef {
char *name;
unsigned long long size;
int model; /* enum virDomainShmemModel */
struct {
bool enabled;
virDomainChrSourceDef chr;
} server;
struct {
bool enabled;
unsigned vectors;
virTristateSwitch ioeventfd;
} msi;
virDomainDeviceInfo info;
};
[changed code]
src/conf/domain_conf.c
src/conf/domain_conf.h
[Detail of Source Code Modification]
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9f75dc4..b41be37 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14665,7 +14665,6 @@ virDomainShmemDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr save = ctxt->node;
xmlNodePtr server = NULL;
-
if (VIR_ALLOC(def) < 0)
return NULL;
-
if (VIR_ALLOC(def) < 0)
return NULL;
@@ -14685,12 +14684,28 @@ virDomainShmemDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(tmp);
}
+
if (!(def->name = virXMLPropString(node, "name"))) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("shmem element must contain 'name'
attribute"));
goto cleanup;
}
+
+ if ((tmp = virXMLPropString(node, "master"))) {
+ int val;
+
+ if ((val = virTristateSwitchTypeFromString(tmp)) <= 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid ivshmem master setting
for shmem: '%s'"),
+ tmp);
+ goto cleanup;
+ }
+ def->master = val;
+ VIR_FREE(tmp);
+ }
+
+
if (virDomainParseScaledValue("./size[1]", NULL, ctxt,
&def->size, 1, ULLONG_MAX, false) < 0)
goto cleanup;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index f1e6e4e..615d721 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1727,8 +1727,10 @@ typedef enum {
struct _virDomainShmemDef {
char *name;
+
unsigned long long size;
int model; /* enum virDomainShmemModel */
+ virTristateSwitch master;
struct {
bool enabled;
virDomainChrSourceDef chr;
}