From nobody Wed May 14 02:50:29 2025 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 1527158387277795.2011658086182; Thu, 24 May 2018 03:39:47 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E0A030C0ED3; Thu, 24 May 2018 10:39:43 +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 123CB65F73; Thu, 24 May 2018 10:39:43 +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 9DAD418033EF; Thu, 24 May 2018 10:39:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w4OAdKHD011613 for ; Thu, 24 May 2018 06:39:21 -0400 Received: by smtp.corp.redhat.com (Postfix) id D9ACE1049466; Thu, 24 May 2018 10:39:20 +0000 (UTC) Received: from icr.brq.redhat.com (unknown [10.43.2.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 625AB1049465 for ; Thu, 24 May 2018 10:39:20 +0000 (UTC) From: =?UTF-8?q?J=C3=A1n=20Tomko?= To: libvir-list@redhat.com Date: Thu, 24 May 2018 12:39:11 +0200 Message-Id: <6a9a5d7592f1ee9186699fae085b4a7513a39bc4.1527157595.git.jtomko@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCHv2 3/7] conf: introduce element 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 24 May 2018 10:39:46 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add a new 'vsock' element for the vsock device. The 'model' attribute is optional. A subelement should be used to specify the guest cid, or should be used. https://bugzilla.redhat.com/show_bug.cgi?id=3D1291851 --- docs/formatdomain.html.in | 20 +++ docs/schemas/domaincommon.rng | 29 ++++ src/conf/domain_conf.c | 195 ++++++++++++++++++++++= +++- src/conf/domain_conf.h | 17 +++ src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain_address.c | 11 ++ src/qemu/qemu_driver.c | 6 + src/qemu/qemu_hotplug.c | 1 + tests/qemuxml2argvdata/vhost-vsock-auto.xml | 35 +++++ tests/qemuxml2argvdata/vhost-vsock.xml | 36 +++++ tests/qemuxml2xmloutdata/vhost-vsock-auto.xml | 36 +++++ tests/qemuxml2xmloutdata/vhost-vsock.xml | 1 + tests/qemuxml2xmltest.c | 3 + 13 files changed, 390 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/vhost-vsock-auto.xml create mode 100644 tests/qemuxml2argvdata/vhost-vsock.xml create mode 100644 tests/qemuxml2xmloutdata/vhost-vsock-auto.xml create mode 120000 tests/qemuxml2xmloutdata/vhost-vsock.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 0d0fd3b9f3..bfe7f757b8 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8133,6 +8133,26 @@ qemu-kvm -net nic,model=3D? /dev/null =20 +

Vsock

+ +

A vsock host/guest interface. The model attribute + defaults to virtio. + The optional attribute cid of the source element + specifies the CID assigned to the guest. If the attribute + auto is set to yes, libvirt + will assign a free CID automatically on domain startup. + Since 4.4.0

+ +
+...
+<devices>
+  <vsock model=3D'virtio'>
+    <source auto=3D'no' cid=3D'3'/>
+  </vsock>
+</devices>
+...
+ +

Security label

=20

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 71ac3d079c..3ea5c91773 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4140,6 +4140,32 @@ =20 + + + + + virtio + + + + + + + + + + + + + + + + + + + + + @@ -4687,6 +4713,9 @@ + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b2982fc3d4..1a3dbf884b 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", + "vsock") =20 VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST, "none", @@ -869,6 +870,10 @@ VIR_ENUM_IMPL(virDomainTPMBackend, VIR_DOMAIN_TPM_TYPE= _LAST, VIR_ENUM_IMPL(virDomainIOMMUModel, VIR_DOMAIN_IOMMU_MODEL_LAST, "intel") =20 +VIR_ENUM_IMPL(virDomainVsockModel, VIR_DOMAIN_VSOCK_MODEL_LAST, + "default", + "virtio") + VIR_ENUM_IMPL(virDomainDiskDiscard, VIR_DOMAIN_DISK_DISCARD_LAST, "default", "unmap", @@ -2777,6 +2782,9 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def) case VIR_DOMAIN_DEVICE_IOMMU: VIR_FREE(def->data.iommu); break; + case VIR_DOMAIN_DEVICE_VSOCK: + virDomainVsockDefFree(def->data.vsock); + break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: break; @@ -3641,6 +3649,8 @@ virDomainDeviceGetInfo(virDomainDeviceDefPtr device) return &device->data.panic->info; case VIR_DOMAIN_DEVICE_MEMORY: return &device->data.memory->info; + case VIR_DOMAIN_DEVICE_VSOCK: + return &device->data.vsock->info; =20 /* The following devices do not contain virDomainDeviceInfo */ case VIR_DOMAIN_DEVICE_LEASE: @@ -3838,6 +3848,12 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr d= ef, return rc; } =20 + if (def->vsock) { + device.type =3D VIR_DOMAIN_DEVICE_VSOCK; + if ((rc =3D cb(def, &device, &def->vsock->info, opaque)) !=3D 0) + return rc; + } + /* Coverity is not very happy with this - all dead_error_condition */ #if !STATIC_ANALYSIS /* This switch statement is here to trigger compiler warning when addi= ng @@ -3872,6 +3888,7 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr de= f, case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: break; } #endif @@ -5575,6 +5592,19 @@ virDomainMemoryDefValidate(const virDomainMemoryDef = *mem) } =20 =20 +static int +virDomainVsockDefValidate(const virDomainVsockDef *vsock) +{ + if (vsock->guest_cid > 0 && vsock->guest_cid <=3D 2) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("guest CIDs must be >=3D 3")); + return -1; + } + + return 0; +} + + static int virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, const virDomainDef *def) @@ -5610,6 +5640,9 @@ virDomainDeviceDefValidateInternal(const virDomainDev= iceDef *dev, case VIR_DOMAIN_DEVICE_MEMORY: return virDomainMemoryDefValidate(dev->data.memory); =20 + case VIR_DOMAIN_DEVICE_VSOCK: + return virDomainVsockDefValidate(dev->data.vsock); + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: @@ -15878,6 +15911,68 @@ virDomainIOMMUDefParseXML(xmlNodePtr node, } =20 =20 +static virDomainVsockDefPtr +virDomainVsockDefParseXML(virDomainXMLOptionPtr xmlopt, + xmlNodePtr node, + xmlXPathContextPtr ctxt, + unsigned int flags) +{ + virDomainVsockDefPtr vsock =3D NULL, ret =3D NULL; + xmlNodePtr save =3D ctxt->node; + xmlNodePtr source; + char *tmp =3D NULL; + int val; + + ctxt->node =3D node; + + if (!(vsock =3D virDomainVsockDefNew(xmlopt))) + goto cleanup; + + if ((tmp =3D virXMLPropString(node, "model"))) { + if ((val =3D virDomainVsockModelTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_XML_ERROR, _("unknown vsock model: %s")= , tmp); + goto cleanup; + } + vsock->model =3D val; + } + + source =3D virXPathNode("./source", ctxt); + + VIR_FREE(tmp); + if (source && (tmp =3D virXMLPropString(source, "cid"))) { + if (virStrToLong_uip(tmp, NULL, 10, &vsock->guest_cid) < 0 || + vsock->guest_cid =3D=3D 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("'cid' attribute must be a positive number: %= s"), + tmp); + goto cleanup; + } + } + + VIR_FREE(tmp); + if (source && (tmp =3D virXMLPropString(source, "auto"))) { + val =3D virTristateBoolTypeFromString(tmp); + if (val < 0) { + virReportError(VIR_ERR_XML_DETAIL, + _("'auto' attribute can be 'yes' or 'no': %s"), + tmp); + goto cleanup; + } + vsock->auto_cid =3D val; + } + + if (virDomainDeviceInfoParseXML(xmlopt, node, NULL, &vsock->info, flag= s) < 0) + goto cleanup; + + VIR_STEAL_PTR(ret, vsock); + + cleanup: + ctxt->node =3D save; + VIR_FREE(vsock); + VIR_FREE(tmp); + return ret; +} + virDomainDeviceDefPtr virDomainDeviceDefParse(const char *xmlStr, const virDomainDef *def, @@ -16033,6 +16128,11 @@ virDomainDeviceDefParse(const char *xmlStr, if (!(dev->data.iommu =3D virDomainIOMMUDefParseXML(node, ctxt))) goto error; break; + case VIR_DOMAIN_DEVICE_VSOCK: + if (!(dev->data.vsock =3D virDomainVsockDefParseXML(xmlopt, node, = ctxt, + flags))) + goto error; + break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: break; @@ -20435,6 +20535,22 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(nodes); =20 + if ((n =3D virXPathNodeSet("./devices/vsock", ctxt, &nodes)) < 0) + goto error; + + if (n > 1) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("only a single vsock device is supported")); + goto error; + } + + if (n > 0) { + if (!(def->vsock =3D virDomainVsockDefParseXML(xmlopt, nodes[0], + ctxt, flags))) + goto error; + } + VIR_FREE(nodes); + /* analysis of the user namespace mapping */ if ((n =3D virXPathNodeSet("./idmap/uid", ctxt, &nodes)) < 0) goto error; @@ -21996,6 +22112,26 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUD= efPtr src, } =20 =20 +static bool +virDomainVsockDefCheckABIStability(virDomainVsockDefPtr src, + virDomainVsockDefPtr dst) +{ + if (src->model !=3D dst->model) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain vsock device model '%s' " + "does not match source '%s'"), + virDomainVsockModelTypeToString(dst->model), + virDomainVsockModelTypeToString(src->model)); + return false; + } + + if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info)) + return false; + + return true; +} + + static bool virDomainDefVcpuCheckAbiStability(virDomainDefPtr src, virDomainDefPtr dst) @@ -22441,6 +22577,17 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr= src, !virDomainIOMMUDefCheckABIStability(src->iommu, dst->iommu)) goto error; =20 + if (!!src->vsock !=3D !!dst->vsock) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Target domain vsock device count " + "does not match source")); + goto error; + } + + if (src->vsock && + !virDomainVsockDefCheckABIStability(src->vsock, dst->vsock)) + goto error; + if (xmlopt && xmlopt->abi.domain && !xmlopt->abi.domain(src, dst)) goto error; @@ -22478,6 +22625,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr = src, case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: break; } #endif @@ -26735,6 +26883,46 @@ virDomainMemtuneFormat(virBufferPtr buf, } =20 =20 +static int +virDomainVsockDefFormat(virBufferPtr buf, + virDomainVsockDefPtr vsock) +{ + virBuffer childBuf =3D VIR_BUFFER_INITIALIZER; + virBuffer attrBuf =3D VIR_BUFFER_INITIALIZER; + virBuffer sourceAttrBuf =3D VIR_BUFFER_INITIALIZER; + int ret =3D -1; + + if (vsock->model) { + virBufferAsprintf(&attrBuf, " model=3D'%s'", + virDomainVsockModelTypeToString(vsock->model)); + } + + virBufferSetChildIndent(&childBuf, buf); + + if (vsock->auto_cid !=3D VIR_TRISTATE_BOOL_ABSENT) { + virBufferAsprintf(&sourceAttrBuf, " auto=3D'%s'", + virTristateBoolTypeToString(vsock->auto_cid)); + } + if (vsock->guest_cid !=3D 0) + virBufferAsprintf(&sourceAttrBuf, " cid=3D'%u'", vsock->guest_cid); + if (virXMLFormatElement(&childBuf, "source", &sourceAttrBuf, NULL) < 0) + goto cleanup; + + virDomainDeviceInfoFormat(&childBuf, &vsock->info, 0); + + if (virXMLFormatElement(buf, "vsock", &attrBuf, &childBuf) < 0) + goto cleanup; + + ret =3D 0; + + cleanup: + virBufferFreeAndReset(&childBuf); + virBufferFreeAndReset(&attrBuf); + virBufferFreeAndReset(&sourceAttrBuf); + return ret; +} + + /* This internal version appends to an existing buffer * (possibly with auto-indent), rather than flattening * to string. @@ -27469,6 +27657,10 @@ virDomainDefFormatInternal(virDomainDefPtr def, virDomainIOMMUDefFormat(buf, def->iommu) < 0) goto error; =20 + if (def->vsock && + virDomainVsockDefFormat(buf, def->vsock) < 0) + goto error; + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); =20 @@ -28595,6 +28787,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: 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 4fa67ae7b7..a5e45bfda5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -189,6 +189,7 @@ typedef enum { VIR_DOMAIN_DEVICE_PANIC, VIR_DOMAIN_DEVICE_MEMORY, VIR_DOMAIN_DEVICE_IOMMU, + VIR_DOMAIN_DEVICE_VSOCK, =20 VIR_DOMAIN_DEVICE_LAST } virDomainDeviceType; @@ -221,6 +222,7 @@ struct _virDomainDeviceDef { virDomainPanicDefPtr panic; virDomainMemoryDefPtr memory; virDomainIOMMUDefPtr iommu; + virDomainVsockDefPtr vsock; } data; }; =20 @@ -2313,8 +2315,21 @@ struct _virDomainIOMMUDef { virTristateSwitch iotlb; }; =20 +typedef enum { + VIR_DOMAIN_VSOCK_MODEL_DEFAULT, + VIR_DOMAIN_VSOCK_MODEL_VIRTIO, + + VIR_DOMAIN_VSOCK_MODEL_LAST +} virDomainVsockModel; + struct _virDomainVsockDef { virObjectPtr privateData; + + virDomainVsockModel model; + unsigned int guest_cid; + virTristateBool auto_cid; + + virDomainDeviceInfo info; }; =20 struct _virDomainVirtioOptions { @@ -2462,6 +2477,7 @@ struct _virDomainDef { virSysinfoDefPtr sysinfo; virDomainRedirFilterDefPtr redirfilter; virDomainIOMMUDefPtr iommu; + virDomainVsockDefPtr vsock; =20 void *namespaceData; virDomainXMLNamespace ns; @@ -3366,6 +3382,7 @@ VIR_ENUM_DECL(virDomainMemoryBackingModel) VIR_ENUM_DECL(virDomainMemorySource) VIR_ENUM_DECL(virDomainMemoryAllocation) VIR_ENUM_DECL(virDomainIOMMUModel) +VIR_ENUM_DECL(virDomainVsockModel) VIR_ENUM_DECL(virDomainShmemModel) /* from libvirt.h */ VIR_ENUM_DECL(virDomainState) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d3beee5d87..6648933c80 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5132,6 +5132,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: 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 b7c82cb6f1..e9f460d77a 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -859,6 +859,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDefPtr dev, } break; =20 + case VIR_DOMAIN_DEVICE_VSOCK: + return virtioFlags; + /* These devices don't ever connect with PCI */ case VIR_DOMAIN_DEVICE_NVRAM: case VIR_DOMAIN_DEVICE_TPM: @@ -2152,6 +2155,14 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, /* Nada - none are PCI based (yet) */ } =20 + if (def->vsock && + virDeviceInfoPCIAddressWanted(&def->vsock->info)) { + + if (qemuDomainPCIAddressReserveNextAddr(addrs, + &def->vsock->info) < 0) + goto error; + } + return 0; =20 error: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3a328e5d46..9d5cf4d61a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7701,6 +7701,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%s' is not supported"), @@ -7800,6 +7801,7 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%s' is not supported"), @@ -7936,6 +7938,7 @@ qemuDomainUpdateDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%s' is not supported"), @@ -8122,6 +8125,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%s' is not support= ed"), @@ -8305,6 +8309,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%s' is not supporte= d"), @@ -8403,6 +8408,7 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: 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 b35594be5f..e429f54a43 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4626,6 +4626,7 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %s device"), diff --git a/tests/qemuxml2argvdata/vhost-vsock-auto.xml b/tests/qemuxml2ar= gvdata/vhost-vsock-auto.xml new file mode 100644 index 0000000000..729d58bea4 --- /dev/null +++ b/tests/qemuxml2argvdata/vhost-vsock-auto.xml @@ -0,0 +1,35 @@ + + test + bba65c0e-c049-934f-b6aa-4e2c0582acdf + 1048576 + 1048576 + 1 + + hvm + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + +

+ + +
+ + +
+ + + + + + + + + + diff --git a/tests/qemuxml2argvdata/vhost-vsock.xml b/tests/qemuxml2argvdat= a/vhost-vsock.xml new file mode 100644 index 0000000000..ac210cb116 --- /dev/null +++ b/tests/qemuxml2argvdata/vhost-vsock.xml @@ -0,0 +1,36 @@ + + test + bba65c0e-c049-934f-b6aa-4e2c0582acdf + 1048576 + 1048576 + 1 + + hvm + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + +
+ + + + + + + +
+ + + diff --git a/tests/qemuxml2xmloutdata/vhost-vsock-auto.xml b/tests/qemuxml2= xmloutdata/vhost-vsock-auto.xml new file mode 100644 index 0000000000..65f18b96d9 --- /dev/null +++ b/tests/qemuxml2xmloutdata/vhost-vsock-auto.xml @@ -0,0 +1,36 @@ + + test + bba65c0e-c049-934f-b6aa-4e2c0582acdf + 1048576 + 1048576 + 1 + + hvm + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + +
+ + + + + + + +
+ + + diff --git a/tests/qemuxml2xmloutdata/vhost-vsock.xml b/tests/qemuxml2xmlou= tdata/vhost-vsock.xml new file mode 120000 index 0000000000..bb24241fb2 --- /dev/null +++ b/tests/qemuxml2xmloutdata/vhost-vsock.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/vhost-vsock.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 7cedc2b999..cd6538a442 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1209,6 +1209,9 @@ mymain(void) DO_TEST_STATUS("migration-in-params"); DO_TEST_STATUS("migration-out-params"); =20 + DO_TEST("vhost-vsock", NONE); + DO_TEST("vhost-vsock-auto", NONE); + if (getenv("LIBVIRT_SKIP_CLEANUP") =3D=3D NULL) virFileDeleteTree(fakerootdir); =20 --=20 2.16.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list