From nobody Thu May 2 23:47:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521586557014905.4985573675382; Tue, 20 Mar 2018 15:55:57 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1B08E37EEA; Tue, 20 Mar 2018 22:55:55 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 49FDD6065F; Tue, 20 Mar 2018 22:55:54 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3FB7C180613A; Tue, 20 Mar 2018 22:55:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2KMtovt012229 for ; Tue, 20 Mar 2018 18:55:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7424218B41; Tue, 20 Mar 2018 22:55:50 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-18.phx2.redhat.com [10.3.116.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 24E606065F for ; Tue, 20 Mar 2018 22:55:49 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 20 Mar 2018 18:55:43 -0400 Message-Id: <20180320225544.26807-2-jferlan@redhat.com> In-Reply-To: <20180320225544.26807-1-jferlan@redhat.com> References: <20180320225544.26807-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [RFC PATCH 1/2] conf: Introduce VIR_DOMAIN_DEVICE_VMGENID X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 20 Mar 2018 22:55:55 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Introduce a new domain device "vmgenid". This device will be used to provide a unique identifier for certain guest execution operations such as start after snapshot, start from backup, failover in disaster recovery, and start after import, copy, clone. Signed-off-by: John Ferlan --- src/conf/domain_conf.c | 10 +++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain_address.c | 1 + src/qemu/qemu_driver.c | 6 ++++++ src/qemu/qemu_hotplug.c | 1 + 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c8d051fa9f..2f07180faa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -256,7 +256,8 @@ VIR_ENUM_IMPL(virDomainDevice, VIR_DOMAIN_DEVICE_LAST, "tpm", "panic", "memory", - "iommu") + "iommu", + "vmgenid") =20 VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST, "none", @@ -2739,6 +2740,7 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def) case VIR_DOMAIN_DEVICE_IOMMU: VIR_FREE(def->data.iommu); break; + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -3608,6 +3610,7 @@ virDomainDeviceGetInfo(virDomainDeviceDefPtr device) case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -3834,6 +3837,7 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr de= f, case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: break; } #endif @@ -5550,6 +5554,7 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -15840,6 +15845,7 @@ virDomainDeviceDefParse(const char *xmlStr, if (!(dev->data.iommu =3D virDomainIOMMUDefParseXML(node, ctxt))) goto error; break; + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -22287,6 +22293,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr = src, case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: break; } #endif @@ -28370,6 +28377,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("Copying definition of '%d' type " diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 61379e50fe..6e204d31fb 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -186,6 +186,7 @@ typedef enum { VIR_DOMAIN_DEVICE_PANIC, VIR_DOMAIN_DEVICE_MEMORY, VIR_DOMAIN_DEVICE_IOMMU, + VIR_DOMAIN_DEVICE_VMGENID, =20 VIR_DOMAIN_DEVICE_LAST } virDomainDeviceType; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7022f7c3da..b86d0a97b4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4978,6 +4978,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 25517064d7..f1c9b73c3e 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -843,6 +843,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDefPtr dev, case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: return 0; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7bcc4936de..8d9a0e7414 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7734,6 +7734,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%s' is not supported"), @@ -7833,6 +7834,7 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%s' is not supported"), @@ -7969,6 +7971,7 @@ qemuDomainUpdateDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%s' is not supported"), @@ -8155,6 +8158,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%s' is not support= ed"), @@ -8338,6 +8342,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%s' is not supporte= d"), @@ -8436,6 +8441,7 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%s' is not supporte= d"), diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 49af4d4ff0..dd328c18a9 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4507,6 +4507,7 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %s device"), --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 23:47:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1521586571714179.81404578418199; Tue, 20 Mar 2018 15:56:11 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6359C804E4; Tue, 20 Mar 2018 22:56:10 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 38B50608F0; Tue, 20 Mar 2018 22:56:10 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E21404CA9C; Tue, 20 Mar 2018 22:56:09 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w2KMtol9012234 for ; Tue, 20 Mar 2018 18:55:50 -0400 Received: by smtp.corp.redhat.com (Postfix) id EC05218EFA; Tue, 20 Mar 2018 22:55:50 +0000 (UTC) Received: from unknown54ee7586bd10.attlocal.net.com (ovpn-116-18.phx2.redhat.com [10.3.116.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9C7AE6065F for ; Tue, 20 Mar 2018 22:55:50 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Tue, 20 Mar 2018 18:55:44 -0400 Message-Id: <20180320225544.26807-3-jferlan@redhat.com> In-Reply-To: <20180320225544.26807-1-jferlan@redhat.com> References: <20180320225544.26807-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [RFC PATCH 2/2] conf: Add VM Generation ID device X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 20 Mar 2018 22:56:10 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add VM Generation ID device XML schema, parse, format, and documentation. Signed-off-by: John Ferlan --- docs/formatdomain.html.in | 54 ++++++++++++++ docs/schemas/domaincommon.rng | 21 ++++++ src/conf/domain_conf.c | 112 ++++++++++++++++++++++++++= +++- src/conf/domain_conf.h | 11 +++ tests/qemuxml2argvdata/vmgenid-auto.xml | 32 +++++++++ tests/qemuxml2argvdata/vmgenid.xml | 32 +++++++++ tests/qemuxml2xmloutdata/vmgenid-auto.xml | 1 + tests/qemuxml2xmloutdata/vmgenid.xml | 1 + tests/qemuxml2xmltest.c | 3 + 9 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/vmgenid-auto.xml create mode 100644 tests/qemuxml2argvdata/vmgenid.xml create mode 120000 tests/qemuxml2xmloutdata/vmgenid-auto.xml create mode 120000 tests/qemuxml2xmloutdata/vmgenid.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 6fd2189cd2..895e51b343 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8027,6 +8027,60 @@ qemu-kvm -net nic,model=3D? /dev/null =20 +

VM Generation ID device

+ +

+ Since 4.2.0, the vmgenid + element can be used to add a Virtual Machine Generation ID device. + A vmgenid device is an emulated device which exposes + a 128-bit, cryptographically random, integer value identifier, + referred to as a Globally Unique Identifier, or GUID. The value is + stored within the virtual machine's BIOS so that programs running in + the virtual machine can protect themselves from potential corruption + by checking that the Generation ID has not changed immediately prior + to committing a transaction. + + The vmgenid device will update the BIOS entry each time + the virtual machine executes from a different configuration file such + as executing from a recovered snapshot or executing after restoring + from backup. Programs running in a virtual machine can protect thems= elves + from potential corruption by checking that the generation ID has not + changed immediately prior to committing a transaction, they can also + use the data provided in the 128-bit identifier as a high entropy + random data source. +

+ +

+ Example: +

+
+...
+<devices>
+  <vmgenid guid=3D'3e3fce45-4f53-4fa7-bb32-11f34168b82b'/>
+</devices>
+...
+
+ +
+...
+<devices>
+  <vmgenid guid=3D'auto'/>
+</devices>
+...
+
+ +
+
guid
+
+

+ The required guid attribute can be either a provided + (uuid) formatted v= alue + or the string 'auto' if the underlying hypervisor supports creati= ng + its own value. +

+
+
+

Security label

