[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;

}