From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600983941; cv=none; d=zohomail.com; s=zohoarc; b=ODEHmG541WvdJTr9VCWINR3g5JCVs9RiQfjMtme1B/eyc4gw6zBewzYzGR1pBMRC9IQ/uFIH+uGkIKNJvUYewFRSTLZFJn7ZkifjFfocO7T9QjFp1M+JmPmxFrphCaL8xkNVa7ysBD8+jumXH50sBGpO/lYX0BMt+8jdqczB3Bg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600983941; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=DgoPGg23obJnJn21kdHjp7O9EW96T6LkPq9UMpJJ5cQ=; b=Sng13pFdHafKcP/cUl5Hs51CnsFXowfpo54POCV8DSJzZmd2/wplj3Go2mdOVqoh7iQo3aKI7ZoHDLmNrzMcIPZBITtjVHa9yvmvZf3yLyx5Q8MnEG0YvarDPcICQPWlpUh80DeARx5wRjp3MfxKXMi11Lxed7mv5QIY9nwzURo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1600983941018807.4441723676618; Thu, 24 Sep 2020 14:45:41 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-395-0dDR_1XMPryUqFStYt3cYw-1; Thu, 24 Sep 2020 17:45:37 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7B79F10074B1; Thu, 24 Sep 2020 21:45:31 +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 56D4A261B6; Thu, 24 Sep 2020 21:45:31 +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 554241826D2D; Thu, 24 Sep 2020 21:45:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjNlA021315 for ; Thu, 24 Sep 2020 17:45:23 -0400 Received: by smtp.corp.redhat.com (Postfix) id 672EB5576B; Thu, 24 Sep 2020 21:45:23 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0CF7A5577A; Thu, 24 Sep 2020 21:45:22 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600983939; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=DgoPGg23obJnJn21kdHjp7O9EW96T6LkPq9UMpJJ5cQ=; b=A4J1d7HFNMoDWIR0tbwsJKtB/6uwSJ1vwZD1YoKhoLVcF/m71laHeIsRCmyMdVmNtttew8 TQRexz6jafmdy1wOAFRTdIn0V28gv3kXpOGjDw4t48zUYZZpNzaiwGHzvoBtP3g9FvSu+Q KkY6eW8allwN5ELZX+ZRfhTyu/yhwBA= X-MC-Unique: 0dDR_1XMPryUqFStYt3cYw-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 1/6] conf: Add support for vDPA network devices Date: Thu, 24 Sep 2020 16:45:11 -0500 Message-Id: <20200924214516.2348879-2-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" This patch adds new schema and adds support for parsing and formatting domain configurations that include vdpa devices. vDPA network devices allow high-performance networking in a virtual machine by providing a wire-speed data path. These devices require a vendor-specific host driver but the data path follows the virtio specification. When a device on the host is bound to an appropriate vendor-specific driver, it will create a chardev on the host at e.g. /dev/vhost-vdpa-0. That chardev path can then be used to define a new interface with type=3D'vdpa'. Signed-off-by: Jonathon Jongsma --- docs/formatdomain.rst | 24 ++++++++++++++++++++++++ docs/schemas/domaincommon.rng | 15 +++++++++++++++ src/conf/domain_conf.c | 31 +++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 4 ++++ src/conf/netdev_bandwidth_conf.c | 1 + src/libxl/libxl_conf.c | 1 + src/libxl/xen_common.c | 1 + src/lxc/lxc_controller.c | 1 + src/lxc/lxc_driver.c | 3 +++ src/lxc/lxc_process.c | 1 + src/qemu/qemu_command.c | 3 +++ src/qemu/qemu_domain.c | 4 +++- src/qemu/qemu_hotplug.c | 3 +++ src/qemu/qemu_interface.c | 2 ++ src/qemu/qemu_process.c | 2 ++ src/qemu/qemu_validate.c | 1 + src/vmx/vmx.c | 1 + tools/virsh-domain.c | 1 + 18 files changed, 98 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 888db5ea29..b0c2b43dc2 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -4643,6 +4643,30 @@ or stopping the guest. ... =20 +:anchor:`` + +vDPA devices +^^^^^^^^^^^^ + +A vDPA network device can be used to provide wire speed network performance +within a domain. A vDPA device is a specialized type of network device that +uses a datapath that complies with the virtio specification but has a +vendor-specific control path. To use such a device with libvirt, the host +device must already be bound to the appropriate device-specific vDPA drive= r. +This creates a vDPA char device (e.g. /dev/vhost-vdpa-0) that can be used = to +assign the device to a libvirt domain. :since:`Since 6.8.0 (QEMU only, +requires QEMU 5.1.0 or newer)` + +:: + + ... + + + + + + ... + :anchor:`` =20 Teaming a virtio/hostdev NIC pair diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 4b7e460148..4ce485a762 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3117,6 +3117,21 @@ + + + + vdpa + + + + + + + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a91dbd4aa9..0b78ff7c70 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -554,6 +554,7 @@ VIR_ENUM_IMPL(virDomainNet, "direct", "hostdev", "udp", + "vdpa", ); =20 VIR_ENUM_IMPL(virDomainNetModel, @@ -2505,6 +2506,10 @@ virDomainNetDefClear(virDomainNetDefPtr def) def->data.vhostuser =3D NULL; break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: + VIR_FREE(def->data.vdpa.devicepath); + break; + case VIR_DOMAIN_NET_TYPE_SERVER: case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_MCAST: @@ -12133,6 +12138,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlo= pt, if (virDomainChrSourceReconnectDefParseXML(&reconnect, cur= , ctxt) < 0) goto error; =20 + } else if (!dev + && def->type =3D=3D VIR_DOMAIN_NET_TYPE_VDPA + && virXMLNodeNameEqual(cur, "source")) { + dev =3D virXMLPropString(cur, "dev"); } else if (!def->virtPortProfile && virXMLNodeNameEqual(cur, "virtualport")) { if (def->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { @@ -12390,6 +12399,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlo= pt, } break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: + if (dev =3D=3D NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("No 'dev' attribute " + "specified with ")); + goto error; + } + def->data.vdpa.devicepath =3D g_steal_pointer(&dev); + break; + case VIR_DOMAIN_NET_TYPE_BRIDGE: if (bridge =3D=3D NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -12779,6 +12798,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlop= t, case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: break; case VIR_DOMAIN_NET_TYPE_LAST: default: @@ -26947,6 +26967,14 @@ virDomainNetDefFormat(virBufferPtr buf, } break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: + if (def->data.vdpa.devicepath) { + virBufferEscapeString(buf, "data.vdpa.devicepath); + sourceLines++; + } + break; + case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_LAST: break; @@ -31160,6 +31188,7 @@ virDomainNetGetActualVirtPortProfile(const virDomai= nNetDef *iface) case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: default: return NULL; @@ -31992,6 +32021,7 @@ virDomainNetTypeSharesHostView(const virDomainNetDe= f *net) case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: break; } @@ -32256,6 +32286,7 @@ virDomainNetDefActualToNetworkPort(virDomainDefPtr = dom, case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unexpected network port type %s"), virDomainNetTypeToString(virDomainNetGetActualType(= iface))); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 8f1662aae0..da35aa6c2d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -883,6 +883,7 @@ typedef enum { VIR_DOMAIN_NET_TYPE_DIRECT, VIR_DOMAIN_NET_TYPE_HOSTDEV, VIR_DOMAIN_NET_TYPE_UDP, + VIR_DOMAIN_NET_TYPE_VDPA, =20 VIR_DOMAIN_NET_TYPE_LAST } virDomainNetType; @@ -1056,6 +1057,9 @@ struct _virDomainNetDef { */ virDomainActualNetDefPtr actual; } network; + struct { + char *devicepath; + } vdpa; struct { char *brname; } bridge; diff --git a/src/conf/netdev_bandwidth_conf.c b/src/conf/netdev_bandwidth_c= onf.c index 396ac62019..4eb12e2951 100644 --- a/src/conf/netdev_bandwidth_conf.c +++ b/src/conf/netdev_bandwidth_conf.c @@ -315,6 +315,7 @@ bool virNetDevSupportsBandwidth(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: break; } diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 5b729a019a..b570a5a167 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1391,6 +1391,7 @@ libxlMakeNic(virDomainDefPtr def, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported interface type %s"), diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c index 56702a2a76..183b09671a 100644 --- a/src/libxl/xen_common.c +++ b/src/libxl/xen_common.c @@ -1792,6 +1792,7 @@ xenFormatNet(virConnectPtr conn, case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type= '%s'"), virDomainNetTypeToString(net->type)); return -1; diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index c3cf485e2c..9f944dec74 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -422,6 +422,7 @@ static int virLXCControllerGetNICIndexes(virLXCControll= erPtr ctrl) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type %s"), virDomainNetTypeToString(actualType)); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index a530488dd2..4d3c5d9f63 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3504,6 +3504,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriverPtr driver, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Network device type is not supported")); goto cleanup; @@ -3558,6 +3559,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriverPtr driver, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: default: /* no-op */ @@ -3999,6 +4001,7 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only bridged veth devices can be detached")); goto cleanup; diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 16969dbf33..d103ec6666 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -606,6 +606,7 @@ virLXCProcessSetupInterfaces(virLXCDriverPtr driver, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_LAST: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unsupported network type %s"), virDomainNetTypeToString(type)); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 91b59538aa..a9367f7758 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3692,6 +3692,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, return NULL; break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_HOSTDEV: /* Should have been handled earlier via PCI/USB hotplug code. */ case VIR_DOMAIN_NET_TYPE_LAST: @@ -8132,6 +8133,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* nada */ break; @@ -8168,6 +8170,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* These types don't use a network device on the host, but * instead use some other type of connection to the emulated diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 279de2997d..fe80fa9aed 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5129,7 +5129,8 @@ qemuDomainDeviceNetDefPostParse(virDomainNetDefPtr ne= t, const virDomainDef *def, virQEMUCapsPtr qemuCaps) { - if (net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && + if (net->type !=3D VIR_DOMAIN_NET_TYPE_VDPA && + net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && !virDomainNetGetModelString(net) && virDomainNetResolveActualType(net) !=3D VIR_DOMAIN_NET_TYPE_HOSTDE= V) net->model =3D qemuDomainDefaultNetModel(def, qemuCaps); @@ -9323,6 +9324,7 @@ qemuDomainNetSupportsMTU(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: break; } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index fc0866c011..ade77330ff 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1340,6 +1340,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("hotplug of interface type of %s is not implement= ed yet"), @@ -3390,6 +3391,7 @@ qemuDomainChangeNetFilter(virDomainObjPtr vm, case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("filters not supported on interfaces of type %s"), virDomainNetTypeToString(virDomainNetGetActualType(= newdev))); @@ -3727,6 +3729,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, =20 case VIR_DOMAIN_NET_TYPE_VHOSTUSER: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("unable to change config on '%s' network type= "), virDomainNetTypeToString(newdev->type)); diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c index cbf3d99981..b24f9060a9 100644 --- a/src/qemu/qemu_interface.c +++ b/src/qemu/qemu_interface.c @@ -118,6 +118,7 @@ qemuInterfaceStartDevice(virDomainNetDefPtr net) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* these types all require no action */ break; @@ -203,6 +204,7 @@ qemuInterfaceStopDevice(virDomainNetDefPtr net) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* these types all require no action */ break; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f21b8f1585..b32b9fe20a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3363,6 +3363,7 @@ qemuProcessNotifyNets(virDomainDefPtr def) case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: break; } @@ -7591,6 +7592,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* No special cleanup procedure for these types. */ break; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 3ed4039cdf..1c803c98f7 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1145,6 +1145,7 @@ qemuValidateNetSupportsCoalesce(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: break; } diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 4b1b04c6e1..6e0fd61f60 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3833,6 +3833,7 @@ virVMXFormatEthernet(virDomainNetDefPtr def, int cont= roller, case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type= '%s'"), virDomainNetTypeToString(def->type)); return -1; diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 32edfc0398..ef2a353aab 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -1007,6 +1007,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd) case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_LAST: vshError(ctl, _("No support for %s in command 'attach-interface'"), --=20 2.26.2 From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600984039; cv=none; d=zohomail.com; s=zohoarc; b=GZyNn16IlkdcMcFiDOQBg/89TSY/DNCQv/vXe00dQRvfOGAoZ507GdK5GW7SCZZvt4W8hupTicSiNxCLazWr/Z8Y2IEBVyo7IvYpDudWaUcHsr8DErbAEXAcRBtJa7htuezV3xTIyuXxWLUhl4wVBe5nWRYotbVti5Qh084S1VI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600984039; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GroBKwUJ1D2INfdJZmLiagD5ivH43oVRXHj+HvTVxHo=; b=kl6qRvTZsdxANRr51Z+9PBSrl++2RIui75TiZn51vl8acEg5mima54+bvxmOzDs1d+PsCcL9kXcEyO67cHkRgHwEyhyhqNqU6xgbEthOO1ToK2fBCeunSLh+8QZdQK05Q8LaroyuLRoOGvQL+H2+fRAJ45HwGYz5dcKvMw47E1M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1600984039786188.29853385144156; Thu, 24 Sep 2020 14:47:19 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-543-AJnJNTm6PsS2h5WfL5glOw-1; Thu, 24 Sep 2020 17:47:16 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7D04C186DD4B; Thu, 24 Sep 2020 21:47: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 5E64855771; Thu, 24 Sep 2020 21:47: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 2B32D44A47; Thu, 24 Sep 2020 21:47:10 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjNgL021321 for ; Thu, 24 Sep 2020 17:45:23 -0400 Received: by smtp.corp.redhat.com (Postfix) id D07C65576B; Thu, 24 Sep 2020 21:45:23 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 83E835577A; Thu, 24 Sep 2020 21:45:23 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600984038; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=GroBKwUJ1D2INfdJZmLiagD5ivH43oVRXHj+HvTVxHo=; b=KcwF4C1Txpy77zKXu91yHyNxHmUnpmCUH1eUPXaUHpDev6ulrt/ZJZr+WvpfTkEraGeCR/ 71XJvubG4SeEd3KedfDkBB2cBFM1zBIz/X0QEgIu3llHwb41Lco6rgPByaej5eoXtK8SJg bfGEGuwWZishSduTBGI9Dny5m1hpTIU= X-MC-Unique: AJnJNTm6PsS2h5WfL5glOw-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 2/6] qemu: add vhost-vdpa capability Date: Thu, 24 Sep 2020 16:45:12 -0500 Message-Id: <20200924214516.2348879-3-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Recent versions of qemu added the -netdev vhost-vdpa device. This capability allows libvirt to know whether this is supported. Signed-off-by: Jonathon Jongsma --- src/qemu/qemu_capabilities.c | 4 ++++ src/qemu/qemu_capabilities.h | 3 +++ tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml | 1 + 4 files changed, 9 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 2cc0c61588..b19928f68d 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -597,6 +597,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "spapr-tpm-proxy", "numa.hmat", "blockdev-hostdev-scsi", + + /* 380 */ + "netdev.vhost-vdpa", ); =20 =20 @@ -1526,6 +1529,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsQMPSc= hemaQueries[] =3D { { "migrate-set-parameters/arg-type/downtime-limit", QEMU_CAPS_MIGRATIO= N_PARAM_DOWNTIME }, { "migrate-set-parameters/arg-type/xbzrle-cache-size", QEMU_CAPS_MIGRA= TION_PARAM_XBZRLE_CACHE_SIZE }, { "set-numa-node/arg-type/+hmat-lb", QEMU_CAPS_NUMA_HMAT }, + { "netdev_add/arg-type/+vhost-vdpa", QEMU_CAPS_NETDEV_VHOST_VDPA }, }; =20 typedef struct _virQEMUCapsObjectTypeProps virQEMUCapsObjectTypeProps; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5d08941538..b6110f1c34 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -578,6 +578,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for = syntax-check */ QEMU_CAPS_NUMA_HMAT, /* -numa hmat */ QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI, /* -blockdev used for (i)SCSI hostdev= s */ =20 + /* 380 */ + QEMU_CAPS_NETDEV_VHOST_VDPA, /* -netdev vhost-vdpa*/ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; =20 diff --git a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_5.1.0.x86_64.xml index 7496ff1379..0fd2f3b816 100644 --- a/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.1.0.x86_64.xml @@ -242,6 +242,7 @@ + 5001000 0 43100242 diff --git a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml b/tests/qemuc= apabilitiesdata/caps_5.2.0.x86_64.xml index 151bd18137..e4686000a9 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0.x86_64.xml @@ -242,6 +242,7 @@ + 5001050 0 43100243 --=20 2.26.2 From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600983966; cv=none; d=zohomail.com; s=zohoarc; b=mQYTef7onUjLWtvUy8MPKEc69lx/Qk0FGcv2QX7ePa3szf5dvoowFdKSEBOJv7E4OCKNbfw+kwZHbcDi0WgcFV+PRFqt6AaaIPz3bbl6pnMHLVh5rb7tI+yE/4DBTBHz17apbVsEt0Devz3lu5zo3SWQVK2+GwQnqIYzvMATlic= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600983966; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WEgl6ysyT8xCFf1r2xIQVJRZNUf2mtl6jXeLYa2+8HA=; b=dRUClPatda7I9d2izp29UHaVplFEjDRY/EGVezR7udLI/y++f3nxs1vRIAIPQeu0M9L79vcMzGY7AqBYTwDJ4cF+9TY7ITrwmyvdpAKZRztIBTs91YZeCZBzSU7S2xxmQSkKxfzrxv1sg/TCVuc57ZN4DCmX2PTaT3XDbEFU8Vw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1600983966298727.0745201877078; Thu, 24 Sep 2020 14:46:06 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-390-J6-yC1LDMbKCNfwNL0wBAw-1; Thu, 24 Sep 2020 17:45:51 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 773B580734F; Thu, 24 Sep 2020 21:45:46 +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 52A5D1002C0E; Thu, 24 Sep 2020 21:45:46 +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 2003D79DA9; Thu, 24 Sep 2020 21:45:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjOSp021329 for ; Thu, 24 Sep 2020 17:45:24 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5398655771; Thu, 24 Sep 2020 21:45:24 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ED7B55576B; Thu, 24 Sep 2020 21:45:23 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600983965; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=WEgl6ysyT8xCFf1r2xIQVJRZNUf2mtl6jXeLYa2+8HA=; b=JfNhqjmgYWlh3i01i4YrlDe8aTF4zgq+ZXuhUTggQrEZ+clZLHA/a+5264ySt7bKSHmu1I 1Rli4n+CBDKg/roBf3phCGscRRvxdKPj22iRi4VurS+15ZCwiJhWjPrZj73JQIye66nyoT ITIn2CqdWBGFcdweRl55s1pttVVlb/s= X-MC-Unique: J6-yC1LDMbKCNfwNL0wBAw-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 3/6] qemu: add vdpa support Date: Thu, 24 Sep 2020 16:45:13 -0500 Message-Id: <20200924214516.2348879-4-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Enable for qemu domains. This provides basic support and does not support hotplug or migration. Signed-off-by: Jonathon Jongsma --- src/qemu/qemu_command.c | 35 ++++++++++++++++-- src/qemu/qemu_command.h | 3 +- src/qemu/qemu_domain.c | 6 ++- src/qemu/qemu_hotplug.c | 14 ++++--- src/qemu/qemu_interface.c | 23 ++++++++++++ src/qemu/qemu_interface.h | 2 + src/qemu/qemu_migration.c | 10 ++++- src/qemu/qemu_validate.c | 14 +++++++ .../net-vdpa.x86_64-latest.args | 37 +++++++++++++++++++ tests/qemuxml2argvdata/net-vdpa.xml | 28 ++++++++++++++ tests/qemuxml2argvmock.c | 11 +++++- tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmloutdata/net-vdpa.xml | 34 +++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 14 files changed, 205 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxml2argvdata/net-vdpa.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/net-vdpa.xml create mode 100644 tests/qemuxml2xmloutdata/net-vdpa.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index a9367f7758..bc1d4bfd90 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3554,7 +3554,8 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, size_t tapfdSize, char **vhostfd, size_t vhostfdSize, - const char *slirpfd) + const char *slirpfd, + const char *vdpadev) { bool is_tap =3D false; virDomainNetType netType =3D virDomainNetGetActualType(net); @@ -3693,6 +3694,12 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, break; =20 case VIR_DOMAIN_NET_TYPE_VDPA: + /* Caller will pass the fd to qemu with add-fd */ + if (virJSONValueObjectCreate(&netprops, "s:type", "vhost-vdpa", NU= LL) < 0 || + virJSONValueObjectAppendString(netprops, "vhostdev", vdpadev) = < 0) + return NULL; + break; + case VIR_DOMAIN_NET_TYPE_HOSTDEV: /* Should have been handled earlier via PCI/USB hotplug code. */ case VIR_DOMAIN_NET_TYPE_LAST: @@ -8042,6 +8049,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, char **tapfdName =3D NULL; char **vhostfdName =3D NULL; g_autofree char *slirpfdName =3D NULL; + g_autofree char *vdpafdName =3D NULL; + int vdpafd =3D -1; virDomainNetType actualType =3D virDomainNetGetActualType(net); const virNetDevBandwidth *actualBandwidth; bool requireNicdev =3D false; @@ -8127,13 +8136,17 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driv= er, =20 break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: + if ((vdpafd =3D qemuInterfaceVDPAConnect(net)) < 0) + goto cleanup; + break; + case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_SERVER: case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: - case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: /* nada */ break; @@ -8250,13 +8263,29 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driv= er, vhostfd[i] =3D -1; } =20 + if (vdpafd > 0) { + g_autofree char *fdset =3D NULL; + g_autofree char *addfdarg =3D NULL; + + virCommandPassFD(cmd, vdpafd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); + fdset =3D qemuVirCommandGetFDSet(cmd, vdpafd); + if (!fdset) + goto cleanup; + vdpafdName =3D qemuVirCommandGetDevSet(cmd, vdpafd); + /* set opaque to the devicepath so that we can look up the fdset l= ater + * if necessary */ + addfdarg =3D g_strdup_printf("%s,opaque=3D%s", fdset, + net->data.vdpa.devicepath); + virCommandAddArgList(cmd, "-add-fd", addfdarg, NULL); + } + if (chardev) virCommandAddArgList(cmd, "-chardev", chardev, NULL); =20 if (!(hostnetprops =3D qemuBuildHostNetStr(net, tapfdName, tapfdSize, vhostfdName, vhostfdSize, - slirpfdName))) + slirpfdName, vdpafdName))) goto cleanup; =20 if (!(host =3D virQEMUBuildNetdevCommandlineFromJSON(hostnetprops, diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 89d99b111f..8db51f93b1 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -99,7 +99,8 @@ virJSONValuePtr qemuBuildHostNetStr(virDomainNetDefPtr ne= t, size_t tapfdSize, char **vhostfd, size_t vhostfdSize, - const char *slirpfd); + const char *slirpfd, + const char *vdpadev); =20 /* Current, best practice */ char *qemuBuildNicDevStr(virDomainDefPtr def, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index fe80fa9aed..28a303b3e2 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5129,8 +5129,10 @@ qemuDomainDeviceNetDefPostParse(virDomainNetDefPtr n= et, const virDomainDef *def, virQEMUCapsPtr qemuCaps) { - if (net->type !=3D VIR_DOMAIN_NET_TYPE_VDPA && - net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_VDPA && + !virDomainNetGetModelString(net)) + net->model =3D VIR_DOMAIN_NET_MODEL_VIRTIO; + else if (net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && !virDomainNetGetModelString(net) && virDomainNetResolveActualType(net) !=3D VIR_DOMAIN_NET_TYPE_HOSTDE= V) net->model =3D qemuDomainDefaultNetModel(def, qemuCaps); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index ade77330ff..0582b78f97 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1389,7 +1389,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, if (!(netprops =3D qemuBuildHostNetStr(net, tapfdName, tapfdSize, vhostfdName, vhostfdSize, - slirpfdName))) + slirpfdName, NULL))) goto cleanup; =20 qemuDomainObjEnterMonitor(driver, vm); @@ -3485,10 +3485,11 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, olddev =3D *devslot; =20 oldType =3D virDomainNetGetActualType(olddev); - if (oldType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV) { - /* no changes are possible to a type=3D'hostdev' interface */ + if (oldType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV || + oldType =3D=3D VIR_DOMAIN_NET_TYPE_VDPA) { + /* no changes are possible to a type=3D'hostdev' or type=3D'vdpa' = interface */ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("cannot change config of '%s' network type"), + _("cannot change config of '%s' network interface t= ype"), virDomainNetTypeToString(oldType)); goto cleanup; } @@ -3673,8 +3674,9 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, =20 newType =3D virDomainNetGetActualType(newdev); =20 - if (newType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV) { - /* can't turn it into a type=3D'hostdev' interface */ + if (newType =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV || + newType =3D=3D VIR_DOMAIN_NET_TYPE_VDPA) { + /* can't turn it into a type=3D'hostdev' or type=3D'vdpa' interfac= e */ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("cannot change network interface type to '%s'"), virDomainNetTypeToString(newType)); diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c index b24f9060a9..3714828fe1 100644 --- a/src/qemu/qemu_interface.c +++ b/src/qemu/qemu_interface.c @@ -638,6 +638,29 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def, } =20 =20 +/* qemuInterfaceVDPAConnect: + * @net: pointer to the VM's interface description + * + * returns: file descriptor of the vdpa device + * + * Called *only* called if actualType is VIR_DOMAIN_NET_TYPE_VDPA + */ +int +qemuInterfaceVDPAConnect(virDomainNetDefPtr net) +{ + int fd; + + if ((fd =3D open(net->data.vdpa.devicepath, O_RDWR)) < 0) { + virReportSystemError(errno, + _("Unable to open '%s' for vdpa device"), + net->data.vdpa.devicepath); + return -1; + } + + return fd; +} + + qemuSlirpPtr qemuInterfacePrepareSlirp(virQEMUDriverPtr driver, virDomainNetDefPtr net) diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h index 3dcefc6a12..1ba24f0a6f 100644 --- a/src/qemu/qemu_interface.h +++ b/src/qemu/qemu_interface.h @@ -58,3 +58,5 @@ int qemuInterfaceOpenVhostNet(virDomainDefPtr def, =20 qemuSlirpPtr qemuInterfacePrepareSlirp(virQEMUDriverPtr driver, virDomainNetDefPtr net); + +int qemuInterfaceVDPAConnect(virDomainNetDefPtr net) G_GNUC_NO_INLINE; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 5708334d2f..9e7d793c6f 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1369,7 +1369,15 @@ qemuMigrationSrcIsAllowed(virQEMUDriverPtr driver, =20 for (i =3D 0; i < vm->def->nnets; i++) { virDomainNetDefPtr net =3D vm->def->nets[i]; - qemuSlirpPtr slirp =3D QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp; + qemuSlirpPtr slirp; + + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_VDPA) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("vDPA devices cannot be migrated")); + return false; + } + + slirp =3D QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp; =20 if (slirp && !qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_MI= GRATE)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 1c803c98f7..d9dca1ec5c 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1245,6 +1245,20 @@ qemuValidateDomainDeviceDefNetwork(const virDomainNe= tDef *net, } } } + } else if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_VDPA) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV_VHOST_VDPA)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vDPA devices are not supported with this QEM= U binary")); + return -1; + } + + if (net->model !=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid model for interface of type '%s': '%= s'"), + virDomainNetTypeToString(net->type), + virDomainNetModelTypeToString(net->model)); + return -1; + } } else if (net->guestIP.nroutes || net->guestIP.nips) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Invalid attempt to set network interface " diff --git a/tests/qemuxml2argvdata/net-vdpa.x86_64-latest.args b/tests/qem= uxml2argvdata/net-vdpa.x86_64-latest.args new file mode 100644 index 0000000000..3a9667de48 --- /dev/null +++ b/tests/qemuxml2argvdata/net-vdpa.x86_64-latest.args @@ -0,0 +1,37 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/tmp/lib/domain--1-QEMUGuest1 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ +QEMU_AUDIO_DRV=3Dnone \ +/usr/bin/qemu-system-i386 \ +-name guest=3DQEMUGuest1,debug-threads=3Don \ +-S \ +-object secret,id=3DmasterKey0,format=3Draw,\ +file=3D/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ +-machine pc,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff \ +-cpu qemu64 \ +-m 214 \ +-overcommit mem-lock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,fd=3D1729,server,nowait \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-no-acpi \ +-boot strict=3Don \ +-device piix3-usb-uhci,id=3Dusb,bus=3Dpci.0,addr=3D0x1.0x2 \ +-add-fd set=3D0,fd=3D1732,opaque=3D/dev/vhost-vdpa-0 \ +-netdev vhost-vdpa,vhostdev=3D/dev/fdset/0,id=3Dhostnet0 \ +-device virtio-net-pci,netdev=3Dhostnet0,id=3Dnet0,mac=3D52:54:00:95:db:c0= ,bus=3Dpci.0,\ +addr=3D0x2 \ +-sandbox on,obsolete=3Ddeny,elevateprivileges=3Ddeny,spawn=3Ddeny,\ +resourcecontrol=3Ddeny \ +-msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/net-vdpa.xml b/tests/qemuxml2argvdata/n= et-vdpa.xml new file mode 100644 index 0000000000..30cca7eb6e --- /dev/null +++ b/tests/qemuxml2argvdata/net-vdpa.xml @@ -0,0 +1,28 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + + + + + + + + + + + + diff --git a/tests/qemuxml2argvmock.c b/tests/qemuxml2argvmock.c index 9bf4357b66..ea2e74178f 100644 --- a/tests/qemuxml2argvmock.c +++ b/tests/qemuxml2argvmock.c @@ -208,7 +208,7 @@ virHostGetDRMRenderNode(void) =20 static void (*real_virCommandPassFD)(virCommandPtr cmd, int fd, unsigned i= nt flags); =20 -static const int testCommandPassSafeFDs[] =3D { 1730, 1731 }; +static const int testCommandPassSafeFDs[] =3D { 1730, 1731, 1732 }; =20 void virCommandPassFD(virCommandPtr cmd, @@ -286,3 +286,12 @@ qemuBuildTPMOpenBackendFDs(const char *tpmdev G_GNUC_U= NUSED, *cancelfd =3D 1731; return 0; } + + +int +qemuInterfaceVDPAConnect(virDomainNetDefPtr net G_GNUC_UNUSED) +{ + if (fcntl(1732, F_GETFD) !=3D -1) + abort(); + return 1732; +} diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 2b97eb80a4..2173c3479f 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1467,6 +1467,7 @@ mymain(void) QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST_FAILURE("net-hostdev-fail", QEMU_CAPS_DEVICE_VFIO_PCI); + DO_TEST_CAPS_LATEST("net-vdpa"); =20 DO_TEST("hostdev-pci-multifunction", QEMU_CAPS_KVM, diff --git a/tests/qemuxml2xmloutdata/net-vdpa.xml b/tests/qemuxml2xmloutda= ta/net-vdpa.xml new file mode 100644 index 0000000000..b362405c14 --- /dev/null +++ b/tests/qemuxml2xmloutdata/net-vdpa.xml @@ -0,0 +1,34 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + +
+ + +
+ + + + + + +
+ + + + + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 2bf8dd5b14..1ce21f0519 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -497,6 +497,7 @@ mymain(void) DO_TEST("net-mtu", NONE); DO_TEST("net-coalesce", NONE); DO_TEST("net-many-models", NONE); + DO_TEST("net-vdpa", QEMU_CAPS_NETDEV_VHOST_VDPA); =20 DO_TEST("serial-tcp-tlsx509-chardev", NONE); DO_TEST("serial-tcp-tlsx509-chardev-notls", NONE); --=20 2.26.2 From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600983941; cv=none; d=zohomail.com; s=zohoarc; b=SiIzMPCWDnDiEBfSxjmw9OdVhwwQ/NRIGHzLuvkHRV4zywWSkw85qLAz0xzdWbRk2P42+HozHl2oCPf1pyRzZ44aAab8jgnKdN96wOg6M7u4RWbwUaP5cfZgQ3b8Xl9sqxFJslx3cNNFehkHISw1mLmFU1G2+tvve/yjtNrmwp8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600983941; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=45xa4SroSaFX+2umtZ2xOsIjfZe1auxH+ak1WrUnSRw=; b=i1oOM3jzpAUlE3x4NEWjMj7Tufxiba4xmbENQtQSSx2NZ8Gz4u44H5t9kYDNcrLutqY095kXkC8mGrT7yfV36myxNlUIb6TAh0HMlxHKKhShEqOWdRuvxA6qil9ktoooXRkj/QS+kh59H5Zrxv9zwfRVakQfowcRl4128xDq2KQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1600983941345260.531800978486; Thu, 24 Sep 2020 14:45:41 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-253-PgjmpsRQO9yHQjQlLdY8tg-1; Thu, 24 Sep 2020 17:45:36 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 06DA41882FB1; Thu, 24 Sep 2020 21:45:31 +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 A09E2702E7; Thu, 24 Sep 2020 21:45:29 +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 5B95544A47; Thu, 24 Sep 2020 21:45:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjOOM021334 for ; Thu, 24 Sep 2020 17:45:24 -0400 Received: by smtp.corp.redhat.com (Postfix) id BC56D55771; Thu, 24 Sep 2020 21:45:24 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6F42D5576B; Thu, 24 Sep 2020 21:45:24 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600983940; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=45xa4SroSaFX+2umtZ2xOsIjfZe1auxH+ak1WrUnSRw=; b=Gt8yKxNtNDjmnSb7kZDI9Xk96l2mH4202qWFRFVVAU79/EYZ7jv164WvC1TAZlhQIfQztH XfYuxz+BYWYfuTPeghoiWHmjKwu55fncWA2LuB83P3EibGAPAK/mtYf+gZj3OdjEAUcV5y RZFnyW2WtgbQyAnmePktlsaltYZOJ9k= X-MC-Unique: PgjmpsRQO9yHQjQlLdY8tg-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 4/6] qemu: add monitor functions for handling file descriptors Date: Thu, 24 Sep 2020 16:45:14 -0500 Message-Id: <20200924214516.2348879-5-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" add-fd, remove-fd, and query-fdsets provide functionality that can be used for passing fds to qemu and closing fdsets that are no longer necessary. Signed-off-by: Jonathon Jongsma --- src/qemu/qemu_monitor.c | 93 +++++++++++++++++++ src/qemu/qemu_monitor.h | 41 +++++++++ src/qemu/qemu_monitor_json.c | 173 +++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 12 +++ 4 files changed, 319 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ab3bcc761e..b33f2eec0a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2651,6 +2651,99 @@ qemuMonitorGraphicsRelocate(qemuMonitorPtr mon, } =20 =20 +/** + * qemuMonitorAddFileHandleToSet: + * @mon: monitor object + * @fd: file descriptor to pass to qemu + * @fdset: the fdset to register this fd with, -1 to create a new fdset + * @opaque: opaque data to associated with this fd + * @info: structure that will be updated with the fd and fdset returned by= qemu + * + * Attempts to register a file descriptor with qemu that can then be refer= enced + * via the file path /dev/fdset/$FDSETID + * Returns 0 if ok, and -1 on failure */ +int +qemuMonitorAddFileHandleToSet(qemuMonitorPtr mon, + int fd, + int fdset, + const char *opaque, + qemuMonitorAddFdInfoPtr info) +{ + VIR_DEBUG("fd=3D%d,fdset=3D%i,opaque=3D%s", fd, fdset, opaque); + + QEMU_CHECK_MONITOR(mon); + + if (fd < 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("fd must be valid")); + return -1; + } + + return qemuMonitorJSONAddFileHandleToSet(mon, fd, fdset, opaque, info); +} + + +/** + * qemuMonitorRemoveFdset: + * @mon: monitor object + * @fdset: the fdset to remove + * + * Attempts to remove a fdset from qemu and close associated file descript= ors + * Returns 0 if ok, and -1 on failure */ +int +qemuMonitorRemoveFdset(qemuMonitorPtr mon, + int fdset) +{ + VIR_DEBUG("fdset=3D%d", fdset); + + QEMU_CHECK_MONITOR(mon); + + if (fdset < 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("fdset must be valid")); + return -1; + } + + return qemuMonitorJSONRemoveFdset(mon, fdset); +} + + +void qemuMonitorFdsetsFree(qemuMonitorFdsetsPtr fdsets) +{ + size_t i; + + for (i =3D 0; i < fdsets->nfdsets; i++) { + size_t j; + qemuMonitorFdsetInfoPtr set =3D &fdsets->fdsets[i]; + + for (j =3D 0; j < set->nfds; j++) + g_free(set->fds[j].opaque); + } + g_free(fdsets->fdsets); + g_free(fdsets); +} + + +/** + * qemuMonitorQueryFdsets: + * @mon: monitor object + * @fdsets: a pointer that is filled with a new qemuMonitorFdsets struct + * + * Queries qemu for the fdsets that are registered with that instance, and + * returns a structure describing those fdsets. The returned struct should= be + * freed with qemuMonitorFdsetsFree(); + * + * Returns 0 if ok, and -1 on failure */ +int +qemuMonitorQueryFdsets(qemuMonitorPtr mon, + qemuMonitorFdsetsPtr *fdsets) +{ + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONQueryFdsets(mon, fdsets); +} + + int qemuMonitorSendFileHandle(qemuMonitorPtr mon, const char *fdname, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index d3f7797085..ac97aedf8a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -880,6 +880,47 @@ int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon, int tlsPort, const char *tlsSubject); =20 +typedef struct _qemuMonitorAddFdInfo qemuMonitorAddFdInfo; +typedef qemuMonitorAddFdInfo *qemuMonitorAddFdInfoPtr; +struct _qemuMonitorAddFdInfo { + int fd; + int fdset; +}; +int +qemuMonitorAddFileHandleToSet(qemuMonitorPtr mon, + int fd, + int fdset, + const char *opaque, + qemuMonitorAddFdInfoPtr info); + +int +qemuMonitorRemoveFdset(qemuMonitorPtr mon, + int fdset); + +typedef struct _qemuMonitorFdsetFdInfo qemuMonitorFdsetFdInfo; +typedef qemuMonitorFdsetFdInfo *qemuMonitorFdsetFdInfoPtr; +struct _qemuMonitorFdsetFdInfo { + int fd; + char *opaque; +}; +typedef struct _qemuMonitorFdsetInfo qemuMonitorFdsetInfo; +typedef qemuMonitorFdsetInfo *qemuMonitorFdsetInfoPtr; +struct _qemuMonitorFdsetInfo { + int id; + qemuMonitorFdsetFdInfoPtr fds; + int nfds; +}; +typedef struct _qemuMonitorFdsets qemuMonitorFdsets; +typedef qemuMonitorFdsets *qemuMonitorFdsetsPtr; +struct _qemuMonitorFdsets { + qemuMonitorFdsetInfoPtr fdsets; + int nfdsets; +}; +void qemuMonitorFdsetsFree(qemuMonitorFdsetsPtr fdsets); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorFdsets, qemuMonitorFdsetsFree); +int qemuMonitorQueryFdsets(qemuMonitorPtr mon, + qemuMonitorFdsetsPtr *fdsets); + int qemuMonitorSendFileHandle(qemuMonitorPtr mon, const char *fdname, int fd); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e6d2e7d4db..caa281dffa 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -3936,6 +3936,179 @@ int qemuMonitorJSONGraphicsRelocate(qemuMonitorPtr = mon, } =20 =20 +static int +qemuAddfdInfoParse(virJSONValuePtr msg, + qemuMonitorAddFdInfoPtr fdinfo) +{ + virJSONValuePtr returnObj; + + if (!(returnObj =3D virJSONValueObjectGetObject(msg, "return"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing or invalid return data in add-fd respons= e")); + return -1; + } + + if (virJSONValueObjectGetNumberInt(returnObj, "fd", &fdinfo->fd) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing or invalid fd in add-fd response")); + return -1; + } + + if (virJSONValueObjectGetNumberInt(returnObj, "fdset-id", &fdinfo->fds= et) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Missing or invalid fdset-id in add-fd response")= ); + return -1; + } + + return 0; +} + + +/* if fdset is negative, qemu will create a new fdset and add the fd to th= at */ +int qemuMonitorJSONAddFileHandleToSet(qemuMonitorPtr mon, + int fd, + int fdset, + const char *opaque, + qemuMonitorAddFdInfoPtr fdinfo) +{ + virJSONValuePtr args =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + g_autoptr(virJSONValue) cmd =3D NULL; + + if (virJSONValueObjectCreate(&args, "S:opaque", opaque, NULL) < 0) + return -1; + + if (fdset >=3D 0) + if (virJSONValueObjectAdd(args, "j:fdset-id", fdset, NULL) < 0) + return -1; + + if (!(cmd =3D qemuMonitorJSONMakeCommandInternal("add-fd", args))) + return -1; + + if (qemuMonitorJSONCommandWithFd(mon, cmd, fd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + if (qemuAddfdInfoParse(reply, fdinfo) < 0) + return -1; + + return 0; +} + +static int +qemuMonitorJSONQueryFdsetsParse(virJSONValuePtr msg, + qemuMonitorFdsetsPtr *fdsets) +{ + virJSONValuePtr returnArray, entry; + size_t i; + g_autoptr(qemuMonitorFdsets) sets =3D g_new0(qemuMonitorFdsets, 1); + int ninfo; + + returnArray =3D virJSONValueObjectGetArray(msg, "return"); + + ninfo =3D virJSONValueArraySize(returnArray); + if (ninfo > 0) + sets->fdsets =3D g_new0(qemuMonitorFdsetInfo, ninfo); + sets->nfdsets =3D ninfo; + + for (i =3D 0; i < ninfo; i++) { + size_t j; + const char *tmp; + virJSONValuePtr fdarray; + qemuMonitorFdsetInfoPtr fdsetinfo =3D &sets->fdsets[i]; + + if (!(entry =3D virJSONValueArrayGet(returnArray, i))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-fdsets return data missing fdset array= element")); + return -1; + } + + if (virJSONValueObjectGetNumberInt(entry, "fdset-id", &fdsetinfo->= id) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-fdsets reply was missing 'fdset-id'")); + return -1; + + } + + fdarray =3D virJSONValueObjectGetArray(entry, "fds"); + fdsetinfo->nfds =3D virJSONValueArraySize(fdarray); + if (fdsetinfo->nfds > 0) + fdsetinfo->fds =3D g_new0(qemuMonitorFdsetFdInfo, fdsetinfo->n= fds); + + for (j =3D 0; j < fdsetinfo->nfds; j++) { + qemuMonitorFdsetFdInfoPtr fdinfo =3D &fdsetinfo->fds[j]; + virJSONValuePtr fdentry; + + if (!(fdentry =3D virJSONValueArrayGet(fdarray, j))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-fdsets return data missing fd arra= y element")); + return -1; + } + + if (virJSONValueObjectGetNumberInt(fdentry, "fd", &fdinfo->fd)= < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-fdsets return data missing 'fd'")); + return -1; + } + + /* opaque is optional and may be missing */ + tmp =3D virJSONValueObjectGetString(fdentry, "opaque"); + if (tmp) + fdinfo->opaque =3D g_strdup(tmp); + } + } + + *fdsets =3D g_steal_pointer(&sets); + return 0; +} + + +int qemuMonitorJSONQueryFdsets(qemuMonitorPtr mon, + qemuMonitorFdsetsPtr *fdsets) +{ + g_autoptr(virJSONValue) reply =3D NULL; + g_autoptr(virJSONValue) cmd =3D qemuMonitorJSONMakeCommand("query-fdse= ts", + NULL); + + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + if (qemuMonitorJSONQueryFdsetsParse(reply, fdsets) < 0) + return -1; + + return 0; +} + + +int qemuMonitorJSONRemoveFdset(qemuMonitorPtr mon, + int fdset) +{ + g_autoptr(virJSONValue) reply =3D NULL; + g_autoptr(virJSONValue) cmd =3D qemuMonitorJSONMakeCommand("remove-fd", + "i:fdset-id",= fdset, + NULL); + + if (!cmd) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + return -1; + + return 0; +} + + int qemuMonitorJSONSendFileHandle(qemuMonitorPtr mon, const char *fdname, int fd) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 098ab857be..2b9a42efe0 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -202,6 +202,18 @@ int qemuMonitorJSONAddPCINetwork(qemuMonitorPtr mon, int qemuMonitorJSONRemovePCIDevice(qemuMonitorPtr mon, virPCIDeviceAddress *guestAddr); =20 +int qemuMonitorJSONAddFileHandleToSet(qemuMonitorPtr mon, + int fd, + int fdset, + const char *opaque, + qemuMonitorAddFdInfoPtr info); + +int qemuMonitorJSONRemoveFdset(qemuMonitorPtr mon, + int fdset); + +int qemuMonitorJSONQueryFdsets(qemuMonitorPtr mon, + qemuMonitorFdsetsPtr *fdsets); + int qemuMonitorJSONSendFileHandle(qemuMonitorPtr mon, const char *fdname, int fd); --=20 2.26.2 From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600983956; cv=none; d=zohomail.com; s=zohoarc; b=chF/OePim8RRDjxqptoX+r/Pvbsn8M+z+DP9nU6nrWS7MeTjHDQhip2RMQJaYwOyNEAjCE2JZ+W9NU9L/4hGKdIq5FBVdBApmHqKspXBfmRNrgmrupVQ94wEaoH9AkCKsftyTUmf79l+KQNMQ1YGmR+WQPI7kIoN+aMD1bk0GU0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600983956; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=y8bRlWa0ZNL4XvmLeemVo9a6yvYm4HJujMa4fYUHU1I=; b=bstLnlTfNKVp1A+b4oOUTVvY8nk4iuVswlgNIswEjwz46giCng/brXp0umwH1gl/TjOf2/mV1wxDVPqF8vUJNJ/3It2vMdPW2+3CsahAerGr2wyJUVXYeyO+ozQAGEuqPV+3gKja71OFoeK//Vk/sH2QS4vlQAtl1TrAB3iys/E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 160098395654297.09243948511244; Thu, 24 Sep 2020 14:45:56 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-403-GNtHLlVNOaGTv3mHXSH2IQ-1; Thu, 24 Sep 2020 17:45:52 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B5C8D81F03F; Thu, 24 Sep 2020 21:45:46 +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 939B110013C1; Thu, 24 Sep 2020 21:45:46 +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 6081D79DD6; Thu, 24 Sep 2020 21:45:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjPcN021342 for ; Thu, 24 Sep 2020 17:45:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id 353A855771; Thu, 24 Sep 2020 21:45:25 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D8F465576B; Thu, 24 Sep 2020 21:45:24 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600983955; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=y8bRlWa0ZNL4XvmLeemVo9a6yvYm4HJujMa4fYUHU1I=; b=eKYVjhV22CB0P86xEsZd9dSdI8LlyrnmFcYSCTo7elGjanAQapGyRaamtjRPXxvua1NSsP bftrWcST2OJXognX4tPN4EMS61qYcSj0RPmCXmwQZAwqKSOTrbgPSS2qhVU01vkrD7GilS uBcJHXahX/5HL1WGSnoK525n5w4b5rI= X-MC-Unique: GNtHLlVNOaGTv3mHXSH2IQ-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 5/6] qemu: support hotplug of vdpa devices Date: Thu, 24 Sep 2020 16:45:15 -0500 Message-Id: <20200924214516.2348879-6-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" By using the new qemu monitor functions to handle passing and removing file descriptors, we can support hotplug of vdpa devices. Signed-off-by: Jonathon Jongsma Reviewed-by: Laine Stump --- src/qemu/qemu_hotplug.c | 60 +++++++++++++++++-- tests/qemuhotplugmock.c | 9 +++ tests/qemuhotplugtest.c | 16 +++++ .../qemuhotplug-interface-vdpa.xml | 4 ++ .../qemuhotplug-base-live+interface-vdpa.xml | 57 ++++++++++++++++++ 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 tests/qemuhotplugtestdevices/qemuhotplug-interface-vdpa= .xml create mode 100644 tests/qemuhotplugtestdomains/qemuhotplug-base-live+inte= rface-vdpa.xml diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0582b78f97..3a2aff607c 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1152,6 +1152,8 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, virErrorPtr originalError =3D NULL; g_autofree char *slirpfdName =3D NULL; int slirpfd =3D -1; + g_autofree char *vdpafdName =3D NULL; + int vdpafd =3D -1; char **tapfdName =3D NULL; int *tapfd =3D NULL; size_t tapfdSize =3D 0; @@ -1335,12 +1337,16 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, /* hostdev interfaces were handled earlier in this function */ break; =20 + case VIR_DOMAIN_NET_TYPE_VDPA: + if ((vdpafd =3D qemuInterfaceVDPAConnect(net)) < 0) + goto cleanup; + break; + case VIR_DOMAIN_NET_TYPE_SERVER: case VIR_DOMAIN_NET_TYPE_CLIENT: case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: - case VIR_DOMAIN_NET_TYPE_VDPA: case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("hotplug of interface type of %s is not implement= ed yet"), @@ -1386,14 +1392,28 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, for (i =3D 0; i < vhostfdSize; i++) vhostfdName[i] =3D g_strdup_printf("vhostfd-%s%zu", net->info.alia= s, i); =20 + qemuDomainObjEnterMonitor(driver, vm); + + if (vdpafd > 0) { + /* vhost-vdpa only takes a filename for the dev, but we want to pa= ss an + * open fd to qemu. Passing -1 as the fdset-id will create a new f= dset + * and return the id of that fdset */ + qemuMonitorAddFdInfo fdinfo; + if (qemuMonitorAddFileHandleToSet(priv->mon, vdpafd, -1, + net->data.vdpa.devicepath, + &fdinfo) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + goto cleanup; + } + vdpafdName =3D g_strdup_printf("/dev/fdset/%d", fdinfo.fdset); + } + if (!(netprops =3D qemuBuildHostNetStr(net, tapfdName, tapfdSize, vhostfdName, vhostfdSize, - slirpfdName, NULL))) + slirpfdName, vdpafdName))) goto cleanup; =20 - qemuDomainObjEnterMonitor(driver, vm); - if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSER) { if (qemuMonitorAttachCharDev(priv->mon, charDevAlias, net->data.vh= ostuser) < 0) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); @@ -1518,6 +1538,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, VIR_FREE(vhostfdName); virDomainCCWAddressSetFree(ccwaddrs); VIR_FORCE_CLOSE(slirpfd); + VIR_FORCE_CLOSE(vdpafd); =20 return ret; =20 @@ -4586,8 +4607,39 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver, * to just ignore the error and carry on. */ } + } else if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_VDPA) { + int vdpafdset =3D -1; + g_autoptr(qemuMonitorFdsets) fdsets =3D NULL; + + /* query qemu for which fdset is associated with the fd that we pa= ssed + * to qemu via 'add-fd' for this vdpa device. If we don't remove t= he + * fd, qemu will keep it open */ + if (qemuMonitorQueryFdsets(priv->mon, &fdsets) =3D=3D 0) { + for (i =3D 0; i < fdsets->nfdsets && vdpafdset < 0; i++) { + size_t j; + qemuMonitorFdsetInfoPtr set =3D &fdsets->fdsets[i]; + + for (j =3D 0; j < set->nfds; j++) { + qemuMonitorFdsetFdInfoPtr fdinfo =3D &set->fds[j]; + if (STREQ_NULLABLE(fdinfo->opaque, net->data.vdpa.devi= cepath)) { + vdpafdset =3D set->id; + break; + } + } + } + } + + if (vdpafdset < 0) { + VIR_WARN("Cannot determine fdset for vdpa device"); + } else { + if (qemuMonitorRemoveFdset(priv->mon, vdpafdset) < 0) { + /* if it fails, there's not much we can do... just carry o= n */ + VIR_WARN("failed to close vdpa device"); + } + } } =20 + if (qemuDomainObjExitMonitor(driver, vm) < 0) return -1; =20 diff --git a/tests/qemuhotplugmock.c b/tests/qemuhotplugmock.c index 29fac8a598..d2e32ecf7e 100644 --- a/tests/qemuhotplugmock.c +++ b/tests/qemuhotplugmock.c @@ -19,11 +19,13 @@ #include =20 #include "qemu/qemu_hotplug.h" +#include "qemu/qemu_interface.h" #include "qemu/qemu_process.h" #include "conf/domain_conf.h" #include "virdevmapper.h" #include "virutil.h" #include "virmock.h" +#include =20 static int (*real_virGetDeviceID)(const char *path, int *maj, int *min); static bool (*real_virFileExists)(const char *path); @@ -106,3 +108,10 @@ void qemuProcessKillManagedPRDaemon(virDomainObjPtr vm G_GNUC_UNUSED) { } + +int +qemuInterfaceVDPAConnect(virDomainNetDefPtr net G_GNUC_UNUSED) +{ + /* need a valid fd or sendmsg won't work. Just open /dev/null */ + return open("/dev/null", O_RDONLY); +} diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 2d12cacf28..b7cebfc0e7 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -89,6 +89,7 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER); virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_SCSI_BLOCK); + virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_NETDEV_VHOST_VDPA); =20 if (qemuTestCapsCacheInsert(driver.qemuCapsCache, priv->qemuCaps) < 0) return -1; @@ -140,6 +141,9 @@ testQemuHotplugAttach(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_HOSTDEV: ret =3D qemuDomainAttachHostDevice(&driver, vm, dev->data.hostdev); break; + case VIR_DOMAIN_DEVICE_NET: + ret =3D qemuDomainAttachNetDevice(&driver, vm, dev->data.net); + break; default: VIR_TEST_VERBOSE("device type '%s' cannot be attached", virDomainDeviceTypeToString(dev->type)); @@ -162,6 +166,7 @@ testQemuHotplugDetach(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_HOSTDEV: + case VIR_DOMAIN_DEVICE_NET: ret =3D qemuDomainDetachDeviceLive(vm, dev, &driver, async); break; default: @@ -823,6 +828,17 @@ mymain(void) DO_TEST_DETACH("pseries-base-live", "hostdev-pci", false, false, "device_del", QMP_DEVICE_DELETED("hostdev0") QMP_OK); =20 + DO_TEST_ATTACH("base-live", "interface-vdpa", false, true, + "add-fd", "{ \"return\": { \"fdset-id\": 1, \"fd\": 95 = }}", + "netdev_add", QMP_OK, "device_add", QMP_OK); + DO_TEST_DETACH("base-live", "interface-vdpa", false, false, + "device_del", QMP_DEVICE_DELETED("net0") QMP_OK, + "netdev_del", QMP_OK, + "query-fdsets", + "{ \"return\": [{\"fds\": [{\"fd\": 95, \"opaque\": \"/= dev/vhost-vdpa-0\"}], \"fdset-id\": 1}]}", + "remove-fd", QMP_OK + ); + DO_TEST_ATTACH("base-live", "watchdog", false, true, "watchdog-set-action", QMP_OK, "device_add", QMP_OK); diff --git a/tests/qemuhotplugtestdevices/qemuhotplug-interface-vdpa.xml b/= tests/qemuhotplugtestdevices/qemuhotplug-interface-vdpa.xml new file mode 100644 index 0000000000..e42ca08d31 --- /dev/null +++ b/tests/qemuhotplugtestdevices/qemuhotplug-interface-vdpa.xml @@ -0,0 +1,4 @@ + + + + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-base-live+interface-v= dpa.xml b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+interface-vdpa= .xml new file mode 100644 index 0000000000..066180bb3c --- /dev/null +++ b/tests/qemuhotplugtestdomains/qemuhotplug-base-live+interface-vdpa.xml @@ -0,0 +1,57 @@ + + hotplug + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + --=20 2.26.2 From nobody Sat May 4 08:16:23 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1600983961; cv=none; d=zohomail.com; s=zohoarc; b=haLhg7eLFNkPDzzrRWCex0pLyY7jvJAoxFwffKS1S0o8WrUqmEKS2BdeevvvFSln/BEsO8L/web5mKYxmNn9g8NfdxjVYaWATsYs55lIC8XzVwP6OujnACt8yhBoZHfL7twguNq1z70dbm/yR2v5TExkzKBKPW2gA9OGQyTApEw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1600983961; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8RglqHJtbVHgPyf3QkZDM1/+Z1xskAvVTCPhd9sn4nE=; b=nb5+PwixtxnrJ0W1wDjT9OtOPWBq/fvI6frNzjsgNyJyMw+0LBuM0wUTR/6ZylDkjiex/RtrOlHnVjG4aPDyeLX+gl6aKqB/JRabbe+p3mNeGCPG7GgaI5b00hzFmYAgMS/2MHSndEB75m2XkCzCgz0tjq6IOjDBmyngeTpH8DE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1600983961614889.5413554847646; Thu, 24 Sep 2020 14:46:01 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-357-B6zh6iiNM_2jIW3r8wxycg-1; Thu, 24 Sep 2020 17:45:57 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 21FC185EE96; Thu, 24 Sep 2020 21:45:51 +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 032F17881A; Thu, 24 Sep 2020 21:45:51 +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 C75897A00B; Thu, 24 Sep 2020 21:45:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 08OLjPSt021349 for ; Thu, 24 Sep 2020 17:45:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9DBEE5576B; Thu, 24 Sep 2020 21:45:25 +0000 (UTC) Received: from himantopus.redhat.com (ovpn-114-36.phx2.redhat.com [10.3.114.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 519895577A; Thu, 24 Sep 2020 21:45:25 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600983960; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=8RglqHJtbVHgPyf3QkZDM1/+Z1xskAvVTCPhd9sn4nE=; b=OvdOwqoxc0m8QYW+NTHZgTKPfsMxcdnnWW4sdhodrafF3Jy7sERejPxVWWOCF+6N1xNJVU TY3GGWK8jGc/Djd7Y4ZBCqCnIkjv0EbB8ht2uhb4gGg/o88AnEld1ZPAnL1RoTrHty8/3M Fct2ouNk8SI84fT+xQ5rz0a+JVZj+Lw= X-MC-Unique: B6zh6iiNM_2jIW3r8wxycg-1 From: Jonathon Jongsma To: libvir-list@redhat.com Subject: [libvirt PATCH v4 6/6] Include vdpa devices in node device list Date: Thu, 24 Sep 2020 16:45:16 -0500 Message-Id: <20200924214516.2348879-7-jjongsma@redhat.com> In-Reply-To: <20200924214516.2348879-1-jjongsma@redhat.com> References: <20200924214516.2348879-1-jjongsma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: elic@nvidia.com, laine@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The current udev node device driver ignores all events related to vdpa devices. Since libvirt now supports vDPA network devices, include these devices in the device list. Signed-off-by: Jonathon Jongsma --- include/libvirt/libvirt-nodedev.h | 1 + src/conf/node_device_conf.c | 5 +++++ src/conf/node_device_conf.h | 4 +++- src/conf/virnodedeviceobj.c | 4 +++- src/node_device/node_device_udev.c | 16 ++++++++++++++++ tools/virsh-nodedev.c | 3 +++ 6 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/libvirt/libvirt-nodedev.h b/include/libvirt/libvirt-no= dedev.h index dd2ffd5782..b73b076f14 100644 --- a/include/libvirt/libvirt-nodedev.h +++ b/include/libvirt/libvirt-nodedev.h @@ -82,6 +82,7 @@ typedef enum { VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV =3D 1 << 14, /* Mediat= ed device */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV =3D 1 << 15, /* CCW de= vice */ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV =3D 1 << 16, /* CSS de= vice */ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA =3D 1 << 17, /* vDPA d= evice */ } virConnectListAllNodeDeviceFlags; =20 int virConnectListAllNodeDevices (virConnectPtr conn, diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index a9a03ad6c2..3eab1cda75 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -66,6 +66,7 @@ VIR_ENUM_IMPL(virNodeDevCap, "mdev", "ccw", "css", + "vdpa", ); =20 VIR_ENUM_IMPL(virNodeDevNetCap, @@ -614,6 +615,7 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def) case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: + case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_LAST: break; } @@ -1913,6 +1915,7 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt, case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_SCSI_GENERIC: + case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("unknown capability type '%d' for '%s'"), @@ -2232,6 +2235,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_CSS_DEV: + case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_LAST: /* This case is here to shutup the compiler */ break; @@ -2286,6 +2290,7 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def) case VIR_NODE_DEV_CAP_MDEV: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_CSS_DEV: + case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_LAST: break; } diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index 5484bc340f..4f8e47a068 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -65,6 +65,7 @@ typedef enum { VIR_NODE_DEV_CAP_MDEV, /* Mediated device */ VIR_NODE_DEV_CAP_CCW_DEV, /* s390 CCW device */ VIR_NODE_DEV_CAP_CSS_DEV, /* s390 channel subsystem device */ + VIR_NODE_DEV_CAP_VDPA, /* vDPA device */ =20 VIR_NODE_DEV_CAP_LAST } virNodeDevCapType; @@ -369,7 +370,8 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps); VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV | \ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV | \ - VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV) + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV | \ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA) =20 int virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr scsi_host); diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c index 8aefd15e94..83c58ebe91 100644 --- a/src/conf/virnodedeviceobj.c +++ b/src/conf/virnodedeviceobj.c @@ -711,6 +711,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, case VIR_NODE_DEV_CAP_MDEV: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_CSS_DEV: + case VIR_NODE_DEV_CAP_VDPA: case VIR_NODE_DEV_CAP_LAST: break; } @@ -862,7 +863,8 @@ virNodeDeviceObjMatch(virNodeDeviceObjPtr obj, MATCH(MDEV_TYPES) || MATCH(MDEV) || MATCH(CCW_DEV) || - MATCH(CSS_DEV))) + MATCH(CSS_DEV) || + MATCH(VDPA))) return false; } =20 diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 12e3f30bad..fda72f9071 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1144,6 +1144,18 @@ udevProcessCSS(struct udev_device *device, return 0; } =20 + +static int +udevProcessVDPA(struct udev_device *device, + virNodeDeviceDefPtr def) +{ + if (udevGenerateDeviceName(device, def, NULL) !=3D 0) + return -1; + + return 0; +} + + static int udevGetDeviceNodes(struct udev_device *device, virNodeDeviceDefPtr def) @@ -1224,6 +1236,8 @@ udevGetDeviceType(struct udev_device *device, *type =3D VIR_NODE_DEV_CAP_CCW_DEV; else if (STREQ_NULLABLE(subsystem, "css")) *type =3D VIR_NODE_DEV_CAP_CSS_DEV; + else if (STREQ_NULLABLE(subsystem, "vdpa")) + *type =3D VIR_NODE_DEV_CAP_VDPA; =20 VIR_FREE(subsystem); } @@ -1270,6 +1284,8 @@ udevGetDeviceDetails(struct udev_device *device, return udevProcessCCW(device, def); case VIR_NODE_DEV_CAP_CSS_DEV: return udevProcessCSS(device, def); + case VIR_NODE_DEV_CAP_VDPA: + return udevProcessVDPA(device, def); case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_FC_HOST: diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index 2edd403a64..19f0c17b4f 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -464,6 +464,9 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd G= _GNUC_UNUSED) case VIR_NODE_DEV_CAP_CSS_DEV: flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_CSS_DEV; break; + case VIR_NODE_DEV_CAP_VDPA: + flags |=3D VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA; + break; case VIR_NODE_DEV_CAP_LAST: break; } --=20 2.26.2