=20

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 8165e699d6..692cc8d5a0 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4644,6 +4644,24 @@ + + + + + + + + + + + + auto + + + + + + @@ -4691,6 +4709,9 @@ + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2f07180faa..aaba2a47f7 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2741,6 +2741,8 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def) VIR_FREE(def->data.iommu); break; case VIR_DOMAIN_DEVICE_VMGENID: + VIR_FREE(def->data.vmgenid); + break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -15690,6 +15692,45 @@ virDomainIOMMUDefParseXML(xmlNodePtr node, } =20 =20 +static virDomainVMGenIDDefPtr +virDomainVMGenIDDefParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt) +{ + virDomainVMGenIDDefPtr vmgenid =3D NULL; + virDomainVMGenIDDefPtr ret =3D NULL; + xmlNodePtr save =3D ctxt->node; + char *guidxml =3D NULL; + + ctxt->node =3D node; + + if (VIR_ALLOC(vmgenid) < 0) + goto cleanup; + + if (!(guidxml =3D virXMLPropString(node, "guid"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing required 'guid' attribute")); + goto cleanup; + } + + if (STREQ(guidxml, "auto")) { + vmgenid->autogenerate =3D true; + } else { + if (virUUIDParse(guidxml, vmgenid->guidstr) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("malformed guid=3D'%s' provided"), guidxml); + goto cleanup; + } + } + + VIR_STEAL_PTR(ret, vmgenid); + + cleanup: + VIR_FREE(vmgenid); + ctxt->node =3D save; + return ret; +} + + virDomainDeviceDefPtr virDomainDeviceDefParse(const char *xmlStr, const virDomainDef *def, @@ -15846,6 +15887,9 @@ virDomainDeviceDefParse(const char *xmlStr, goto error; break; case VIR_DOMAIN_DEVICE_VMGENID: + if (!(dev->data.vmgenid =3D virDomainVMGenIDDefParseXML(node, ctxt= ))) + goto error; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -20249,6 +20293,21 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(nodes); =20 + if ((n =3D virXPathNodeSet("./devices/vmgenid", ctxt, &nodes)) < 0) + goto error; + + if (n > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("only a single vmgenid device is supported")); + goto error; + } + + if (n > 0) { + if (!(def->vmgenid =3D virDomainVMGenIDDefParseXML(nodes[0], ctxt)= )) + goto error; + } + VIR_FREE(nodes); + /* analysis of the user namespace mapping */ if ((n =3D virXPathNodeSet("./idmap/uid", ctxt, &nodes)) < 0) goto error; @@ -21812,6 +21871,25 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= efPtr src, =20 =20 static bool +virDomainVMGenIDDefCheckABIStability(virDomainVMGenIDDefPtr src, + virDomainVMGenIDDefPtr dst) +{ + if (memcmp(src->guidstr, dst->guidstr, VIR_UUID_BUFLEN) !=3D 0) { + char guidsrc[VIR_UUID_STRING_BUFLEN]; + char guiddst[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(src->guidstr, guidsrc); + virUUIDFormat(dst->guidstr, guiddst); + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain vmgenid guid '%s' does not match " + "source '%s'"), + guiddst, guidsrc); + return false; + } + return true; +} + + +static bool virDomainDefVcpuCheckAbiStability(virDomainDefPtr src, virDomainDefPtr dst) { @@ -22256,6 +22334,17 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr= src, !virDomainIOMMUDefCheckABIStability(src->iommu, dst->iommu)) goto error; =20 + if (!!src->vmgenid !=3D !!dst->vmgenid) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Target domain vmgenid device count does not " + "match source")); + goto error; + } + + if (src->vmgenid && + !virDomainVMGenIDDefCheckABIStability(src->vmgenid, dst->vmgenid)) + goto error; + if (xmlopt && xmlopt->abi.domain && !xmlopt->abi.domain(src, dst)) goto error; @@ -26470,6 +26559,21 @@ virDomainIOMMUDefFormat(virBufferPtr buf, } =20 =20 +static void +virDomainVMGenIDDefFormat(virBufferPtr buf, + const virDomainVMGenIDDef *vmgenid) +{ + char guidstr[VIR_UUID_STRING_BUFLEN]; + + if (vmgenid->autogenerate) { + virBufferAddLit(buf, "\n"); + } else { + virUUIDFormat(vmgenid->guidstr, guidstr); + virBufferAsprintf(buf, "\n", guidstr); + } +} + + /* This internal version appends to an existing buffer * (possibly with auto-indent), rather than flattening * to string. @@ -27251,6 +27355,9 @@ virDomainDefFormatInternal(virDomainDefPtr def, virDomainIOMMUDefFormat(buf, def->iommu) < 0) goto error; =20 + if (def->vmgenid) + virDomainVMGenIDDefFormat(buf, def->vmgenid); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); =20 @@ -28371,13 +28478,16 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, case VIR_DOMAIN_DEVICE_SHMEM: rc =3D virDomainShmemDefFormat(&buf, src->data.shmem, flags); break; + case VIR_DOMAIN_DEVICE_VMGENID: + virDomainVMGenIDDefFormat(&buf, src->data.vmgenid); + rc =3D 0; + break; =20 case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_SMARTCARD: case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_VMGENID: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("Copying definition of '%d' type " diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6e204d31fb..7805ad1819 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -157,6 +157,9 @@ typedef virDomainTPMDef *virDomainTPMDefPtr; typedef struct _virDomainIOMMUDef virDomainIOMMUDef; typedef virDomainIOMMUDef *virDomainIOMMUDefPtr; =20 +typedef struct _virDomainVMGenIDDef virDomainVMGenIDDef; +typedef virDomainVMGenIDDef *virDomainVMGenIDDefPtr; + typedef struct _virDomainVirtioOptions virDomainVirtioOptions; typedef virDomainVirtioOptions *virDomainVirtioOptionsPtr; =20 @@ -219,6 +222,7 @@ struct _virDomainDeviceDef { virDomainPanicDefPtr panic; virDomainMemoryDefPtr memory; virDomainIOMMUDefPtr iommu; + virDomainVMGenIDDefPtr vmgenid; } data; }; =20 @@ -2309,6 +2313,12 @@ struct _virDomainVirtioOptions { virTristateSwitch ats; }; =20 +struct _virDomainVMGenIDDef { + bool autogenerate; + unsigned char guidstr[VIR_UUID_STRING_BUFLEN]; +}; + + /* * Guest VM main configuration * @@ -2449,6 +2459,7 @@ struct _virDomainDef { virSysinfoDefPtr sysinfo; virDomainRedirFilterDefPtr redirfilter; virDomainIOMMUDefPtr iommu; + virDomainVMGenIDDefPtr vmgenid; =20 void *namespaceData; virDomainXMLNamespace ns; diff --git a/tests/qemuxml2argvdata/vmgenid-auto.xml b/tests/qemuxml2argvda= ta/vmgenid-auto.xml new file mode 100644 index 0000000000..d111dbec8e --- /dev/null +++ b/tests/qemuxml2argvdata/vmgenid-auto.xml @@ -0,0 +1,32 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +

