From patchwork Tue Oct 25 03:41:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Sun X-Patchwork-Id: 9393883 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 54A1560762 for ; Tue, 25 Oct 2016 02:36:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 466D928A62 for ; Tue, 25 Oct 2016 02:36:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3AC552927B; Tue, 25 Oct 2016 02:36:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C402A28A62 for ; Tue, 25 Oct 2016 02:36:07 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1byrZP-0004st-Cv; Tue, 25 Oct 2016 02:34:31 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1byrZO-0004rd-9y for xen-devel@lists.xenproject.org; Tue, 25 Oct 2016 02:34:30 +0000 Received: from [193.109.254.147] by server-1.bemta-6.messagelabs.com id A3/40-01767-5B4CE085; Tue, 25 Oct 2016 02:34:29 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrALMWRWlGSWpSXmKPExsVywNwkQnfLEb4 Ig7dXdSy+b5nM5MDocfjDFZYAxijWzLyk/IoE1ow1K0+wFrxcx1hx98QX1gbGJ82MXYycHEIC FRL/Nx1mA7ElBHgljiybwQphB0i037jP0sXIBVTTwCix5cotsASbgLrE4689TCC2iICSxL1Vk 5lAipgF9jNK/Hr5mAUkISzgK/Hqxi12EJtFQFXiWfNxsG28Ah4Sj7auZ4HYICdx8thksKGcQP E7e4+zQ1zkLtHX0MQ4gZF3ASPDKkb14tSistQiXUu9pKLM9IyS3MTMHF1DAzO93NTi4sT01Jz EpGK95PzcTYzAkGAAgh2MdzcFHGKU5GBSEuWduYkvQogvKT+lMiOxOCO+qDQntfgQowwHh5IE 7+tDQDnBotT01Iq0zBxgcMKkJTh4lER4nxwGSvMWFyTmFmemQ6ROMSpKifOeAOkTAElklObBt cEi4hKjrJQwLyPQIUI8BalFuZklqPKvGMU5GJWEeY1AxvNk5pXATX8FtJgJaLFgPA/I4pJEhJ RUA2Nxh/qJh4wNmvMfcDrsSnt3UuFSv/lUd9sknqXC9YtiNzLWaK5xeBGaWrK18Ex6jbJ2r8/ Xt5rqP5Ydvdxz7/Tqps+3i/mbVYSX/r5foftpxW9frQkGzOcaDsVVfVe/oLaCeX9uYcrre+s6 EtoZfcwzk5JefUreIm/L88ln2jfmyjlRZu8jZJVYijMSDbWYi4oTATW6RhyDAgAA X-Env-Sender: yi.y.sun@linux.intel.com X-Msg-Ref: server-4.tower-27.messagelabs.com!1477362866!66494869!1 X-Originating-IP: [192.55.52.88] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTkyLjU1LjUyLjg4ID0+IDM3NDcyNQ==\n X-StarScan-Received: X-StarScan-Version: 9.0.13; banners=-,-,- X-VirusChecked: Checked Received: (qmail 8709 invoked from network); 25 Oct 2016 02:34:28 -0000 Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by server-4.tower-27.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 25 Oct 2016 02:34:28 -0000 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP; 24 Oct 2016 19:34:25 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.31,544,1473145200"; d="scan'208"; a="1049570282" Received: from vmmmba-s2600wft.bj.intel.com ([10.240.193.60]) by orsmga001.jf.intel.com with ESMTP; 24 Oct 2016 19:34:24 -0700 From: Yi Sun To: xen-devel@lists.xenproject.org Date: Tue, 25 Oct 2016 11:41:03 +0800 Message-Id: <1477366863-5246-16-git-send-email-yi.y.sun@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477366863-5246-1-git-send-email-yi.y.sun@linux.intel.com> References: <1477366863-5246-1-git-send-email-yi.y.sun@linux.intel.com> Cc: wei.liu2@citrix.com, he.chen@linux.intel.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, Yi Sun , jbeulich@suse.com, chao.p.peng@linux.intel.com Subject: [Xen-devel] [PATCH v3 15/15] tools & docs: add L2 CAT support in tools and docs. X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP This patch is the xl/xc changes to support Intel L2 CAT (Cache Allocation Technology). The new level option is introduced to original CAT setting command in order to set CBM for specified level CAT. - 'xl psr-hwinfo' is updated to show both L3 CAT and L2 CAT info. - 'xl psr-cat-cbm-set' is updated to set cache capacity bitmasks(CBM) for a domain according to input cache level. - 'xl psr-cat-show' is updated to show CBM of a domain according to input cache level. Examples: root@:~$ xl psr-hwinfo --cat Cache Allocation Technology (CAT): L2 Socket ID : 0 Maximum COS : 3 CBM length : 8 Default CBM : 0xff root@:~$ xl psr-cat-cbm-set -l2 1 0x7f root@:~$ xl psr-cat-show -l2 1 Socket ID : 0 Default CBM : 0xff ID NAME CBM 1 ubuntu14 0x7f Signed-off-by: He Chen Signed-off-by: Yi Sun --- docs/man/xl.pod.1.in | 25 ++++- docs/misc/xl-psr.markdown | 10 +- tools/libxc/include/xenctrl.h | 7 +- tools/libxc/xc_psr.c | 46 ++++++--- tools/libxl/libxl.h | 11 ++- tools/libxl/libxl_psr.c | 10 +- tools/libxl/libxl_types.idl | 1 + tools/libxl/xl_cmdimpl.c | 220 +++++++++++++++++++++++++++++++++--------- tools/libxl/xl_cmdtable.c | 4 +- 9 files changed, 260 insertions(+), 74 deletions(-) diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in index 8e2aa5b..2c41ea7 100644 --- a/docs/man/xl.pod.1.in +++ b/docs/man/xl.pod.1.in @@ -1701,6 +1701,9 @@ occupancy monitoring share the same set of underlying monitoring service. Once a domain is attached to the monitoring service, monitoring data can be shown for any of these monitoring types. +There is no cache monitoring and memory bandwidth monitoring on L2 cache so +far. + =over 4 =item B [I] @@ -1725,7 +1728,7 @@ monitor types are: Intel Broadwell and later server platforms offer capabilities to configure and make use of the Cache Allocation Technology (CAT) mechanisms, which enable more -cache resources (i.e. L3 cache) to be made available for high priority +cache resources (i.e. L3/L2 cache) to be made available for high priority applications. In the Xen implementation, CAT is used to control cache allocation on VM basis. To enforce cache on a specific domain, just set capacity bitmasks (CBM) for the domain. @@ -1735,7 +1738,7 @@ Intel Broadwell and later server platforms also offer Code/Data Prioritization applications. CDP is used on a per VM basis in the Xen implementation. To specify code or data CBM for the domain, CDP feature must be enabled and CBM type options need to be specified when setting CBM, and the type options (code -and data) are mutually exclusive. +and data) are mutually exclusive. There is no CDP support on L2 so far. =over 4 @@ -1752,6 +1755,11 @@ B Specify the socket to process, otherwise all sockets are processed. +=item B<-l LEVEL>, B<--level=LEVEL> + +Specify the cache level to process, otherwise the last level cache (L3) is +processed. + =item B<-c>, B<--code> Set code CBM when CDP is enabled. @@ -1762,10 +1770,21 @@ Set data CBM when CDP is enabled. =back -=item B [I] +=item B [I] [I] Show CAT settings for a certain domain or all domains. +B + +=over 4 + +=item B<-l LEVEL>, B<--level=LEVEL> + +Specify the cache level to process, otherwise the last level cache (L3) is +processed. + +=back + =back =head1 IGNORED FOR COMPATIBILITY WITH XM diff --git a/docs/misc/xl-psr.markdown b/docs/misc/xl-psr.markdown index c3c1e8e..bd2b6bd 100644 --- a/docs/misc/xl-psr.markdown +++ b/docs/misc/xl-psr.markdown @@ -70,7 +70,7 @@ total-mem-bandwidth instead of cache-occupancy). E.g. after a `xl psr-cmt-attach Cache Allocation Technology (CAT) is a new feature available on Intel Broadwell and later server platforms that allows an OS or Hypervisor/VMM to -partition cache allocation (i.e. L3 cache) based on application priority or +partition cache allocation (i.e. L3/L2 cache) based on application priority or Class of Service (COS). Each COS is configured using capacity bitmasks (CBM) which represent cache capacity and indicate the degree of overlap and isolation between classes. System cache resource is divided into numbers of @@ -119,13 +119,19 @@ A cbm is valid only when: In a multi-socket system, the same cbm will be set on each socket by default. Per socket cbm can be specified with the `--socket SOCKET` option. +In different systems, the different cache level is supported, e.g. L3 cache or +L2 cache. Per cache level cbm can be specified with the `--level LEVEL` option. + Setting the CBM may not be successful if insufficient COS is available. In such case unused COS(es) may be freed by setting CBM of all related domains to its default value(all-ones). Per domain CBM settings can be shown by: -`xl psr-cat-show` +`xl psr-cat-show [OPTIONS] ` + +In different systems, the different cache level is supported, e.g. L3 cache or +L2 cache. Per cache level cbm can be specified with the `--level LEVEL` option. ## Code and Data Prioritization (CDP) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 2c83544..8ee068f 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2602,6 +2602,7 @@ enum xc_psr_cat_type { XC_PSR_CAT_L3_CBM = 1, XC_PSR_CAT_L3_CBM_CODE = 2, XC_PSR_CAT_L3_CBM_DATA = 3, + XC_PSR_CAT_L2_CBM = 4, }; typedef enum xc_psr_cat_type xc_psr_cat_type; @@ -2626,9 +2627,9 @@ int xc_psr_cat_set_domain_data(xc_interface *xch, uint32_t domid, int xc_psr_cat_get_domain_data(xc_interface *xch, uint32_t domid, xc_psr_cat_type type, uint32_t target, uint64_t *data); -int xc_psr_cat_get_l3_info(xc_interface *xch, uint32_t socket, - uint32_t *cos_max, uint32_t *cbm_len, - bool *cdp_enabled); +int xc_psr_cat_get_info(xc_interface *xch, uint32_t socket, int lvl, + uint32_t *cos_max, uint32_t *cbm_len, + bool *cdp_enabled); int xc_get_cpu_levelling_caps(xc_interface *xch, uint32_t *caps); int xc_get_cpu_featureset(xc_interface *xch, uint32_t index, diff --git a/tools/libxc/xc_psr.c b/tools/libxc/xc_psr.c index 43b3286..d5055db 100644 --- a/tools/libxc/xc_psr.c +++ b/tools/libxc/xc_psr.c @@ -266,6 +266,9 @@ int xc_psr_cat_set_domain_data(xc_interface *xch, uint32_t domid, case XC_PSR_CAT_L3_CBM_DATA: cmd = XEN_DOMCTL_PSR_CAT_OP_SET_L3_DATA; break; + case XC_PSR_CAT_L2_CBM: + cmd = XEN_DOMCTL_PSR_CAT_OP_SET_L2_CBM; + break; default: errno = EINVAL; return -1; @@ -299,6 +302,9 @@ int xc_psr_cat_get_domain_data(xc_interface *xch, uint32_t domid, case XC_PSR_CAT_L3_CBM_DATA: cmd = XEN_DOMCTL_PSR_CAT_OP_GET_L3_DATA; break; + case XC_PSR_CAT_L2_CBM: + cmd = XEN_DOMCTL_PSR_CAT_OP_GET_L2_CBM; + break; default: errno = EINVAL; return -1; @@ -317,24 +323,40 @@ int xc_psr_cat_get_domain_data(xc_interface *xch, uint32_t domid, return rc; } -int xc_psr_cat_get_l3_info(xc_interface *xch, uint32_t socket, - uint32_t *cos_max, uint32_t *cbm_len, - bool *cdp_enabled) +int xc_psr_cat_get_info(xc_interface *xch, uint32_t socket, int lvl, + uint32_t *cos_max, uint32_t *cbm_len, + bool *cdp_enabled) { - int rc; + int rc = -1; DECLARE_SYSCTL; sysctl.cmd = XEN_SYSCTL_psr_cat_op; - sysctl.u.psr_cat_op.cmd = XEN_SYSCTL_PSR_CAT_get_l3_info; sysctl.u.psr_cat_op.target = socket; - rc = xc_sysctl(xch, &sysctl); - if ( !rc ) - { - *cos_max = sysctl.u.psr_cat_op.u.l3_info.cos_max; - *cbm_len = sysctl.u.psr_cat_op.u.l3_info.cbm_len; - *cdp_enabled = sysctl.u.psr_cat_op.u.l3_info.flags & - XEN_SYSCTL_PSR_CAT_L3_CDP; + switch ( lvl ) { + case 2: + sysctl.u.psr_cat_op.cmd = XEN_SYSCTL_PSR_CAT_get_l2_info; + rc = xc_sysctl(xch, &sysctl); + if ( !rc ) + { + *cos_max = sysctl.u.psr_cat_op.u.l2_info.cos_max; + *cbm_len = sysctl.u.psr_cat_op.u.l2_info.cbm_len; + } + break; + case 3: + sysctl.u.psr_cat_op.cmd = XEN_SYSCTL_PSR_CAT_get_l3_info; + rc = xc_sysctl(xch, &sysctl); + if ( !rc ) + { + *cos_max = sysctl.u.psr_cat_op.u.l3_info.cos_max; + *cbm_len = sysctl.u.psr_cat_op.u.l3_info.cbm_len; + *cdp_enabled = sysctl.u.psr_cat_op.u.l3_info.flags & + XEN_SYSCTL_PSR_CAT_L3_CDP; + } + break; + default: + errno = EOPNOTSUPP; + return rc; } return rc; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index acbf476..026014a 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -907,6 +907,13 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src); #endif /* + * LIBXL_HAVE_PSR_GEN + * + * If this is defined, the General Interfaces for PSR features are supported. + */ +#define LIBXL_HAVE_PSR_GEN 1 + +/* * LIBXL_HAVE_PCITOPOLOGY * * If this is defined, then interface to query hypervisor about PCI device @@ -2159,8 +2166,8 @@ int libxl_psr_cat_get_cbm(libxl_ctx *ctx, uint32_t domid, * On success, the function returns an array of elements in 'info', * and the length in 'nr'. */ -int libxl_psr_cat_get_l3_info(libxl_ctx *ctx, libxl_psr_cat_info **info, - int *nr); +int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info, + int *nr, unsigned int lvl); void libxl_psr_cat_info_list_free(libxl_psr_cat_info *list, int nr); #endif diff --git a/tools/libxl/libxl_psr.c b/tools/libxl/libxl_psr.c index 786183c..ec2042b 100644 --- a/tools/libxl/libxl_psr.c +++ b/tools/libxl/libxl_psr.c @@ -352,8 +352,8 @@ int libxl_psr_cat_get_cbm(libxl_ctx *ctx, uint32_t domid, return rc; } -int libxl_psr_cat_get_l3_info(libxl_ctx *ctx, libxl_psr_cat_info **info, - int *nr) +int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info, + int *nr, unsigned int lvl) { GC_INIT(ctx); int rc; @@ -380,8 +380,8 @@ int libxl_psr_cat_get_l3_info(libxl_ctx *ctx, libxl_psr_cat_info **info, libxl_for_each_set_bit(socketid, socketmap) { ptr[i].id = socketid; - if (xc_psr_cat_get_l3_info(ctx->xch, socketid, &ptr[i].cos_max, - &ptr[i].cbm_len, &ptr[i].cdp_enabled)) { + if (xc_psr_cat_get_info(ctx->xch, socketid, lvl, &ptr[i].cos_max, + &ptr[i].cbm_len, &ptr[i].cdp_enabled)) { libxl__psr_cat_log_err_msg(gc, errno); rc = ERROR_FAIL; free(ptr); @@ -400,7 +400,7 @@ out: void libxl_psr_cat_info_list_free(libxl_psr_cat_info *list, int nr) { - int i; + unsigned int i; for (i = 0; i < nr; i++) libxl_psr_cat_info_dispose(&list[i]); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index a32c751..944b7d4 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -898,6 +898,7 @@ libxl_psr_cbm_type = Enumeration("psr_cbm_type", [ (1, "L3_CBM"), (2, "L3_CBM_CODE"), (3, "L3_CBM_DATA"), + (4, "L2_CBM"), ]) libxl_psr_cat_info = Struct("psr_cat_info", [ diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index bb5afb8..ca3122d 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -9332,18 +9332,128 @@ int main_psr_cmt_show(int argc, char **argv) #endif #ifdef LIBXL_HAVE_PSR_CAT -static int psr_cat_hwinfo(void) +static void psr_cat_print_one_domain_cbm_type(uint32_t domid, uint32_t socketid, + libxl_psr_cbm_type type) +{ + uint64_t cbm; + + if (!libxl_psr_cat_get_cbm(ctx, domid, type, socketid, &cbm)) + printf("%#16"PRIx64, cbm); + else + printf("%16s", "error"); +} + +static int psr_l2_cat_hwinfo(void) { int rc; - int i, nr; + unsigned int i; + int nr; + libxl_psr_cat_info *info; + + printf("Cache Allocation Technology (CAT): L2\n"); + + rc = libxl_psr_cat_get_info(ctx, &info, &nr, 2); + if (rc) { + fprintf(stderr, "Failed to get l2 cat info\n"); + return rc; + } + + for (i = 0; i < nr; i++) { + /* There is no CMT on L2 cache so far. */ + printf("%-16s: %u\n", "Socket ID", info[i].id); + printf("%-16s: %u\n", "Maximum COS", info[i].cos_max); + printf("%-16s: %u\n", "CBM length", info[i].cbm_len); + printf("%-16s: %#llx\n", "Default CBM", + (1ull << info[i].cbm_len) - 1); + } + + libxl_psr_cat_info_list_free(info, nr); + return rc; +} + +static void psr_l2_cat_print_one_domain_cbm(uint32_t domid, uint32_t socketid) +{ + char *domain_name; + + domain_name = libxl_domid_to_name(ctx, domid); + printf("%5d%25s", domid, domain_name); + free(domain_name); + + psr_cat_print_one_domain_cbm_type(domid, socketid, + LIBXL_PSR_CBM_TYPE_L2_CBM); + + printf("\n"); +} + +static int psr_l2_cat_print_domain_cbm(uint32_t domid, uint32_t socketid) +{ + unsigned int i; + int nr_domains; + libxl_dominfo *list; + + if (domid != INVALID_DOMID) { + psr_l2_cat_print_one_domain_cbm(domid, socketid); + return 0; + } + + if (!(list = libxl_list_domain(ctx, &nr_domains))) { + fprintf(stderr, "Failed to get domain list for cbm display\n"); + return ERROR_FAIL; + } + + for (i = 0; i < nr_domains; i++) + psr_l2_cat_print_one_domain_cbm(list[i].domid, socketid); + libxl_dominfo_list_free(list, nr_domains); + + return 0; +} + +static int psr_l2_cat_print_socket(uint32_t domid, libxl_psr_cat_info *info) +{ + printf("%-16s: %u\n", "Socket ID", info->id); + printf("%-16s: %#llx\n", "Default CBM", (1ull << info->cbm_len) - 1); + printf("%5s%25s%16s\n", "ID", "NAME", "CBM"); + + return psr_l2_cat_print_domain_cbm(domid, info->id); +} + +static int psr_l2_cat_show(uint32_t domid) +{ + unsigned int i; + int nr; + int rc; + libxl_psr_cat_info *info; + + rc = libxl_psr_cat_get_info(ctx, &info, &nr, 2); + if (rc) { + fprintf(stderr, "Failed to get l2 cat info\n"); + return rc; + } + + for (i = 0; i < nr; i++) { + rc = psr_l2_cat_print_socket(domid, info + i); + if (rc) + goto out; + } + +out: + libxl_psr_cat_info_list_free(info, nr); + return rc; +} + +static int psr_l3_cat_hwinfo(void) +{ + int rc; + unsigned int i; + int nr; uint32_t l3_cache_size; libxl_psr_cat_info *info; - printf("Cache Allocation Technology (CAT):\n"); + printf("Cache Allocation Technology (CAT): L3\n"); - rc = libxl_psr_cat_get_l3_info(ctx, &info, &nr); + rc = libxl_psr_cat_get_info(ctx, &info, &nr, 3); if (rc) { - fprintf(stderr, "Failed to get cat info\n"); + fprintf(stderr, "Failed to get l3 cat info\n"); return rc; } @@ -9369,19 +9479,8 @@ out: return rc; } -static void psr_cat_print_one_domain_cbm_type(uint32_t domid, uint32_t socketid, - libxl_psr_cbm_type type) -{ - uint64_t cbm; - - if (!libxl_psr_cat_get_cbm(ctx, domid, type, socketid, &cbm)) - printf("%#16"PRIx64, cbm); - else - printf("%16s", "error"); -} - -static void psr_cat_print_one_domain_cbm(uint32_t domid, uint32_t socketid, - bool cdp_enabled) +static void psr_l3_cat_print_one_domain_cbm(uint32_t domid, uint32_t socketid, + bool cdp_enabled) { char *domain_name; @@ -9402,14 +9501,15 @@ static void psr_cat_print_one_domain_cbm(uint32_t domid, uint32_t socketid, printf("\n"); } -static int psr_cat_print_domain_cbm(uint32_t domid, uint32_t socketid, - bool cdp_enabled) +static int psr_l3_cat_print_domain_cbm(uint32_t domid, uint32_t socketid, + bool cdp_enabled) { - int i, nr_domains; + unsigned int i; + int nr_domains; libxl_dominfo *list; if (domid != INVALID_DOMID) { - psr_cat_print_one_domain_cbm(domid, socketid, cdp_enabled); + psr_l3_cat_print_one_domain_cbm(domid, socketid, cdp_enabled); return 0; } @@ -9419,13 +9519,13 @@ static int psr_cat_print_domain_cbm(uint32_t domid, uint32_t socketid, } for (i = 0; i < nr_domains; i++) - psr_cat_print_one_domain_cbm(list[i].domid, socketid, cdp_enabled); + psr_l3_cat_print_one_domain_cbm(list[i].domid, socketid, cdp_enabled); libxl_dominfo_list_free(list, nr_domains); return 0; } -static int psr_cat_print_socket(uint32_t domid, libxl_psr_cat_info *info) +static int psr_l3_cat_print_socket(uint32_t domid, libxl_psr_cat_info *info) { int rc; uint32_t l3_cache_size; @@ -9445,23 +9545,24 @@ static int psr_cat_print_socket(uint32_t domid, libxl_psr_cat_info *info) else printf("%5s%25s%16s\n", "ID", "NAME", "CBM"); - return psr_cat_print_domain_cbm(domid, info->id, info->cdp_enabled); + return psr_l3_cat_print_domain_cbm(domid, info->id, info->cdp_enabled); } -static int psr_cat_show(uint32_t domid) +static int psr_l3_cat_show(uint32_t domid) { - int i, nr; + unsigned int i; + int nr; int rc; libxl_psr_cat_info *info; - rc = libxl_psr_cat_get_l3_info(ctx, &info, &nr); + rc = libxl_psr_cat_get_info(ctx, &info, &nr, 3); if (rc) { - fprintf(stderr, "Failed to get cat info\n"); + fprintf(stderr, "Failed to get l3 cat info\n"); return rc; } for (i = 0; i < nr; i++) { - rc = psr_cat_print_socket(domid, info + i); + rc = psr_l3_cat_print_socket(domid, info + i); if (rc) goto out; } @@ -9482,19 +9583,21 @@ int main_psr_cat_cbm_set(int argc, char **argv) char *value; libxl_string_list socket_list; unsigned long start, end; - int i, j, len; + unsigned int i, j, len; + unsigned int lvl = 3; static struct option opts[] = { {"socket", 1, 0, 's'}, {"data", 0, 0, 'd'}, {"code", 0, 0, 'c'}, + {"level", 1, 0, 'l'}, COMMON_LONG_OPTS }; libxl_socket_bitmap_alloc(ctx, &target_map, 0); libxl_bitmap_set_none(&target_map); - SWITCH_FOREACH_OPT(opt, "s:cd", opts, "psr-cat-cbm-set", 2) { + SWITCH_FOREACH_OPT(opt, "s:l:cd", opts, "psr-cat-cbm-set", 2) { case 's': trim(isspace, optarg, &value); split_string_into_string_list(value, ",", &socket_list); @@ -9514,17 +9617,24 @@ int main_psr_cat_cbm_set(int argc, char **argv) case 'c': opt_code = 1; break; + case 'l': + lvl = atoi(optarg); + break; } - if (opt_data && opt_code) { - fprintf(stderr, "Cannot handle -c and -d at the same time\n"); - return -1; - } else if (opt_data) { - type = LIBXL_PSR_CBM_TYPE_L3_CBM_DATA; - } else if (opt_code) { - type = LIBXL_PSR_CBM_TYPE_L3_CBM_CODE; - } else { - type = LIBXL_PSR_CBM_TYPE_L3_CBM; + if (lvl == 2) + type = LIBXL_PSR_CBM_TYPE_L2_CBM; + else if (lvl == 3) { + if (opt_data && opt_code) { + fprintf(stderr, "Cannot handle -c and -d at the same time\n"); + return ERROR_FAIL; + } else if (opt_data) { + type = LIBXL_PSR_CBM_TYPE_L3_CBM_DATA; + } else if (opt_code) { + type = LIBXL_PSR_CBM_TYPE_L3_CBM_CODE; + } else { + type = LIBXL_PSR_CBM_TYPE_L3_CBM; + } } if (libxl_bitmap_is_empty(&target_map)) @@ -9546,11 +9656,20 @@ int main_psr_cat_cbm_set(int argc, char **argv) int main_psr_cat_show(int argc, char **argv) { - int opt; + int opt = 0; uint32_t domid; + unsigned int lvl = 3; + int rc; - SWITCH_FOREACH_OPT(opt, "", NULL, "psr-cat-show", 0) { - /* No options */ + static struct option opts[] = { + {"level", 1, 0, 'l'}, + COMMON_LONG_OPTS + }; + + SWITCH_FOREACH_OPT(opt, "l:", opts, "psr-cat-show", 0) { + case 'l': + lvl = atoi(optarg); + break; } if (optind >= argc) @@ -9562,7 +9681,12 @@ int main_psr_cat_show(int argc, char **argv) return 2; } - return psr_cat_show(domid); + if (lvl == 3) + rc = psr_l3_cat_show(domid); + else if (lvl == 2) + rc = psr_l2_cat_show(domid); + + return rc; } int main_psr_hwinfo(int argc, char **argv) @@ -9588,7 +9712,11 @@ int main_psr_hwinfo(int argc, char **argv) ret = psr_cmt_hwinfo(); if (!ret && (all || cat)) - ret = psr_cat_hwinfo(); + ret = psr_l3_cat_hwinfo(); + + /* L2 CAT is independent of CMT and L3 CAT */ + if (all || cat) + ret = psr_l2_cat_hwinfo(); return ret; } diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 588d5d9..32c3ee5 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -550,13 +550,15 @@ struct cmd_spec cmd_table[] = { "Set cache capacity bitmasks(CBM) for a domain", "[options] ", "-s Specify the socket to process, otherwise all sockets are processed\n" + "-l Specify the cache level to process, otherwise L3 cache is processed\n" "-c Set code CBM if CDP is supported\n" "-d Set data CBM if CDP is supported\n" }, { "psr-cat-show", &main_psr_cat_show, 0, 1, "Show Cache Allocation Technology information", - "", + "[options] ", + "-l Specify the cache level to process, otherwise L3 cache is processed\n" }, #endif