On Thu, Sep 15, 2016 at 18:14:30 +0200, Martin Kletzander wrote:
Role controls how the domain behaves on migration.
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
docs/formatdomain.html.in | 10 +++++-
docs/schemas/domaincommon.rng | 8 +++++
src/conf/domain_conf.c | 39 ++++++++++++++++++++++-
src/conf/domain_conf.h | 11 +++++++
tests/qemuxml2argvdata/qemuxml2argv-shmem.xml | 4 +--
tests/qemuxml2xmloutdata/qemuxml2xmlout-shmem.xml | 4 +--
6 files changed, 70 insertions(+), 6 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index f48a4d8b813f..f4d08959c787 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
[...]
@@ -6764,6 +6764,14 @@ qemu-kvm -net nic,model=? /dev/null
<dd>
The <code>shmem</code> element has one mandatory attribute,
<code>name</code> to identify the shared memory.
+ Optional attribute <code>role</code> can be set to values
+ "master" or "peer". The former will mean that upon
migration,
+ the data in the shared memory is migrated with the domain.
+ There should be only one "master" per shared memory object.
+ Migration with "peer" role is disabled. If migration of such
+ domain is required, the shmem device needs to be unplugged
+ before migration and plugged in at the destination upon
+ successful migration.
I'm not in favor of adding the workaround suggestion. I'd change it for
a more thoroguh explanation what this configuration does besides
controlling migratability.
</dd>
<dt><code>size</code></dt>
<dd>
[...]
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 97cb3de95529..2ccc10515f30 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
[...]
@@ -12201,6 +12206,23 @@ virDomainShmemDefParseXML(xmlNodePtr node,
ctxt->node = node;
+ if (!(def->name = virXMLPropString(node, "name"))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("shmem element must contain 'name'
attribute"));
+ goto cleanup;
+ }
This code is already in the function a few lines after this hunk. You
probably forgot to delete it.
+
+ tmp = virXMLPropString(node, "role");
+ if (tmp) {
+ if ((def->role = virDomainShmemRoleTypeFromString(tmp)) <= 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Unknown shmem role type '%s'"), tmp);
+ goto cleanup;
+ }
+
+ VIR_FREE(tmp);
+ }
+
tmp = virXPathString("string(./model/@type)", ctxt);
if (tmp) {
/* If there's none, we will automatically have the first one
@@ -18704,6 +18726,15 @@ virDomainShmemDefCheckABIStability(virDomainShmemDefPtr src,
return false;
}
+ if (src->role != dst->role) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target shared memory role '%s' does not match
"
+ "source role '%s'"),
+ virDomainShmemRoleTypeToString(dst->role),
+ virDomainShmemRoleTypeToString(src->role));
+ return false;
+ }
Is this really guest ABI? Since it's not used in this patch I'll see
later.
+
if (src->model != dst->model) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target shared memory model '%s' does not match
"
@@ -21790,8 +21821,14 @@ virDomainShmemDefFormat(virBufferPtr buf,
virDomainShmemDefPtr def,
unsigned int flags)
{
- virBufferEscapeString(buf, "<shmem name='%s'>\n",
def->name);
+ virBufferEscapeString(buf, "<shmem name='%s'", def->name);
+ if (def->role) {
+ virBufferEscapeString(buf, " role='%s'",
+ virDomainShmemRoleTypeToString(def->role));
+ }
+
+ virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
virBufferAsprintf(buf, "<model type='%s'/>\n",
Peter