+ + +
+ + + + + + + + diff --git a/tests/qemuxml2argvdata/vmgenid.xml b/tests/qemuxml2argvdata/vm= genid.xml new file mode 100644 index 0000000000..14c94706df --- /dev/null +++ b/tests/qemuxml2argvdata/vmgenid.xml @@ -0,0 +1,32 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + + + + + + + diff --git a/tests/qemuxml2xmloutdata/vmgenid-auto.xml b/tests/qemuxml2xmlo= utdata/vmgenid-auto.xml new file mode 120000 index 0000000000..498b582ddc --- /dev/null +++ b/tests/qemuxml2xmloutdata/vmgenid-auto.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/vmgenid-auto.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/vmgenid.xml b/tests/qemuxml2xmloutdat= a/vmgenid.xml new file mode 120000 index 0000000000..37bb1c6b9c --- /dev/null +++ b/tests/qemuxml2xmloutdata/vmgenid.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/vmgenid.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 28ba46efb2..868a774bbf 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1193,6 +1193,9 @@ mymain(void) DO_TEST("intel-iommu-eim", NONE); DO_TEST("intel-iommu-device-iotlb", NONE); =20 + DO_TEST("vmgenid", NONE); + DO_TEST("vmgenid-auto", NONE); + DO_TEST("cpu-check-none", NONE); DO_TEST("cpu-check-partial", NONE); DO_TEST("cpu-check-full", NONE); --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list