[Xen-devel] [PATCH v3 5/5] tools: add total/local memory bandwith monitoring

2015-01-13 Thread Chao Peng
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 |9 +
 tools/libxc/include/xenctrl.h |2 +
 tools/libxc/xc_psr.c  |8 
 tools/libxl/libxl.h   |8 
 tools/libxl/libxl_psr.c   |   84 +
 tools/libxl/libxl_types.idl   |2 +
 tools/libxl/xl_cmdimpl.c  |   21 ++-
 tools/libxl/xl_cmdtable.c |4 +-
 8 files changed, 136 insertions(+), 2 deletions(-)

diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 6b89ba8..0370625 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -1461,6 +1461,13 @@ is domain level. To monitor a specific domain, just 
attach the domain id with
 the monitoring service. When the domain doesn't need to be monitored any more,
 detach the domain id from the monitoring service.
 
+Intel Broadwell and later server platforms also offer total/local memory
+bandwidth monitoring. Xen supports per-domain monitoring for these two
+additional monitoring types. Both memory bandwidth monitoring and L3 cache
+occupancy monitoring share the same set of underground monitoring service. Once
+a domain is attached to the monitoring service, monitoring data can be showed
+for any of these monitoring types.
+
 =over 4
 
 =item Bpsr-cmt-attach [Idomain-id]
@@ -1476,6 +1483,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 c6e9e3e..06366b5 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 a9881a4..5858693 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)
 {
@@ -168,6 +170,12 @@ int xc_psr_cmt_get_data(xc_interface *xch, uint32_t rmid, 
uint32_t cpu,
 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 596d2a0..347ef52 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1462,6 +1462,14 @@ 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 c88c421..0c3e4e6 100644
--- a/tools/libxl/libxl_psr.c
+++ b/tools/libxl/libxl_psr.c
@@ -18,6 +18,7 @@
 
 
 #define IA32_QM_CTR_ERROR_MASK (0x3ul  62)
+#define MBM_SAMPLE_RETRY_MAX 4
 
 static void libxl__psr_cmt_log_err_msg(libxl__gc *gc, int err)
 {
@@ -240,6 +241,89 @@ 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 retry_attempts = 0;
+int rc;
+

Re: [Xen-devel] [PATCH v3 5/5] tools: add total/local memory bandwith monitoring

2015-01-13 Thread Wei Liu
On Tue, Jan 13, 2015 at 04:02:13PM +0800, Chao Peng wrote:
 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 |9 +
  tools/libxc/include/xenctrl.h |2 +
  tools/libxc/xc_psr.c  |8 
  tools/libxl/libxl.h   |8 
  tools/libxl/libxl_psr.c   |   84 
 +
  tools/libxl/libxl_types.idl   |2 +
  tools/libxl/xl_cmdimpl.c  |   21 ++-
  tools/libxl/xl_cmdtable.c |4 +-
  8 files changed, 136 insertions(+), 2 deletions(-)
 
 diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
 index 6b89ba8..0370625 100644
 --- a/docs/man/xl.pod.1
 +++ b/docs/man/xl.pod.1
 @@ -1461,6 +1461,13 @@ is domain level. To monitor a specific domain, just 
 attach the domain id with
  the monitoring service. When the domain doesn't need to be monitored any 
 more,
  detach the domain id from the monitoring service.
  
 +Intel Broadwell and later server platforms also offer total/local memory
 +bandwidth monitoring. Xen supports per-domain monitoring for these two
 +additional monitoring types. Both memory bandwidth monitoring and L3 cache
 +occupancy monitoring share the same set of underground monitoring service. 
 Once
  ^^^
  underlying?

I'm not native speaker though. I will defer reviewing this paragraph to
a native English speaker.

 +a domain is attached to the monitoring service, monitoring data can be showed
 +for any of these monitoring types.
 +
  =over 4
  
[...]
 +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 retry_attempts = 0;
 +int rc;
 +
 +do {
 +rc = libxl__psr_cmt_get_l3_monitoring_data(gc, domid, type, socketid,
 +   sample1);
 +if (rc  0) {
 +rc = ERROR_FAIL;
 +goto out;
 +}
 +
 +usleep(1);
 +
 +rc = libxl__psr_cmt_get_l3_monitoring_data(gc, domid, type, socketid,
 +   sample2);
 +if (rc  0) {
 +   rc = ERROR_FAIL;
 +   goto out;
 +}
 +
 +if (sample2 = sample1)

If sample2 == sample1 then bandwidth is zero. Is this expected?

 +break;
 +
 +if (retry_attempts  MBM_SAMPLE_RETRY_MAX) {
 +retry_attempts++;
 +} else {
 +LOGE(ERROR, event counter overflowed);
 +rc = ERROR_FAIL;
 +goto out;
 +}
 +
 +} while(1);

Minor nit, should be while (1).

The rest of this patch looks OK to me.

Wei.

___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel