From nobody Sat Jul 12 04:32:25 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) client-ip=209.132.183.39; envelope-from=libvir-list-bounces@redhat.com; helo=mx6-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by mx.zohomail.com with SMTPS id 1488794901588255.34825532667344; Mon, 6 Mar 2017 02:08:21 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v26A4tWs036177; Mon, 6 Mar 2017 05:04:55 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v26A4seR031026 for ; Mon, 6 Mar 2017 05:04:54 -0500 Received: from mx1.redhat.com (ext-mx04.extmail.prod.ext.phx2.redhat.com [10.5.110.28]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v26A4sAD011311 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 6 Mar 2017 05:04:54 -0500 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5C81E8553E; Mon, 6 Mar 2017 10:04:52 +0000 (UTC) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Mar 2017 02:04:50 -0800 Received: from s2600wt.sh.intel.com ([10.239.48.158]) by fmsmga001.fm.intel.com with ESMTP; 06 Mar 2017 02:04:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,253,1484035200"; d="scan'208";a="1118957052" From: Eli Qiao To: libvir-list@redhat.com Date: Mon, 6 Mar 2017 18:06:41 +0800 Message-Id: <1488794801-13844-13-git-send-email-liyong.qiao@intel.com> In-Reply-To: <1488794801-13844-1-git-send-email-liyong.qiao@intel.com> References: <1488794801-13844-1-git-send-email-liyong.qiao@intel.com> X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 203 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 06 Mar 2017 10:04:52 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 06 Mar 2017 10:04:52 +0000 (UTC) for IP:'192.55.52.93' DOMAIN:'mga11.intel.com' HELO:'mga11.intel.com' FROM:'liyong.qiao@intel.com' RCPT:'' X-RedHat-Spam-Score: -4.303 (BAYES_50, DCC_REPUT_13_19, RCVD_IN_DNSWL_HI, RCVD_IN_MSPIKE_H2, RP_MATCHES_RCVD, SPF_PASS) 192.55.52.93 mga11.intel.com 192.55.52.93 mga11.intel.com X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.28 X-loop: libvir-list@redhat.com Cc: mkletzan@redhat.com, mtosatti@redhat.com, qiaoliyong@gmail.com Subject: [libvirt] [PATCH resend V10 12/12] Resctrl: Add nodecachestats 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-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add new virsh command line `nodecachestats` to expose the cache usage on a node. Signed-off-by: Eli Qiao --- src/libvirt_private.syms | 3 ++- src/qemu/qemu_driver.c | 12 ++++++++++ src/util/virresctrl.c | 62 ++++++++++++++++++++++++++++++++++++++++++++= ++++ src/util/virresctrl.h | 8 +++++++ tools/virsh-host.c | 49 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9cfffb8..75a4c98 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2323,13 +2323,14 @@ virRandomInt; =20 # util/virresctrl.h virResCtrlAvailable; +virResCtrlCacheGetStats; virResCtrlGet; virResCtrlInit; virResCtrlSetCacheBanks; virResCtrlTypeFromString; virResCtrlTypeToString; virResCtrlUpdate; -# + =20 # util/virrotatingfile.h virRotatingFileReaderConsume; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 0f11ae2..4677406 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18285,6 +18285,17 @@ qemuNodeGetCPUStats(virConnectPtr conn, return virHostCPUGetStats(cpuNum, params, nparams, flags); } =20 +static int +qemuNodeGetCacheStats(virConnectPtr conn, + virNodeCacheStatsPtr params, + int *nparams, + unsigned int flags) +{ + if (virNodeGetCacheStatsEnsureACL(conn) < 0) + return -1; + + return virResCtrlCacheGetStats(params, nparams, flags); +} =20 static int qemuNodeGetMemoryStats(virConnectPtr conn, @@ -20391,6 +20402,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainMemoryPeek =3D qemuDomainMemoryPeek, /* 0.4.4 */ .domainGetBlockInfo =3D qemuDomainGetBlockInfo, /* 0.8.1 */ .nodeGetCPUStats =3D qemuNodeGetCPUStats, /* 0.9.3 */ + .nodeGetCacheStats =3D qemuNodeGetCacheStats, /* 3.1.0 */ .nodeGetMemoryStats =3D qemuNodeGetMemoryStats, /* 0.9.3 */ .nodeGetCellsFreeMemory =3D qemuNodeGetCellsFreeMemory, /* 0.4.4 */ .nodeGetFreeMemory =3D qemuNodeGetFreeMemory, /* 0.4.4 */ diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c index 16c01a2..97f7e84 100644 --- a/src/util/virresctrl.c +++ b/src/util/virresctrl.c @@ -1034,3 +1034,65 @@ virResCtrlGet(int type) { return &resctrlall[type]; } + +int virResCtrlCacheGetStats(virNodeCacheStatsPtr params, + int *nparams, + unsigned int flags) +{ + virCheckFlags(0, -1); + size_t i, j, k; + char *value; + int rc =3D -1; + int lockfd; + + if (*nparams =3D=3D 0) { + for (i =3D 0; i < VIR_RDT_RESOURCE_LAST; i++) { + if (VIR_RESCTRL_ENABLED(i)) + *nparams +=3D resctrlall[i].num_banks; + } + } + if (params =3D=3D NULL) + return 0; + + if ((lockfd =3D open(RESCTRL_DIR, O_RDONLY)) < 0) + goto cleanup; + + if (VIR_RESCTRL_LOCK(lockfd, LOCK_SH) < 0) { + virReportSystemError(errno, _("Unable to lock '%s'"), RESCTRL_DIR); + goto cleanup; + } + if (virResCtrlScan() < 0) { + VIR_ERROR(_("Failed to scan resctrl domain dir")); + goto cleanup; + } + + virResCtrlRefreshSchemata(); + + if ((rc =3D virResCtrlFlushDomainToSysfs(domainall.domains)) < 0) + goto cleanup; + + k =3D 0; + + for (i =3D 0; i < VIR_RDT_RESOURCE_LAST; i++) { + if (VIR_RESCTRL_ENABLED(i)) { + for (j =3D 0; j < resctrlall[i].num_banks; j++) { + + if (virAsprintf(&value, "%s.%zu", + resctrlall[i].name, j) < 0) + goto cleanup; + + if (virStrcpyStatic((¶ms[k])->field, value) =3D=3D NUL= L) + goto cleanup; + + (¶ms[k++])->value =3D resctrlall[i].cache_banks[j].cac= he_left; + } + } + } + + rc =3D 0; + + cleanup: + VIR_FREE(value); + VIR_RESCTRL_UNLOCK(lockfd); + return rc; +} diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h index 968e0dc..eef5370 100644 --- a/src/util/virresctrl.h +++ b/src/util/virresctrl.h @@ -80,9 +80,17 @@ struct _virResCtrl { }; =20 bool virResCtrlAvailable(void); + int virResCtrlInit(void); + virResCtrlPtr virResCtrlGet(int); + int virResCtrlSetCacheBanks(virDomainCachetunePtr, unsigned char *, pid_t *, int); + int virResCtrlUpdate(unsigned char *); + +int virResCtrlCacheGetStats(virNodeCacheStatsPtr params, + int *nparams, + unsigned int flags); #endif diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 24ebde2..c90bd2e 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -946,6 +946,49 @@ cmdNodeMemStats(vshControl *ctl, const vshCmd *cmd) VIR_FREE(params); return ret; } +/* "nodecachestats" command + */ +static const vshCmdInfo info_nodecachestats[] =3D { + {.name =3D "help", + .data =3D N_("Prints cache stats of the node.") + }, + {.name =3D "desc", + .data =3D N_("Returns cache stats of the node, in kilobytes.") + }, + {.name =3D NULL} +}; + +static bool +cmdNodeCacheStats(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) +{ + virshControlPtr priv =3D ctl->privData; + virNodeCacheStatsPtr params; + int nparams =3D 0; + size_t i; + bool ret =3D false; + + if (virNodeGetCacheStats(priv->conn, NULL, &nparams, 0) !=3D 0) { + vshError(ctl, "%s", + _("Unable to get number of cache stats")); + return false; + } + if (nparams =3D=3D 0) { + /* nothing to output */ + return true; + } + + params =3D vshCalloc(ctl, nparams, sizeof(*params)); + if (virNodeGetCacheStats(priv->conn, params, &nparams, 0) !=3D 0) { + vshError(ctl, "%s", _("Unable to get node cache stats")); + goto cleanup; + } + + for (i =3D 0; i < nparams; i++) + vshPrint(ctl, "%s: %llu KiB\n", params[i].field, params[i].value); + + cleanup: + return ret; +} =20 /* * "nodesuspend" command @@ -1455,6 +1498,12 @@ const vshCmdDef hostAndHypervisorCmds[] =3D { .info =3D info_nodememstats, .flags =3D 0 }, + {.name =3D "nodecachestats", + .handler =3D cmdNodeCacheStats, + .opts =3D NULL, + .info =3D info_nodecachestats, + .flags =3D 0 + }, {.name =3D "nodesuspend", .handler =3D cmdNodeSuspend, .opts =3D opts_node_suspend, --=20 1.9.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list