Re: [libvirt] [PATCHv2 09/11] util: Extend virresctl API to retrieve multiple monitor statistics

2019-08-06 Thread Wang, Huaqiang
 I'll fix it soon.

> -Original Message-
> From: Marc-André Lureau [mailto:marcandre.lur...@gmail.com]
> Sent: Tuesday, August 6, 2019 6:48 PM
> To: Wang, Huaqiang ; Michal Privoznik
> 
> Cc: libvir-list@redhat.com; Su, Tao 
> Subject: Re: [libvirt] [PATCHv2 09/11] util: Extend virresctl API to retrieve
> multiple monitor statistics
> 
> Hi
> 
> On Tue, Jun 11, 2019 at 7:34 AM Wang Huaqiang
>  wrote:
> >
> > Export virResctrlMonitorGetStats and make
> > virResctrlMonitorGetCacheOccupancy obsoleted.
> >
> > Signed-off-by: Wang Huaqiang 
> > ---
> >  src/libvirt_private.syms |  1 +
> >  src/qemu/qemu_driver.c   | 33 +
> >  src/util/virresctrl.c| 44 +---
> >  src/util/virresctrl.h|  6 ++
> >  4 files changed, 57 insertions(+), 27 deletions(-)
> >
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index
> > 1d949b3..3a4f526 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -2771,6 +2771,7 @@ virResctrlMonitorCreate;
> > virResctrlMonitorDeterminePath;  virResctrlMonitorGetCacheOccupancy;
> >  virResctrlMonitorGetID;
> > +virResctrlMonitorGetStats;
> >  virResctrlMonitorNew;
> >  virResctrlMonitorRemove;
> >  virResctrlMonitorSetAlloc;
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index
> > 6b7d3ea..300a5de 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -19991,6 +19991,7 @@
> > qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr resdata)
> >  /**
> >   * qemuDomainGetResctrlMonData:
> >   * @dom: Pointer for the domain that the resctrl monitors reside in
> > + * @driver: Pointer to qemu driver
> >   * @resdata: Pointer of virQEMUResctrlMonDataPtr pointer for receiving
> the
> >   *virQEMUResctrlMonDataPtr array. Caller is responsible for
> >   *freeing the array.
> > @@ -20008,16 +20009,32 @@
> qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr resdata)
> >   * Returns -1 on failure, or 0 on success.
> >   */
> >  static int
> > -qemuDomainGetResctrlMonData(virDomainObjPtr dom,
> > +qemuDomainGetResctrlMonData(virQEMUDriverPtr driver,
> > +virDomainObjPtr dom,
> >  virQEMUResctrlMonDataPtr **resdata,
> >  size_t *nresdata,
> >  virResctrlMonitorType tag)  {
> >  virDomainResctrlDefPtr resctrl = NULL;
> >  virQEMUResctrlMonDataPtr res = NULL;
> > +char **features = NULL;
> > +virCapsPtr caps = NULL;
> >  size_t i = 0;
> >  size_t j = 0;
> >
> > +caps = virQEMUDriverGetCapabilities(driver, false);
> > +
> > +if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) {
> > +features = caps->host.cache.monitor->features;
> 
> This makes libvirt crash for me, because caps->host.cache.monitor is NULL.
> Any idea?
> 
> thanks
> 
> > +} else {
> > +virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> > +   _("Unsupported resctrl monitor type"));
> > +return -1;
> > +}
> > +
> > +if (virStringListLength((const char * const *)features) == 0)
> > +return 0;
> > +
> >  for (i = 0; i < dom->def->nresctrls; i++) {
> >  resctrl = dom->def->resctrls[i];
> >
> > @@ -20044,9 +20061,8 @@
> qemuDomainGetResctrlMonData(virDomainObjPtr dom,
> >  if (VIR_STRDUP(res->name, virResctrlMonitorGetID(monitor)) < 0)
> >  goto error;
> >
> > -if (virResctrlMonitorGetCacheOccupancy(monitor,
> > -   &res->stats,
> > -   &res->nstats) < 0)
> > +if (virResctrlMonitorGetStats(monitor, (const char **)features,
> > +  &res->stats, &res->nstats)
> > + < 0)
> >  goto error;
> >
> >  if (VIR_APPEND_ELEMENT(*resdata, *nresdata, res) < 0) @@
> > -20063,7 +20079,8 @@
> qemuDomainGetResctrlMonData(virDomainObjPtr dom,
> >
> >
> >  static int
> > -qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
> > +qemuDomainGetStatsCpuCache(virQEMUDriverPtr driver,
> > +   virDomainObjPtr dom,
> > 

Re: [libvirt] [PATCHv2 09/11] util: Extend virresctl API to retrieve multiple monitor statistics

2019-08-06 Thread Marc-André Lureau
Hi

On Tue, Jun 11, 2019 at 7:34 AM Wang Huaqiang  wrote:
>
> Export virResctrlMonitorGetStats and make
> virResctrlMonitorGetCacheOccupancy obsoleted.
>
> Signed-off-by: Wang Huaqiang 
> ---
>  src/libvirt_private.syms |  1 +
>  src/qemu/qemu_driver.c   | 33 +
>  src/util/virresctrl.c| 44 +---
>  src/util/virresctrl.h|  6 ++
>  4 files changed, 57 insertions(+), 27 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 1d949b3..3a4f526 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2771,6 +2771,7 @@ virResctrlMonitorCreate;
>  virResctrlMonitorDeterminePath;
>  virResctrlMonitorGetCacheOccupancy;
>  virResctrlMonitorGetID;
> +virResctrlMonitorGetStats;
>  virResctrlMonitorNew;
>  virResctrlMonitorRemove;
>  virResctrlMonitorSetAlloc;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 6b7d3ea..300a5de 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -19991,6 +19991,7 @@ qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr 
> resdata)
>  /**
>   * qemuDomainGetResctrlMonData:
>   * @dom: Pointer for the domain that the resctrl monitors reside in
> + * @driver: Pointer to qemu driver
>   * @resdata: Pointer of virQEMUResctrlMonDataPtr pointer for receiving the
>   *virQEMUResctrlMonDataPtr array. Caller is responsible for
>   *freeing the array.
> @@ -20008,16 +20009,32 @@ 
> qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr resdata)
>   * Returns -1 on failure, or 0 on success.
>   */
>  static int
> -qemuDomainGetResctrlMonData(virDomainObjPtr dom,
> +qemuDomainGetResctrlMonData(virQEMUDriverPtr driver,
> +virDomainObjPtr dom,
>  virQEMUResctrlMonDataPtr **resdata,
>  size_t *nresdata,
>  virResctrlMonitorType tag)
>  {
>  virDomainResctrlDefPtr resctrl = NULL;
>  virQEMUResctrlMonDataPtr res = NULL;
> +char **features = NULL;
> +virCapsPtr caps = NULL;
>  size_t i = 0;
>  size_t j = 0;
>
> +caps = virQEMUDriverGetCapabilities(driver, false);
> +
> +if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) {
> +features = caps->host.cache.monitor->features;

This makes libvirt crash for me, because caps->host.cache.monitor is
NULL. Any idea?

thanks

> +} else {
> +virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> +   _("Unsupported resctrl monitor type"));
> +return -1;
> +}
> +
> +if (virStringListLength((const char * const *)features) == 0)
> +return 0;
> +
>  for (i = 0; i < dom->def->nresctrls; i++) {
>  resctrl = dom->def->resctrls[i];
>
> @@ -20044,9 +20061,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
>  if (VIR_STRDUP(res->name, virResctrlMonitorGetID(monitor)) < 0)
>  goto error;
>
> -if (virResctrlMonitorGetCacheOccupancy(monitor,
> -   &res->stats,
> -   &res->nstats) < 0)
> +if (virResctrlMonitorGetStats(monitor, (const char **)features,
> +  &res->stats, &res->nstats) < 0)
>  goto error;
>
>  if (VIR_APPEND_ELEMENT(*resdata, *nresdata, res) < 0)
> @@ -20063,7 +20079,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
>
>
>  static int
> -qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
> +qemuDomainGetStatsCpuCache(virQEMUDriverPtr driver,
> +   virDomainObjPtr dom,
> virDomainStatsRecordPtr record,
> int *maxparams)
>  {
> @@ -20077,7 +20094,7 @@ qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
>  if (!virDomainObjIsActive(dom))
>  return 0;
>
> -if (qemuDomainGetResctrlMonData(dom, &resdata, &nresdata,
> +if (qemuDomainGetResctrlMonData(driver, dom, &resdata, &nresdata,
>  VIR_RESCTRL_MONITOR_TYPE_CACHE) < 0)
>  goto cleanup;
>
> @@ -20178,7 +20195,7 @@ qemuDomainGetStatsCpuCgroup(virDomainObjPtr dom,
>
>
>  static int
> -qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
> +qemuDomainGetStatsCpu(virQEMUDriverPtr driver,
>virDomainObjPtr dom,
>virDomainStatsRecordPtr record,
>int *maxparams,
> @@ -20187,7 +20204,7 @@ qemuDomainGetStatsCpu(virQEMUDriverPtr driver 
> ATTRIBUTE_UNUSED,
>  if (qemuDomainGetStatsCpuCgroup(dom, record, maxparams) < 0)
>  return -1;
>
> -if (qemuDomainGetStatsCpuCache(dom, record, maxparams) < 0)
> +if (qemuDomainGetStatsCpuCache(driver, dom, record, maxparams) < 0)
>  return -1;
>
>  return 0;
> diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
> index 0

[libvirt] [PATCHv2 09/11] util: Extend virresctl API to retrieve multiple monitor statistics

2019-06-10 Thread Wang Huaqiang
Export virResctrlMonitorGetStats and make
virResctrlMonitorGetCacheOccupancy obsoleted.

Signed-off-by: Wang Huaqiang 
---
 src/libvirt_private.syms |  1 +
 src/qemu/qemu_driver.c   | 33 +
 src/util/virresctrl.c| 44 +---
 src/util/virresctrl.h|  6 ++
 4 files changed, 57 insertions(+), 27 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1d949b3..3a4f526 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2771,6 +2771,7 @@ virResctrlMonitorCreate;
 virResctrlMonitorDeterminePath;
 virResctrlMonitorGetCacheOccupancy;
 virResctrlMonitorGetID;
+virResctrlMonitorGetStats;
 virResctrlMonitorNew;
 virResctrlMonitorRemove;
 virResctrlMonitorSetAlloc;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6b7d3ea..300a5de 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19991,6 +19991,7 @@ qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr 
resdata)
 /**
  * qemuDomainGetResctrlMonData:
  * @dom: Pointer for the domain that the resctrl monitors reside in
+ * @driver: Pointer to qemu driver
  * @resdata: Pointer of virQEMUResctrlMonDataPtr pointer for receiving the
  *virQEMUResctrlMonDataPtr array. Caller is responsible for
  *freeing the array.
@@ -20008,16 +20009,32 @@ qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr 
resdata)
  * Returns -1 on failure, or 0 on success.
  */
 static int
-qemuDomainGetResctrlMonData(virDomainObjPtr dom,
+qemuDomainGetResctrlMonData(virQEMUDriverPtr driver,
+virDomainObjPtr dom,
 virQEMUResctrlMonDataPtr **resdata,
 size_t *nresdata,
 virResctrlMonitorType tag)
 {
 virDomainResctrlDefPtr resctrl = NULL;
 virQEMUResctrlMonDataPtr res = NULL;
+char **features = NULL;
+virCapsPtr caps = NULL;
 size_t i = 0;
 size_t j = 0;
 
+caps = virQEMUDriverGetCapabilities(driver, false);
+
+if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) {
+features = caps->host.cache.monitor->features;
+} else {
+virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+   _("Unsupported resctrl monitor type"));
+return -1;
+}
+
+if (virStringListLength((const char * const *)features) == 0)
+return 0;
+
 for (i = 0; i < dom->def->nresctrls; i++) {
 resctrl = dom->def->resctrls[i];
 
@@ -20044,9 +20061,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
 if (VIR_STRDUP(res->name, virResctrlMonitorGetID(monitor)) < 0)
 goto error;
 
-if (virResctrlMonitorGetCacheOccupancy(monitor,
-   &res->stats,
-   &res->nstats) < 0)
+if (virResctrlMonitorGetStats(monitor, (const char **)features,
+  &res->stats, &res->nstats) < 0)
 goto error;
 
 if (VIR_APPEND_ELEMENT(*resdata, *nresdata, res) < 0)
@@ -20063,7 +20079,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
 
 
 static int
-qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
+qemuDomainGetStatsCpuCache(virQEMUDriverPtr driver,
+   virDomainObjPtr dom,
virDomainStatsRecordPtr record,
int *maxparams)
 {
@@ -20077,7 +20094,7 @@ qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
 if (!virDomainObjIsActive(dom))
 return 0;
 
-if (qemuDomainGetResctrlMonData(dom, &resdata, &nresdata,
+if (qemuDomainGetResctrlMonData(driver, dom, &resdata, &nresdata,
 VIR_RESCTRL_MONITOR_TYPE_CACHE) < 0)
 goto cleanup;
 
@@ -20178,7 +20195,7 @@ qemuDomainGetStatsCpuCgroup(virDomainObjPtr dom,
 
 
 static int
-qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
+qemuDomainGetStatsCpu(virQEMUDriverPtr driver,
   virDomainObjPtr dom,
   virDomainStatsRecordPtr record,
   int *maxparams,
@@ -20187,7 +20204,7 @@ qemuDomainGetStatsCpu(virQEMUDriverPtr driver 
ATTRIBUTE_UNUSED,
 if (qemuDomainGetStatsCpuCgroup(dom, record, maxparams) < 0)
 return -1;
 
-if (qemuDomainGetStatsCpuCache(dom, record, maxparams) < 0)
+if (qemuDomainGetStatsCpuCache(driver, dom, record, maxparams) < 0)
 return -1;
 
 return 0;
diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index 0117b8f..80acb70 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -2669,8 +2669,7 @@ virResctrlMonitorStatsSorter(const void *a,
  * virResctrlMonitorGetStats
  *
  * @monitor: The monitor that the statistic data will be retrieved from.
- * @resource: The name for resource name. 'llc_occupancy' for cache resource.
- * "mbm_total_bytes" and "mbm_local_bytes"