From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 150695786946885.7365822170957; Mon, 2 Oct 2017 08:24:29 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 225E75AFD9; Mon, 2 Oct 2017 15:24:28 +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 A252C5D720; Mon, 2 Oct 2017 15:24:27 +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 C54334ED30; Mon, 2 Oct 2017 15:24:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5Ueo017280 for ; Mon, 2 Oct 2017 11:05:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6FD494D72A; Mon, 2 Oct 2017 15:05:30 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id EC6F199DCF for ; Mon, 2 Oct 2017 15:05:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 225E75AFD9 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:11 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/7] lxc: Drop useless ifdef __linux__ 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 02 Oct 2017 15:24:28 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This code compiles only on Linux. Therefore the condition we check is always true. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/lxc/lxc_driver.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 5cc392b0e..4d24d2870 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2847,7 +2847,6 @@ lxcDomainGetBlkioParameters(virDomainPtr dom, } =20 =20 -#ifdef __linux__ static int lxcDomainInterfaceStats(virDomainPtr dom, const char *path, @@ -2895,16 +2894,7 @@ lxcDomainInterfaceStats(virDomainPtr dom, virDomainObjEndAPI(&vm); return ret; } -#else -static int -lxcDomainInterfaceStats(virDomainPtr dom, - const char *path ATTRIBUTE_UNUSED, - virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUSED) -{ - virReportUnsupportedError(); - return -1; -} -#endif + =20 static int lxcDomainGetAutostart(virDomainPtr dom, int *autostart) --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 150695839071317.015143890282843; Mon, 2 Oct 2017 08:33:10 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24A217EA89; Mon, 2 Oct 2017 15:33:09 +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 C1EF390C68; Mon, 2 Oct 2017 15:33:08 +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 843D13FAD1; Mon, 2 Oct 2017 15:33:08 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5VHd017291 for ; Mon, 2 Oct 2017 11:05:31 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4140E99DDA; Mon, 2 Oct 2017 15:05:31 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id BDC6A171DB for ; Mon, 2 Oct 2017 15:05:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 24A217EA89 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:12 +0200 Message-Id: <5115917bc4963537a40e1ff1150a259c2d529087.1506956633.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/7] qemuDomainInterfaceStats: Check for the actual type of interface 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 02 Oct 2017 15:33:10 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Users might have configured interface so that it's type of network, but the corresponding network plugs interfaces into an OVS bridge. Therefore, we have to check for the actual type of the interface instead of the configured one. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/qemu/qemu_driver.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4855c9047..2c8ea19e3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11045,7 +11045,7 @@ qemuDomainInterfaceStats(virDomainPtr dom, goto cleanup; } =20 - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSER) { + if (virDomainNetGetActualType(net) =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSE= R) { if (virNetDevOpenvswitchInterfaceStats(path, stats) < 0) goto cleanup; } else { @@ -19568,15 +19568,19 @@ qemuDomainGetStatsInterface(virQEMUDriverPtr driv= er ATTRIBUTE_UNUSED, =20 /* Check the path is one of the domain's network interfaces. */ for (i =3D 0; i < dom->def->nnets; i++) { + virDomainNetType actualType; + if (!dom->def->nets[i]->ifname) continue; =20 memset(&tmp, 0, sizeof(tmp)); =20 + actualType =3D virDomainNetGetActualType(dom->def->nets[i]); + QEMU_ADD_NAME_PARAM(record, maxparams, "net", "name", i, dom->def->nets[i]->ifname); =20 - if (dom->def->nets[i]->type =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSER) { + if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSER) { if (virNetDevOpenvswitchInterfaceStats(dom->def->nets[i]->ifna= me, &tmp) < 0) { virResetLastError(); --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 150695748207476.6762019792817; Mon, 2 Oct 2017 08:18:02 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 75ECBC057F93; Mon, 2 Oct 2017 15:18:00 +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 11FAA5C544; Mon, 2 Oct 2017 15:18:00 +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 E6B353FAD8; Mon, 2 Oct 2017 15:17:57 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5Wux017296 for ; Mon, 2 Oct 2017 11:05:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id 179245C544; Mon, 2 Oct 2017 15:05:32 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 92A4D99DDA for ; Mon, 2 Oct 2017 15:05:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 75ECBC057F93 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:13 +0200 Message-Id: <6046f84017668267a1ffeb77953a8307afbddbf9.1506956633.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/7] conf: Introduce virDomainNetFindByName 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 02 Oct 2017 15:18:01 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Small wrapper to lookup interface in domain definition by its name. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/conf/domain_conf.c | 29 +++++++++++++++++++++++------ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 1 + 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 87192eb2d..2289399cd 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26952,17 +26952,34 @@ virDomainNetFind(virDomainDefPtr def, const char = *device) } } } else { /* ifname */ - for (i =3D 0; i < def->nnets; i++) { - if (STREQ_NULLABLE(device, def->nets[i]->ifname)) { - net =3D def->nets[i]; - break; - } - } + net =3D virDomainNetFindByName(def, device); } =20 return net; } =20 +/** + * virDomainNetFindByName: + * @def: domain's def + * @ifname: interface name + * + * Finds a domain's net def given the interface name. + * + * Returns a pointer to the net def or NULL if not found. + */ +virDomainNetDefPtr +virDomainNetFindByName(virDomainDefPtr def, const char *ifname) +{ + size_t i; + + for (i =3D 0; i < def->nnets; i++) { + if (STREQ_NULLABLE(ifname, def->nets[i]->ifname)) + return def->nets[i]; + } + + return NULL; +} + /** * virDomainDeviceDefCopy: * @caps: Capabilities diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 05a035a16..9ba84a94d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3000,6 +3000,7 @@ int virDomainDiskSourceParse(xmlNodePtr node, =20 int virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net); virDomainNetDefPtr virDomainNetFind(virDomainDefPtr def, const char *devic= e); +virDomainNetDefPtr virDomainNetFindByName(virDomainDefPtr def, const char = *ifname); bool virDomainHasNet(virDomainDefPtr def, virDomainNetDefPtr net); int virDomainNetInsert(virDomainDefPtr def, virDomainNetDefPtr net); virDomainNetDefPtr virDomainNetRemove(virDomainDefPtr def, size_t i); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5b1bc5e4f..7a12d6a14 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -422,6 +422,7 @@ virDomainNetDefClear; virDomainNetDefFormat; virDomainNetDefFree; virDomainNetFind; +virDomainNetFindByName; virDomainNetFindIdx; virDomainNetGenerateMAC; virDomainNetGetActualBandwidth; --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1506957892602820.8543699607548; Mon, 2 Oct 2017 08:24:52 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 83B70C04AC5E; Mon, 2 Oct 2017 15:24:51 +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 217E35D973; Mon, 2 Oct 2017 15:24: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 D465A18355C5; Mon, 2 Oct 2017 15:24:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5WL0017306 for ; Mon, 2 Oct 2017 11:05:32 -0400 Received: by smtp.corp.redhat.com (Postfix) id DBD915C544; Mon, 2 Oct 2017 15:05:32 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 640E2171DB for ; Mon, 2 Oct 2017 15:05:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 83B70C04AC5E Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:14 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/7] src: Use virDomainNetFindByName 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 02 Oct 2017 15:24:52 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/libxl/libxl_driver.c | 22 +++++++++------------- src/lxc/lxc_driver.c | 22 +++++++++------------- src/openvz/openvz_driver.c | 22 +++++++++------------- src/qemu/qemu_driver.c | 11 +---------- src/test/test_driver.c | 28 ++++++---------------------- 5 files changed, 34 insertions(+), 71 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index bf3625e34..a174d892e 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4961,7 +4961,7 @@ libxlDomainInterfaceStats(virDomainPtr dom, { libxlDriverPrivatePtr driver =3D dom->conn->privateData; virDomainObjPtr vm; - size_t i; + virDomainNetDefPtr net =3D NULL; int ret =3D -1; =20 if (!(vm =3D libxlDomObjFromDomain(dom))) @@ -4979,20 +4979,16 @@ libxlDomainInterfaceStats(virDomainPtr dom, goto endjob; } =20 - /* Check the path is one of the domain's network interfaces. */ - for (i =3D 0; i < vm->def->nnets; i++) { - if (vm->def->nets[i]->ifname && - STREQ(vm->def->nets[i]->ifname, path)) { - ret =3D 0; - break; - } - } - - if (ret =3D=3D 0) - ret =3D virNetDevTapInterfaceStats(path, stats); - else + if (!(net =3D virDomainNetFindByName(vm->def, path))) { virReportError(VIR_ERR_INVALID_ARG, _("'%s' is not a known interface"), path); + goto endjob; + } + + if (virNetDevTapInterfaceStats(path, stats) < 0) + goto endjob; + + ret =3D 0; =20 endjob: libxlDomainObjEndJob(driver, vm); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 4d24d2870..c0ef0c210 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2853,9 +2853,9 @@ lxcDomainInterfaceStats(virDomainPtr dom, virDomainInterfaceStatsPtr stats) { virDomainObjPtr vm; - size_t i; int ret =3D -1; virLXCDriverPtr driver =3D dom->conn->privateData; + virDomainNetDefPtr net =3D NULL; =20 if (!(vm =3D lxcDomObjFromDomain(dom))) goto cleanup; @@ -2872,20 +2872,16 @@ lxcDomainInterfaceStats(virDomainPtr dom, goto endjob; } =20 - /* Check the path is one of the domain's network interfaces. */ - for (i =3D 0; i < vm->def->nnets; i++) { - if (vm->def->nets[i]->ifname && - STREQ(vm->def->nets[i]->ifname, path)) { - ret =3D 0; - break; - } - } - - if (ret =3D=3D 0) - ret =3D virNetDevTapInterfaceStats(path, stats); - else + if (!(net =3D virDomainNetFindByName(vm->def, path))) { virReportError(VIR_ERR_INVALID_ARG, _("Invalid path, '%s' is not a known interface"), p= ath); + goto endjob; + } + + if (virNetDevTapInterfaceStats(path, stats) < 0) + goto endjob; + + ret =3D 0; =20 endjob: virLXCDomainObjEndJob(driver, vm); diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index a1485fc88..3c24020ce 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1985,7 +1985,7 @@ openvzDomainInterfaceStats(virDomainPtr dom, { struct openvz_driver *driver =3D dom->conn->privateData; virDomainObjPtr vm; - size_t i; + virDomainNetDefPtr net =3D NULL; int ret =3D -1; =20 openvzDriverLock(driver); @@ -2006,20 +2006,16 @@ openvzDomainInterfaceStats(virDomainPtr dom, goto cleanup; } =20 - /* Check the path is one of the domain's network interfaces. */ - for (i =3D 0; i < vm->def->nnets; i++) { - if (vm->def->nets[i]->ifname && - STREQ(vm->def->nets[i]->ifname, path)) { - ret =3D 0; - break; - } - } - - if (ret =3D=3D 0) - ret =3D virNetDevTapInterfaceStats(path, stats); - else + if (!(net =3D virDomainNetFindByName(vm->def, path))) { virReportError(VIR_ERR_INVALID_ARG, _("invalid path, '%s' is not a known interface"), p= ath); + goto cleanup; + } + + if (virNetDevTapInterfaceStats(path, stats) < 0) + goto cleanup; + + ret =3D 0; =20 cleanup: if (vm) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2c8ea19e3..1ab16e57c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11016,7 +11016,6 @@ qemuDomainInterfaceStats(virDomainPtr dom, { virDomainObjPtr vm; virDomainNetDefPtr net =3D NULL; - size_t i; int ret =3D -1; =20 if (!(vm =3D qemuDomObjFromDomain(dom))) @@ -11031,15 +11030,7 @@ qemuDomainInterfaceStats(virDomainPtr dom, goto cleanup; } =20 - /* Check the path is one of the domain's network interfaces. */ - for (i =3D 0; i < vm->def->nnets; i++) { - if (STREQ_NULLABLE(vm->def->nets[i]->ifname, path)) { - net =3D vm->def->nets[i]; - break; - } - } - - if (!net) { + if (!(net =3D virDomainNetFindByName(vm->def, path))) { virReportError(VIR_ERR_INVALID_ARG, _("invalid path, '%s' is not a known interface"), p= ath); goto cleanup; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 9b434e9a0..e92768a97 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -593,25 +593,16 @@ testDomainGenerateIfname(virDomainDefPtr domdef) { int maxif =3D 1024; int ifctr; - size_t i; =20 for (ifctr =3D 0; ifctr < maxif; ++ifctr) { + virDomainNetDefPtr net =3D NULL; char *ifname; - int found =3D 0; =20 if (virAsprintf(&ifname, "testnet%d", ifctr) < 0) return NULL; =20 /* Generate network interface names */ - for (i =3D 0; i < domdef->nnets; i++) { - if (domdef->nets[i]->ifname && - STREQ(domdef->nets[i]->ifname, ifname)) { - found =3D 1; - break; - } - } - - if (!found) + if (!(net =3D virDomainNetFindByName(domdef, ifname))) return ifname; VIR_FREE(ifname); } @@ -3176,8 +3167,9 @@ static int testDomainInterfaceStats(virDomainPtr doma= in, virDomainObjPtr privdom; struct timeval tv; unsigned long long statbase; - size_t i; - int found =3D 0, ret =3D -1; + virDomainNetDefPtr net =3D NULL; + int ret =3D -1; + =20 if (!(privdom =3D testDomObjFromDomain(domain))) return -1; @@ -3188,15 +3180,7 @@ static int testDomainInterfaceStats(virDomainPtr dom= ain, goto error; } =20 - for (i =3D 0; i < privdom->def->nnets; i++) { - if (privdom->def->nets[i]->ifname && - STREQ(privdom->def->nets[i]->ifname, path)) { - found =3D 1; - break; - } - } - - if (!found) { + if (!(net =3D virDomainNetFindByName(privdom->def, path))) { virReportError(VIR_ERR_INVALID_ARG, _("invalid path, '%s' is not a known interface"), p= ath); goto error; --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1506957513770637.7146080309758; Mon, 2 Oct 2017 08:18:33 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7D553C04AC61; Mon, 2 Oct 2017 15:18:32 +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 4E5D34D72A; Mon, 2 Oct 2017 15:18:32 +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 085BF1806103; Mon, 2 Oct 2017 15:18:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5XFh017311 for ; Mon, 2 Oct 2017 11:05:33 -0400 Received: by smtp.corp.redhat.com (Postfix) id D445D5C544; Mon, 2 Oct 2017 15:05:33 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 34E9C99DDB for ; Mon, 2 Oct 2017 15:05:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7D553C04AC61 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:15 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 5/7] virNetDevTapInterfaceStats: Allow caller to not swap the statistics 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 02 Oct 2017 15:18:33 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.redhat.com/show_bug.cgi?id=3D1497410 The comment in virNetDevTapInterfaceStats() implementation for Linux states that packets transmitted by domain are received by the host and vice versa. Well, this is true but not for all types of interfaces. For instance, for macvtaps when TAP device is hooked right onto a physical device any packet that domain sends looks also like a packet sent to the host. Therefore, we should have caller chose if the stats returned should be straight copy or swapped. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/conf/domain_conf.c | 2 +- src/conf/domain_conf.h | 37 ++++++++++++++++- src/libxl/libxl_driver.c | 3 +- src/lxc/lxc_driver.c | 3 +- src/openvz/openvz_driver.c | 3 +- src/qemu/qemu_driver.c | 18 +++++---- src/util/virnetdevtap.c | 99 +++++++++++++++++++++++++++++++-----------= ---- src/util/virnetdevtap.h | 3 +- src/xen/xen_hypervisor.c | 2 +- 9 files changed, 123 insertions(+), 47 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2289399cd..6569b94fa 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26729,7 +26729,7 @@ virDomainStateReasonFromString(virDomainState state= , const char *reason) */ =20 virDomainNetType -virDomainNetGetActualType(virDomainNetDefPtr iface) +virDomainNetGetActualType(const virDomainNetDef *iface) { if (iface->type !=3D VIR_DOMAIN_NET_TYPE_NETWORK) return iface->type; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9ba84a94d..6eda21ef7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3021,7 +3021,7 @@ int virDomainGraphicsListenAppendSocket(virDomainGrap= hicsDefPtr def, const char *socket) ATTRIBUTE_NONNULL(1); =20 -virDomainNetType virDomainNetGetActualType(virDomainNetDefPtr iface); +virDomainNetType virDomainNetGetActualType(const virDomainNetDef *iface); const char *virDomainNetGetActualBridgeName(virDomainNetDefPtr iface); int virDomainNetGetActualBridgeMACTableManager(virDomainNetDefPtr iface); const char *virDomainNetGetActualDirectDev(virDomainNetDefPtr iface); @@ -3393,4 +3393,39 @@ virDomainGenerateMachineName(const char *drivername, int id, const char *name, bool privileged); +/** + * virDomainNetTypeSharesHostView: + * @net: interface + * + * Some types of interfaces "share" the host view. For instance, + * for macvtap interface, every domain RX is the host RX too. And + * every domain TX is host TX too. IOW, for some types of + * interfaces guest and host are on the same side of RX/TX + * barrier. This is important so that we set up QoS correctly and + * report proper stats. + */ +static inline bool +virDomainNetTypeSharesHostView(const virDomainNetDef *net) +{ + virDomainNetType actualType =3D virDomainNetGetActualType(net); + switch (actualType) { + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_ETHERNET: + return true; + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_NETWORK: + case VIR_DOMAIN_NET_TYPE_BRIDGE: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_LAST: + break; + } + return false; +} + #endif /* __DOMAIN_CONF_H */ diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index a174d892e..8483d6ecf 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4985,7 +4985,8 @@ libxlDomainInterfaceStats(virDomainPtr dom, goto endjob; } =20 - if (virNetDevTapInterfaceStats(path, stats) < 0) + if (virNetDevTapInterfaceStats(path, stats, + !virDomainNetTypeSharesHostView(net)) <= 0) goto endjob; =20 ret =3D 0; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index c0ef0c210..f0a22ce3e 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2878,7 +2878,8 @@ lxcDomainInterfaceStats(virDomainPtr dom, goto endjob; } =20 - if (virNetDevTapInterfaceStats(path, stats) < 0) + if (virNetDevTapInterfaceStats(path, stats, + !virDomainNetTypeSharesHostView(net)) <= 0) goto endjob; =20 ret =3D 0; diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 3c24020ce..11173898d 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -2012,7 +2012,8 @@ openvzDomainInterfaceStats(virDomainPtr dom, goto cleanup; } =20 - if (virNetDevTapInterfaceStats(path, stats) < 0) + if (virNetDevTapInterfaceStats(path, stats, + !virDomainNetTypeSharesHostView(net)) <= 0) goto cleanup; =20 ret =3D 0; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1ab16e57c..a46409d70 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11040,7 +11040,8 @@ qemuDomainInterfaceStats(virDomainPtr dom, if (virNetDevOpenvswitchInterfaceStats(path, stats) < 0) goto cleanup; } else { - if (virNetDevTapInterfaceStats(path, stats) < 0) + if (virNetDevTapInterfaceStats(path, stats, + !virDomainNetTypeSharesHostView(net= )) < 0) goto cleanup; } =20 @@ -19559,29 +19560,30 @@ qemuDomainGetStatsInterface(virQEMUDriverPtr driv= er ATTRIBUTE_UNUSED, =20 /* Check the path is one of the domain's network interfaces. */ for (i =3D 0; i < dom->def->nnets; i++) { + virDomainNetDefPtr net =3D dom->def->nets[i]; virDomainNetType actualType; =20 - if (!dom->def->nets[i]->ifname) + if (!net->ifname) continue; =20 memset(&tmp, 0, sizeof(tmp)); =20 - actualType =3D virDomainNetGetActualType(dom->def->nets[i]); + actualType =3D virDomainNetGetActualType(net); =20 QEMU_ADD_NAME_PARAM(record, maxparams, - "net", "name", i, dom->def->nets[i]->ifname); + "net", "name", i, net->ifname); =20 if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_VHOSTUSER) { - if (virNetDevOpenvswitchInterfaceStats(dom->def->nets[i]->ifna= me, + if (virNetDevOpenvswitchInterfaceStats(net->ifname, &tmp) < 0) { virResetLastError(); continue; } } else { - if (virNetDevTapInterfaceStats(dom->def->nets[i]->ifname, &tmp= ) < 0) { + if (virNetDevTapInterfaceStats(net->ifname, &tmp, + !virDomainNetTypeSharesHostView= (net)) < 0) virResetLastError(); - continue; - } + continue; } =20 QEMU_ADD_NET_PARAM(record, maxparams, i, diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index 175dc2bfa..a3ed59da8 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -676,14 +676,27 @@ int virNetDevTapCreateInBridgePort(const char *brname, } =20 /*-------------------- interface stats --------------------*/ -/* Just reads the named interface, so not Xen or QEMU-specific. - * NB. Caller must check that libvirt user is trying to query - * the interface of a domain they own. We do no such checking. + +/** + * virNetDevTapInterfaceStats: + * @ifname: interface + * @stats: where to store statistics + * @swapped: whether to swap RX/TX fields + * + * Fetch RX/TX statistics for given named interface (@ifname) and + * store them at @stats. The returned statistics are always from + * domain POV. Because in some cases this means swapping RX/TX in + * the stats and in others this means no swapping (consider TAP + * vs macvtap) caller might choose if the returned stats should + * be @swapped or not. + * + * Returns 0 on success, -1 otherwise (with error reported). */ #ifdef __linux__ int virNetDevTapInterfaceStats(const char *ifname, - virDomainInterfaceStatsPtr stats) + virDomainInterfaceStatsPtr stats, + bool swapped) { int ifname_len; FILE *fp; @@ -718,30 +731,35 @@ virNetDevTapInterfaceStats(const char *ifname, *colon =3D '\0'; if (colon-ifname_len >=3D line && STREQ(colon-ifname_len, ifname)) { - /* IMPORTANT NOTE! - * /proc/net/dev vif.nn sees the network from the point - * of view of dom0 / hypervisor. So bytes TRANSMITTED by dom0 - * are bytes RECEIVED by the domain. That's why the TX/RX fie= lds - * appear to be swapped here. - */ if (sscanf(colon+1, "%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld = %lld %lld %lld %lld %lld %lld", - &tx_bytes, &tx_packets, &tx_errs, &tx_drop, - &dummy, &dummy, &dummy, &dummy, &rx_bytes, &rx_packets, &rx_errs, &rx_drop, + &dummy, &dummy, &dummy, &dummy, + &tx_bytes, &tx_packets, &tx_errs, &tx_drop, &dummy, &dummy, &dummy, &dummy) !=3D 16) continue; =20 - stats->rx_bytes =3D rx_bytes; - stats->rx_packets =3D rx_packets; - stats->rx_errs =3D rx_errs; - stats->rx_drop =3D rx_drop; - stats->tx_bytes =3D tx_bytes; - stats->tx_packets =3D tx_packets; - stats->tx_errs =3D tx_errs; - stats->tx_drop =3D tx_drop; + if (swapped) { + stats->rx_bytes =3D tx_bytes; + stats->rx_packets =3D tx_packets; + stats->rx_errs =3D tx_errs; + stats->rx_drop =3D tx_drop; + stats->tx_bytes =3D rx_bytes; + stats->tx_packets =3D rx_packets; + stats->tx_errs =3D rx_errs; + stats->tx_drop =3D rx_drop; + } else { + stats->rx_bytes =3D rx_bytes; + stats->rx_packets =3D rx_packets; + stats->rx_errs =3D rx_errs; + stats->rx_drop =3D rx_drop; + stats->tx_bytes =3D tx_bytes; + stats->tx_packets =3D tx_packets; + stats->tx_errs =3D tx_errs; + stats->tx_drop =3D tx_drop; + } + VIR_FORCE_FCLOSE(fp); - return 0; } } @@ -754,7 +772,8 @@ virNetDevTapInterfaceStats(const char *ifname, #elif defined(HAVE_GETIFADDRS) && defined(AF_LINK) int virNetDevTapInterfaceStats(const char *ifname, - virDomainInterfaceStatsPtr stats) + virDomainInterfaceStatsPtr stats, + bool swapped) { struct ifaddrs *ifap, *ifa; struct if_data *ifd; @@ -775,18 +794,33 @@ virNetDevTapInterfaceStats(const char *ifname, =20 if (STREQ(ifa->ifa_name, ifname)) { ifd =3D (struct if_data *)ifa->ifa_data; - stats->tx_bytes =3D ifd->ifi_ibytes; - stats->tx_packets =3D ifd->ifi_ipackets; - stats->tx_errs =3D ifd->ifi_ierrors; - stats->tx_drop =3D ifd->ifi_iqdrops; - stats->rx_bytes =3D ifd->ifi_obytes; - stats->rx_packets =3D ifd->ifi_opackets; - stats->rx_errs =3D ifd->ifi_oerrors; + if (swapped) { + stats->tx_bytes =3D ifd->ifi_ibytes; + stats->tx_packets =3D ifd->ifi_ipackets; + stats->tx_errs =3D ifd->ifi_ierrors; + stats->tx_drop =3D ifd->ifi_iqdrops; + stats->rx_bytes =3D ifd->ifi_obytes; + stats->rx_packets =3D ifd->ifi_opackets; + stats->rx_errs =3D ifd->ifi_oerrors; # ifdef HAVE_STRUCT_IF_DATA_IFI_OQDROPS - stats->rx_drop =3D ifd->ifi_oqdrops; + stats->rx_drop =3D ifd->ifi_oqdrops; # else - stats->rx_drop =3D 0; + stats->rx_drop =3D 0; # endif + } else { + stats->tx_bytes =3D ifd->ifi_obytes; + stats->tx_packets =3D ifd->ifi_opackets; + stats->tx_errs =3D ifd->ifi_oerrors; +# ifdef HAVE_STRUCT_IF_DATA_IFI_OQDROPS + stats->tx_drop =3D ifd->ifi_oqdrops; +# else + stats->tx_drop =3D 0; +# endif + stats->rx_bytes =3D ifd->ifi_ibytes; + stats->rx_packets =3D ifd->ifi_ipackets; + stats->rx_errs =3D ifd->ifi_ierrors; + stats->rx_drop =3D ifd->ifi_iqdrops; + } =20 ret =3D 0; break; @@ -803,7 +837,8 @@ virNetDevTapInterfaceStats(const char *ifname, #else int virNetDevTapInterfaceStats(const char *ifname ATTRIBUTE_UNUSED, - virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUS= ED) + virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUS= ED, + bool swapped ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("interface stats not implemented on this platform")); diff --git a/src/util/virnetdevtap.h b/src/util/virnetdevtap.h index 0b17feb8d..727368fe9 100644 --- a/src/util/virnetdevtap.h +++ b/src/util/virnetdevtap.h @@ -92,7 +92,8 @@ int virNetDevTapCreateInBridgePort(const char *brname, ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NOINLINE; =20 int virNetDevTapInterfaceStats(const char *ifname, - virDomainInterfaceStatsPtr stats) + virDomainInterfaceStatsPtr stats, + bool swapped) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; =20 #endif /* __VIR_NETDEV_TAP_H__ */ diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c index e18a4729d..70fdcbe55 100644 --- a/src/xen/xen_hypervisor.c +++ b/src/xen/xen_hypervisor.c @@ -1468,7 +1468,7 @@ xenHypervisorDomainInterfaceStats(virDomainDefPtr def, return -1; } =20 - return virNetDevTapInterfaceStats(path, stats); + return virNetDevTapInterfaceStats(path, stats, true); #else virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("/proc/net/dev: Interface not found")); --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1506957914118295.0684999465817; Mon, 2 Oct 2017 08:25:14 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F037E356C9; Mon, 2 Oct 2017 15:25:12 +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 CE6405D973; Mon, 2 Oct 2017 15:25:12 +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 91C881806103; Mon, 2 Oct 2017 15:25:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5YQE017316 for ; Mon, 2 Oct 2017 11:05:34 -0400 Received: by smtp.corp.redhat.com (Postfix) id A5F055C544; Mon, 2 Oct 2017 15:05:34 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2D9F3171DB for ; Mon, 2 Oct 2017 15:05:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com F037E356C9 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:16 +0200 Message-Id: <57be441603b2b76738ac46c354d77b4af3167e46.1506956633.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 6/7] QoS: Set classes and filters in proper direction 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 02 Oct 2017 15:25:13 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Similarly to previous patch, for some types of interface domain and host are on the same side of RX/TX barrier. In that case, we need to set up the QoS differently. Well, swapped. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/lxc/lxc_driver.c | 3 ++- src/lxc/lxc_process.c | 3 ++- src/network/bridge_driver.c | 2 +- src/qemu/qemu_command.c | 3 ++- src/qemu/qemu_driver.c | 6 ++++-- src/qemu/qemu_hotplug.c | 6 ++++-- src/util/virnetdevbandwidth.c | 43 +++++++++++++++++++++++++++++---------= ---- src/util/virnetdevbandwidth.h | 3 ++- tests/virnetdevbandwidthtest.c | 2 +- 9 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index f0a22ce3e..6ad61bdb7 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3981,7 +3981,8 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn, actualBandwidth =3D virDomainNetGetActualBandwidth(net); if (actualBandwidth) { if (virNetDevSupportBandwidth(actualType)) { - if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false)= < 0) + if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false, + !virDomainNetTypeSharesHostView(net)= ) < 0) goto cleanup; } else { VIR_WARN("setting bandwidth on interfaces of " diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 05f1dec4c..efd8a6900 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -601,7 +601,8 @@ static int virLXCProcessSetupInterfaces(virConnectPtr c= onn, actualBandwidth =3D virDomainNetGetActualBandwidth(net); if (actualBandwidth) { if (virNetDevSupportBandwidth(type)) { - if (virNetDevBandwidthSet(net->ifname, actualBandwidth, fa= lse) < 0) + if (virNetDevBandwidthSet(net->ifname, actualBandwidth, fa= lse, + !virDomainNetTypeSharesHostView(= net)) < 0) goto cleanup; } else { VIR_WARN("setting bandwidth on interfaces of " diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index e8d093a31..530d00ff3 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2445,7 +2445,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr d= river, VIR_FORCE_CLOSE(tapfd); } =20 - if (virNetDevBandwidthSet(def->bridge, def->bandwidth, true) < 0) + if (virNetDevBandwidthSet(def->bridge, def->bandwidth, true, true) < 0) goto err5; =20 VIR_FREE(macTapIfName); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4f141e0ac..4f89235e3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8567,7 +8567,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, actualBandwidth =3D virDomainNetGetActualBandwidth(net); if (actualBandwidth) { if (virNetDevSupportBandwidth(actualType)) { - if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false)= < 0) + if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false, + !virDomainNetTypeSharesHostView(net)= ) < 0) goto cleanup; } else { VIR_WARN("setting bandwidth on interfaces of " diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a46409d70..898079dbc 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11182,11 +11182,13 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, if (!networkBandwidthChangeAllowed(net, newBandwidth)) goto endjob; =20 - if (virNetDevBandwidthSet(net->ifname, newBandwidth, false) < 0 || + if (virNetDevBandwidthSet(net->ifname, newBandwidth, false, + !virDomainNetTypeSharesHostView(net)) < = 0 || networkBandwidthUpdate(net, newBandwidth) < 0) { ignore_value(virNetDevBandwidthSet(net->ifname, net->bandwidth, - false)); + false, + !virDomainNetTypeSharesHost= View(net))); goto endjob; } =20 diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b77731df0..2b9427df1 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1209,7 +1209,8 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, actualBandwidth =3D virDomainNetGetActualBandwidth(net); if (actualBandwidth) { if (virNetDevSupportBandwidth(actualType)) { - if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false)= < 0) + if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false, + !virDomainNetTypeSharesHostView(net)= ) < 0) goto cleanup; } else { VIR_WARN("setting bandwidth on interfaces of " @@ -3362,7 +3363,8 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, if (needBandwidthSet) { if (virNetDevBandwidthSet(newdev->ifname, virDomainNetGetActualBandwidth(newdev), - false) < 0) + false, + !virDomainNetTypeSharesHostView(newdev))= < 0) goto cleanup; needReplaceDevDef =3D true; } diff --git a/src/util/virnetdevbandwidth.c b/src/util/virnetdevbandwidth.c index 4e4ac617b..9aebe56f4 100644 --- a/src/util/virnetdevbandwidth.c +++ b/src/util/virnetdevbandwidth.c @@ -174,6 +174,7 @@ virNetDevBandwidthManipulateFilter(const char *ifname, * @ifname: on which interface * @bandwidth: rates to set (may be NULL) * @hierarchical_class: whether to create hierarchical class + * @swapped: true if IN/OUT should be set contrariwise * * This function enables QoS on specified interface * and set given traffic limits for both, incoming @@ -182,14 +183,23 @@ virNetDevBandwidthManipulateFilter(const char *ifname, * hierarchical class. It is used to guarantee minimal * throughput ('floor' attribute in NIC). * + * If @swapped is set, the IN part of @bandwidth is set on + * @ifname's TX, and vice versa. If it is not set, IN is set on + * RX and OUT on TX. This is because for some types of interfaces + * domain and the host live on the same side of the interface (so + * domain's RX/TX is host's RX/TX), and for some it's swapped + * (domain's RX/TX is hosts's TX/RX). + * * Return 0 on success, -1 otherwise. */ int virNetDevBandwidthSet(const char *ifname, virNetDevBandwidthPtr bandwidth, - bool hierarchical_class) + bool hierarchical_class, + bool swapped) { int ret =3D -1; + virNetDevBandwidthRatePtr rx =3D NULL, tx =3D NULL; /* From domain POV= */ virCommandPtr cmd =3D NULL; char *average =3D NULL; char *peak =3D NULL; @@ -215,16 +225,24 @@ virNetDevBandwidthSet(const char *ifname, return -1; } =20 + if (swapped) { + rx =3D bandwidth->out; + tx =3D bandwidth->in; + } else { + rx =3D bandwidth->in; + tx =3D bandwidth->out; + } + virNetDevBandwidthClear(ifname); =20 - if (bandwidth->in && bandwidth->in->average) { - if (virAsprintf(&average, "%llukbps", bandwidth->in->average) < 0) + if (tx && tx->average) { + if (virAsprintf(&average, "%llukbps", tx->average) < 0) goto cleanup; - if (bandwidth->in->peak && - (virAsprintf(&peak, "%llukbps", bandwidth->in->peak) < 0)) + if (tx->peak && + (virAsprintf(&peak, "%llukbps", tx->peak) < 0)) goto cleanup; - if (bandwidth->in->burst && - (virAsprintf(&burst, "%llukb", bandwidth->in->burst) < 0)) + if (tx->burst && + (virAsprintf(&burst, "%llukb", tx->burst) < 0)) goto cleanup; =20 cmd =3D virCommandNew(TC); @@ -303,7 +321,7 @@ virNetDevBandwidthSet(const char *ifname, virCommandAddArgList(cmd, "class", "add", "dev", ifname, "pare= nt", "1:", "classid", "1:1", "htb", "rate", av= erage, "ceil", peak ? peak : average, NULL); - virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in); + virNetDevBandwidthCmdAddOptimalQuantum(cmd, tx); if (virCommandRun(cmd, NULL) < 0) goto cleanup; } @@ -319,7 +337,7 @@ virNetDevBandwidthSet(const char *ifname, if (burst) virCommandAddArgList(cmd, "burst", burst, NULL); =20 - virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in); + virNetDevBandwidthCmdAddOptimalQuantum(cmd, tx); if (virCommandRun(cmd, NULL) < 0) goto cleanup; =20 @@ -347,11 +365,10 @@ virNetDevBandwidthSet(const char *ifname, VIR_FREE(burst); } =20 - if (bandwidth->out) { - if (virAsprintf(&average, "%llukbps", bandwidth->out->average) < 0) + if (rx) { + if (virAsprintf(&average, "%llukbps", rx->average) < 0) goto cleanup; - if (virAsprintf(&burst, "%llukb", bandwidth->out->burst ? - bandwidth->out->burst : bandwidth->out->average) <= 0) + if (virAsprintf(&burst, "%llukb", rx->burst ? rx->burst : rx->aver= age) < 0) goto cleanup; =20 virCommandFree(cmd); diff --git a/src/util/virnetdevbandwidth.h b/src/util/virnetdevbandwidth.h index 64f35372e..63ac60897 100644 --- a/src/util/virnetdevbandwidth.h +++ b/src/util/virnetdevbandwidth.h @@ -45,7 +45,8 @@ void virNetDevBandwidthFree(virNetDevBandwidthPtr def); =20 int virNetDevBandwidthSet(const char *ifname, virNetDevBandwidthPtr bandwidth, - bool hierarchical_class) + bool hierarchical_class, + bool swapped) ATTRIBUTE_RETURN_CHECK; int virNetDevBandwidthClear(const char *ifname); int virNetDevBandwidthCopy(virNetDevBandwidthPtr *dest, diff --git a/tests/virnetdevbandwidthtest.c b/tests/virnetdevbandwidthtest.c index a8f4ab196..2b031d55e 100644 --- a/tests/virnetdevbandwidthtest.c +++ b/tests/virnetdevbandwidthtest.c @@ -81,7 +81,7 @@ testVirNetDevBandwidthSet(const void *data) =20 virCommandSetDryRun(&buf, NULL, NULL); =20 - if (virNetDevBandwidthSet(iface, band, info->hierarchical_class) < 0) + if (virNetDevBandwidthSet(iface, band, info->hierarchical_class, true)= < 0) goto cleanup; =20 if (!(actual_cmd =3D virBufferContentAndReset(&buf))) { --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 22:07:06 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15069575352824.456429270140234; Mon, 2 Oct 2017 08:18:55 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 200084A6EA; Mon, 2 Oct 2017 15:18:54 +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 EBD426FDA1; Mon, 2 Oct 2017 15:18:53 +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 A86AF18355C6; Mon, 2 Oct 2017 15:18:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v92F5ZKa017334 for ; Mon, 2 Oct 2017 11:05:35 -0400 Received: by smtp.corp.redhat.com (Postfix) id 76CBA5C544; Mon, 2 Oct 2017 15:05:35 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id F344E99DCF for ; Mon, 2 Oct 2017 15:05:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 200084A6EA Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Mon, 2 Oct 2017 17:05:17 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 7/7] libvirt-domain: Document interface stats POV X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 02 Oct 2017 15:18:54 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Interestingly enough, we don't document the point of view of the interface statistics. Therefore it's unknown to users if for instance rx_packets is the number of packets received by domain or received by host (from domain). Document this explicitly. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/libvirt-domain.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index d70027163..d2d022a66 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -5523,6 +5523,8 @@ virDomainBlockStatsFlags(virDomainPtr dom, * as -1, which indicates that the hypervisor does not support * that particular statistic. * + * The returned stats are from domain's point of view. + * * Returns: 0 in case of success or -1 in case of failure. */ int @@ -11301,7 +11303,7 @@ virConnectGetDomainCapabilities(virConnectPtr conn, * as unsigned long long. * * VIR_DOMAIN_STATS_INTERFACE: - * Return network interface statistics. + * Return network interface statistics (from domain point of view). * The typed parameter keys are in this format: * * "net.count" - number of network interfaces on this domain --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list