Add Memory Bandwidth Monitoring(MBM) for VMs. Two types of monitoring are supported: total and local memory bandwidth monitoring. To use it, CMT should be enabled in hypervisor.
Signed-off-by: Chao Peng <chao.p.p...@linux.intel.com> --- docs/man/xl.pod.1 | 2 ++ tools/libxc/include/xenctrl.h | 2 ++ tools/libxc/xc_psr.c | 8 ++++++ tools/libxl/libxl.h | 4 +++ tools/libxl/libxl_psr.c | 58 +++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_types.idl | 2 ++ tools/libxl/xl_cmdimpl.c | 12 +++++++++ tools/libxl/xl_cmdtable.c | 4 ++- 8 files changed, 91 insertions(+), 1 deletion(-) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index 6b89ba8..28d5006 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -1476,6 +1476,8 @@ detach: Detach the platform shared resource monitoring service from a domain. Show monitoring data for a certain domain or all domains. Current supported monitor types are: - "cache-occupancy": showing the L3 cache occupancy. + - "total-mem-bandwidth": showing the total memory bandwidth. + - "local-mem-bandwidth": showing the local memory bandwidth. =back diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 96b357c..2b07e4e 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2688,6 +2688,8 @@ int xc_resource_op(xc_interface *xch, uint32_t nr_ops, xc_resource_op_t *ops); #if defined(__i386__) || defined(__x86_64__) enum xc_psr_cmt_type { XC_PSR_CMT_L3_OCCUPANCY, + XC_PSR_CMT_TOTAL_MEM_BANDWIDTH, + XC_PSR_CMT_LOCAL_MEM_BANDWIDTH, }; typedef enum xc_psr_cmt_type xc_psr_cmt_type; int xc_psr_cmt_attach(xc_interface *xch, uint32_t domid); diff --git a/tools/libxc/xc_psr.c b/tools/libxc/xc_psr.c index 94c8698..e286184 100644 --- a/tools/libxc/xc_psr.c +++ b/tools/libxc/xc_psr.c @@ -23,6 +23,8 @@ #define IA32_CMT_CTR_ERROR_MASK (0x3ull << 62) #define EVTID_L3_OCCUPANCY 0x1 +#define EVTID_TOTAL_MEM_BANDWIDTH 0x2 +#define EVTID_LOCAL_MEM_BANDWIDTH 0x3 int xc_psr_cmt_attach(xc_interface *xch, uint32_t domid) { @@ -176,6 +178,12 @@ int xc_psr_cmt_get_data(xc_interface *xch, uint32_t rmid, case XC_PSR_CMT_L3_OCCUPANCY: evtid = EVTID_L3_OCCUPANCY; break; + case XC_PSR_CMT_TOTAL_MEM_BANDWIDTH: + evtid = EVTID_TOTAL_MEM_BANDWIDTH; + break; + case XC_PSR_CMT_LOCAL_MEM_BANDWIDTH: + evtid = EVTID_LOCAL_MEM_BANDWIDTH; + break; default: return -1; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 0a123f1..bc6cc92 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1458,6 +1458,10 @@ int libxl_psr_cmt_get_l3_cache_size(libxl_ctx *ctx, uint32_t socketid, uint32_t *l3_cache_size); int libxl_psr_cmt_get_cache_occupancy(libxl_ctx *ctx, uint32_t domid, uint32_t socketid, uint32_t *l3_cache_occupancy); +int libxl_psr_cmt_get_total_mem_bandwidth(libxl_ctx *ctx, uint32_t domid, + uint32_t socketid, uint32_t *bandwidth); +int libxl_psr_cmt_get_local_mem_bandwidth(libxl_ctx *ctx, uint32_t domid, + uint32_t socketid, uint32_t *bandwidth); #endif /* misc */ diff --git a/tools/libxl/libxl_psr.c b/tools/libxl/libxl_psr.c index 21ad819..0f5e38f 100644 --- a/tools/libxl/libxl_psr.c +++ b/tools/libxl/libxl_psr.c @@ -216,6 +216,64 @@ out: return rc; } +static int libxl__psr_cmt_get_mem_bandwidth(libxl__gc *gc, uint32_t domid, + xc_psr_cmt_type type, uint32_t socketid, uint32_t *bandwidth) +{ + uint64_t sample1, sample2; + uint32_t upscaling_factor; + int rc; + + rc = libxl__psr_cmt_get_l3_monitoring_data(gc, domid, + type, socketid, &sample1); + if (rc < 0) + return ERROR_FAIL; + + usleep(10000); + + rc = libxl__psr_cmt_get_l3_monitoring_data(gc, domid, + type, socketid, &sample2); + if (rc < 0) + return ERROR_FAIL; + + if (sample2 < sample1) { + LOGE(ERROR, "event counter overflowed between two samplings"); + return ERROR_FAIL; + } + + rc = xc_psr_cmt_get_l3_upscaling_factor(CTX->xch, &upscaling_factor); + if (rc < 0) { + LOGE(ERROR, "failed to get L3 upscaling factor"); + return ERROR_FAIL; + } + + *bandwidth = (sample2 - sample1) * 100 * upscaling_factor / 1024; + return rc; +} + +int libxl_psr_cmt_get_total_mem_bandwidth(libxl_ctx *ctx, uint32_t domid, + uint32_t socketid, uint32_t *bandwidth) +{ + GC_INIT(ctx); + int rc; + + rc = libxl__psr_cmt_get_mem_bandwidth(gc, domid, + XC_PSR_CMT_TOTAL_MEM_BANDWIDTH, socketid, bandwidth); + GC_FREE; + return rc; +} + +int libxl_psr_cmt_get_local_mem_bandwidth(libxl_ctx *ctx, uint32_t domid, + uint32_t socketid, uint32_t *bandwidth) +{ + GC_INIT(ctx); + int rc; + + rc = libxl__psr_cmt_get_mem_bandwidth(gc, domid, + XC_PSR_CMT_LOCAL_MEM_BANDWIDTH, socketid, bandwidth); + GC_FREE; + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index f7fc695..8029a39 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -693,4 +693,6 @@ libxl_event = Struct("event",[ libxl_psr_cmt_type = Enumeration("psr_cmt_type", [ (1, "CACHE_OCCUPANCY"), + (2, "TOTAL_MEM_BANDWIDTH"), + (3, "LOCAL_MEM_BANDWIDTH"), ]) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index f4534ec..e0435dd 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -7867,6 +7867,16 @@ static void psr_cmt_print_domain_l3_info(libxl_dominfo *dominfo, socketid, &data) ) printf("%13u KB", data); break; + case LIBXL_PSR_CMT_TYPE_TOTAL_MEM_BANDWIDTH: + if ( !libxl_psr_cmt_get_total_mem_bandwidth(ctx, dominfo->domid, + socketid, &data) ) + printf("%11u KB/s", data); + break; + case LIBXL_PSR_CMT_TYPE_LOCAL_MEM_BANDWIDTH: + if ( !libxl_psr_cmt_get_local_mem_bandwidth(ctx, dominfo->domid, + socketid, &data) ) + printf("%11u KB/s", data); + break; default: return; } @@ -8004,6 +8014,8 @@ int main_psr_cmt_show(int argc, char **argv) switch (type) { case LIBXL_PSR_CMT_TYPE_CACHE_OCCUPANCY: + case LIBXL_PSR_CMT_TYPE_TOTAL_MEM_BANDWIDTH: + case LIBXL_PSR_CMT_TYPE_LOCAL_MEM_BANDWIDTH: ret = psr_cmt_show_l3_info(type, domid); break; default: diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 4b30d3d..2d8f272 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -538,7 +538,9 @@ struct cmd_spec cmd_table[] = { "Show Cache Monitoring Technology information", "<PSR-CMT-Type> <Domain>", "Available monitor types:\n" - "\"cache_occupancy\": Show L3 cache occupancy\n", + "\"cache_occupancy\": Show L3 cache occupancy\n" + "\"total_mem_bandwidth\": Show total memory bandwidth\n" + "\"local_mem_bandwidth\": Show local memory bandwidth\n", }, #endif }; -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel