|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] tools & docs: add L2 CAT support in tools and docs.
On 16-09-30 17:29:58, Konrad Rzeszutek Wilk wrote:
> On Thu, Aug 25, 2016 at 01:22:45PM +0800, Yi Sun wrote:
> > 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 <he.chen@xxxxxxxxxxxxxxx>
> > Signed-off-by: Yi Sun <yi.y.sun@xxxxxxxxxxxxxxx>
> > ---
> > docs/man/xl.pod.1.in | 25 +++++-
> > docs/misc/xl-psr.markdown | 10 ++-
> > tools/libxc/include/xenctrl.h | 7 +-
> > tools/libxc/xc_psr.c | 28 +++++--
> > tools/libxl/libxl.h | 2 +
> > tools/libxl/libxl_psr.c | 50 ++++++++++-
> > tools/libxl/libxl_types.idl | 1 +
> > tools/libxl/xl_cmdimpl.c | 191
> > +++++++++++++++++++++++++++++++++++-------
> > tools/libxl/xl_cmdtable.c | 4 +-
> > 9 files changed, 268 insertions(+), 50 deletions(-)
> >
> > diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in
> > index 1adf322..47bdfc6 100644
> > --- a/docs/man/xl.pod.1.in
> > +++ b/docs/man/xl.pod.1.in
> > @@ -1660,6 +1660,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<psr-cmt-attach> [I<domain-id>]
> > @@ -1684,7 +1687,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.
> > @@ -1694,7 +1697,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
> >
> > @@ -1711,6 +1714,11 @@ B<OPTIONS>
> >
> > 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 is
>
> s/last level cache/last level cache (L3)/
>
> Because you may have L4 at some point (weren't there some CPUs with L4?)
>
Thank you!
> > +processed.
> > +
> > =item B<-c>, B<--code>
> >
> > Set code CBM when CDP is enabled.
> > @@ -1721,10 +1729,21 @@ Set data CBM when CDP is enabled.
> >
> > =back
> >
> > -=item B<psr-cat-show> [I<domain-id>]
> > +=item B<psr-cat-show> [I<OPTIONS>] [I<domain-id>]
> >
> > Show CAT settings for a certain domain or all domains.
> >
> > +B<OPTIONS>
> > +
> > +=over 4
> > +
> > +=item B<-l LEVEL>, B<--level=LEVEL>
> > +
> > +Specify the cache level to process, otherwise the last level cache is
>
> Again, s/last level/last level (L3)//
Thank you!
> > +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] <domid>`
> > +
> > +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 560ce7b..d70e8a8 100644
> > --- a/tools/libxc/include/xenctrl.h
> > +++ b/tools/libxc/include/xenctrl.h
> > @@ -2585,6 +2585,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;
> >
> > @@ -2609,9 +2610,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..618dbcc 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,23 +323,29 @@ 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;
> >
> > + if ( lvl == 2 )
> > + sysctl.u.psr_cat_op.cmd = XEN_SYSCTL_PSR_CAT_get_l2_info;
> > + else if ( lvl == 3 )
> > + sysctl.u.psr_cat_op.cmd = XEN_SYSCTL_PSR_CAT_get_l3_info;
> > + else
> > + return rc;
>
> Perhaps:
>
> else {
> errno = EOPNOTSUPP;
> return rc;
> }
>
> ?
>
Ok, thanks!
> > +
> > 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 &
> > + *cos_max = sysctl.u.psr_cat_op.u.info.cos_max;
> > + *cbm_len = sysctl.u.psr_cat_op.u.info.cbm_len;
> > + *cdp_enabled = sysctl.u.psr_cat_op.u.info.flags &
> > XEN_SYSCTL_PSR_CAT_L3_CDP;
> > }
> >
> > diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> > index e4c25c4..1cdf621 100644
> > --- a/tools/libxl/libxl.h
> > +++ b/tools/libxl/libxl.h
> > @@ -2141,6 +2141,8 @@ int libxl_psr_cat_get_cbm(libxl_ctx *ctx, uint32_t
> > domid,
> > */
> > 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, 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 99733f6..861d5a8 100644
> > --- a/tools/libxl/libxl_psr.c
> > +++ b/tools/libxl/libxl_psr.c
> > @@ -379,8 +379,54 @@ 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, 3, &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);
> > + goto out;
> > + }
> > + i++;
> > + }
> > +
> > + *info = ptr;
> > + *nr = i;
> > +out:
> > + libxl_bitmap_dispose(&socketmap);
> > + GC_FREE;
> > + return rc;
> > +}
> > +
> > +int libxl_psr_cat_get_info(libxl_ctx *ctx, libxl_psr_cat_info **info,
> > + int *nr, int lvl)
> > +{
> > + GC_INIT(ctx);
> > + int rc;
> > + int i = 0, socketid, nr_sockets;
> > + libxl_bitmap socketmap;
> > + libxl_psr_cat_info *ptr;
> > +
> > + libxl_bitmap_init(&socketmap);
> > +
> > + rc = libxl__count_physical_sockets(gc, &nr_sockets);
> > + if (rc) {
> > + LOGE(ERROR, "failed to get system socket count");
> > + goto out;
> > + }
> > +
> > + libxl_socket_bitmap_alloc(ctx, &socketmap, nr_sockets);
> > + rc = libxl_get_online_socketmap(ctx, &socketmap);
> > + if (rc < 0) {
> > + LOGE(ERROR, "failed to get available sockets");
> > + goto out;
> > + }
> > +
> > + ptr = libxl__malloc(NOGC, nr_sockets * sizeof(libxl_psr_cat_info));
> > +
> > + libxl_for_each_set_bit(socketid, socketmap) {
> > + ptr[i].id = socketid;
> > + if (xc_psr_cat_get_info(ctx->xch, socketid, lvl, &ptr[i].cos_max,
> > + &ptr[i].cbm_len, &ptr[i].cdp_enabled)) {
>
> This function looks very close to libxl_psr_cat_get_l3_info. Any chance
> that you can one function doing it?
>
Yes, per my original design, libxl_psr_cat_get_l3_info will be replaced by this
function. But considering to be backward compatible, I keep this interface in
libxenlight.so.
> > libxl__psr_cat_log_err_msg(gc, errno);
> > rc = ERROR_FAIL;
> > free(ptr);
> > diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> > index 98bfc3a..4503a8b 100644
> > --- a/tools/libxl/libxl_types.idl
> > +++ b/tools/libxl/libxl_types.idl
> > @@ -890,6 +890,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 7540fb1..4a83caf 100644
> > --- a/tools/libxl/xl_cmdimpl.c
> > +++ b/tools/libxl/xl_cmdimpl.c
> > @@ -9273,18 +9273,124 @@ 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;
>
> How about unsigned int?
Yes, thanks!
> > + 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)
> > +{
> > + int i, nr_domains;
>
> unsigned int?
Yes, thanks!
> > + 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 -1;
>
> -1 ? Not ERROR_FAIL?
>
Just follow the old codes. ERROR_FAIL should be good. Thanks!
> > + }
> > +
> > + 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)
> > +{
> > + int i, nr;
>
> unsigned int?
Yes, thanks!
> > + 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;
> > int i, 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;
> > }
> >
> > @@ -9310,17 +9416,6 @@ 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)
> > {
> > @@ -9395,9 +9490,9 @@ static int psr_cat_show(uint32_t domid)
> > 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;
> > }
> >
> > @@ -9424,18 +9519,20 @@ int main_psr_cat_cbm_set(int argc, char **argv)
> > libxl_string_list socket_list;
> > unsigned long start, end;
> > int i, j, len;
> > + int lvl = 3;
>
> unsigned int?
>
Yes, thanks!
> >
> > 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);
> > @@ -9455,17 +9552,31 @@ 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;
> > + if (lvl == 2) {
> > + if (opt_data || opt_code) {
> > + fprintf(stderr, "L2 CAT does not support CDP yet.\n");
> > + return -1;
>
> ERROR_FAIL?
>
Should be good. Thanks!
> > + }
> > + 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 -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;
> > + }
> > } else {
> > - type = LIBXL_PSR_CBM_TYPE_L3_CBM;
> > + fprintf(stderr, "Invalid cache level.\n");
> > + return -1;
>
> ERROR_FAIL?
Thanks!
> > }
> >
> > if (libxl_bitmap_is_empty(&target_map))
> > @@ -9487,11 +9598,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;
> > + int lvl = 3;
>
> unsigned int?
Thanks!
> > + 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", 1) {
> > + case 'l':
> > + lvl = atoi(optarg);
> > + break;
> > }
> >
> > if (optind >= argc)
> > @@ -9503,7 +9623,12 @@ int main_psr_cat_show(int argc, char **argv)
> > return 2;
> > }
> >
> > - return psr_cat_show(domid);
> > + if (3 == lvl)
> > + rc = psr_cat_show(domid);
> > + else if (2 == lvl)
>
> Could you swap that around? lvl == 2 or such?
>
That is a coding habit. To put value before variable can help to find code
error by compilation, like '2 = lvl', a '=' is missed.
If this is not the style of Xen, I can change it. Thanks!
> > + rc = psr_l2_cat_show(domid);
> > +
> > + return rc;
> > }
> >
> > int main_psr_hwinfo(int argc, char **argv)
> > @@ -9529,7 +9654,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 with CMT and L3 CAT */
>
> s/with/off/?
Thank you!
> > + 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 85c1e0f..bb3ce69 100644
> > --- a/tools/libxl/xl_cmdtable.c
> > +++ b/tools/libxl/xl_cmdtable.c
> > @@ -549,13 +549,15 @@ struct cmd_spec cmd_table[] = {
> > "Set cache capacity bitmasks(CBM) for a domain",
> > "[options] <Domain> <CBM>",
> > "-s <socket> Specify the socket to process, otherwise all
> > sockets are processed\n"
> > + "-l <level> 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",
> > - "<Domain>",
> > + "[options] <Domain>",
> > + "-l <level> Specify the cache level to process, otherwise L3
> > cache is processed\n"
> > },
> >
> > #endif
> > --
> > 1.9.1
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@xxxxxxxxxxxxx
> > https://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |