[libvirt] [PATCH v5 3/3] qemu: return balloon statistics when all domain statistics reported

John Ferlan jferlan at redhat.com
Tue Jun 21 13:47:54 UTC 2016



On 06/16/2016 02:38 PM, Maxim Nestratov wrote:
> From: Derbyshev Dmitry <dderbyshev at virtuozzo.com>
> 
> To collect all balloon statistics for all guests it was necessary to make
> several libvirt requests. Now it's possible to get all balloon statiscs via
> single connectGetAllDomainStats call.
> 
> Signed-off-by: Derbyshev Dmitry <dderbyshev at virtuozzo.com>
> Signed-off-by: Maxim Nestratov <mnestratov at virtuozzo.com>
> ---
>  src/qemu/qemu_driver.c | 95 +++++++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 74 insertions(+), 21 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 2885936..675ac5a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11073,32 +11073,23 @@ qemuDomainGetInterfaceParameters(virDomainPtr dom,
>      return ret;
>  }
>  
> +/* This functions assumes that job  QEMU_JOB_QUERY is started by a caller */
                                     ^
Extra space
> +
>  static int
> -qemuDomainMemoryStats(virDomainPtr dom,
> -                      virDomainMemoryStatPtr stats,
> -                      unsigned int nr_stats,
> -                      unsigned int flags)
> +qemuDomainMemoryStatsInternal(virQEMUDriverPtr driver,
> +                              virDomainObjPtr vm,
> +                              virDomainMemoryStatPtr stats,
> +                              unsigned int nr_stats)
> +
>  {
> -    virQEMUDriverPtr driver = dom->conn->privateData;
> -    virDomainObjPtr vm;
>      int ret = -1;
> +    qemuDomainObjPrivatePtr priv;

This fails to compile as 'priv' isn't used.

>      long rss;
>  
> -    virCheckFlags(0, -1);
> -
> -    if (!(vm = qemuDomObjFromDomain(dom)))
> -        goto cleanup;
> -
> -    if (virDomainMemoryStatsEnsureACL(dom->conn, vm->def) < 0)
> -        goto cleanup;
> -
> -    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> -        goto cleanup;
> -
>      if (!virDomainObjIsActive(vm)) {
>          virReportError(VIR_ERR_OPERATION_INVALID,
>                         "%s", _("domain is not running"));
> -        goto endjob;
> +        goto cleanup;

No need to cleanup, just return -1

>      }
>  
>      if (vm->def->memballoon &&
> @@ -11109,7 +11100,7 @@ qemuDomainMemoryStats(virDomainPtr dom,
>              ret = -1;
>  
>          if (ret < 0 || ret >= nr_stats)
> -            goto endjob;
> +            goto cleanup;

Likewise, return ret

>      } else {
>          ret = 0;
>      }
> @@ -11123,7 +11114,33 @@ qemuDomainMemoryStats(virDomainPtr dom,
>          ret++;
>      }
>  
> - endjob:
> + cleanup:
> +    return ret;

Rendering cleanup: unnecessary

> +}
> +
> +static int
> +qemuDomainMemoryStats(virDomainPtr dom,
> +                      virDomainMemoryStatPtr stats,
> +                      unsigned int nr_stats,
> +                      unsigned int flags)
> +{
> +    virQEMUDriverPtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm;
> +    int ret = -1;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (!(vm = qemuDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (virDomainMemoryStatsEnsureACL(dom->conn, vm->def) < 0)
> +        goto cleanup;
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> +        goto cleanup;
> +
> +    ret = qemuDomainMemoryStatsInternal(driver, vm, stats, nr_stats);
> +
>      qemuDomainObjEndJob(driver, vm);
>  
>   cleanup:
> @@ -18608,15 +18625,29 @@ qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>      return 0;
>  }
>  
> +
> +#define STORE_MEM_RECORD(TAG, NAME) {                  \
> +    if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ ##TAG) \
> +        if (virTypedParamsAddULLong(&record->params,   \
> +                                    &record->nparams,  \
> +                                    maxparams,         \
> +                                    "balloon." NAME,   \
> +                                    stats[i].val) < 0) \
> +            return -1;                                 \
> +}
> +

All of the rest feels like a separate patch...

If I understand correctly this is for 'domstats' to display, correct?
If so, then virsh.pod could use an update.

>  static int
>  qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,

This is now used too.

>                            virDomainObjPtr dom,
>                            virDomainStatsRecordPtr record,
>                            int *maxparams,
> -                          unsigned int privflags ATTRIBUTE_UNUSED)
> +                          unsigned int privflags)
>  {
>      qemuDomainObjPrivatePtr priv = dom->privateData;
> +    virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR];
> +    int nr_stats;
>      unsigned long long cur_balloon = 0;
> +    size_t i;
>      int err = 0;
>  
>      if (!virDomainDefHasMemballoon(dom->def)) {
> @@ -18641,8 +18672,30 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>                                  virDomainDefGetMemoryActual(dom->def)) < 0)
>          return -1;
>  

In order to get "balloon.current" 'err' must be 0, so what would allow
any of the following to be collected if err == -1?

> +    if (!HAVE_JOB(privflags))
> +        return 0;
> +
> +    nr_stats = qemuDomainMemoryStatsInternal(driver, dom, stats,
> +                                             VIR_DOMAIN_MEMORY_STAT_NR);

'driver' is now no longer unused it seems...

> +    if (nr_stats < 0)
> +        return 0;
> +
> +    for (i = 0; i < nr_stats; i++) {
> +        STORE_MEM_RECORD(SWAP_IN, "swap_in")
> +        STORE_MEM_RECORD(SWAP_OUT, "swap_out")
> +        STORE_MEM_RECORD(MAJOR_FAULT, "major_fault")
> +        STORE_MEM_RECORD(MINOR_FAULT, "minor_fault")
> +        STORE_MEM_RECORD(UNUSED, "unused")
> +        STORE_MEM_RECORD(AVAILABLE, "available")
> +        STORE_MEM_RECORD(ACTUAL_BALLOON, "actual")

Doesn't this ^ replicate "balloon.current"


John

> +        STORE_MEM_RECORD(RSS, "rss")
> +        STORE_MEM_RECORD(LAST_UPDATE, "last-update")
> +        STORE_MEM_RECORD(USABLE, "usable")
> +    }
> +
>      return 0;
>  }
> +#undef STORE_MEM_RECORD
>  
>  
>  static int
> 




More information about the libvir-list mailing list