[libvirt] [PATCH v7 5/7] qemu: return balloon statistics when all domain statistics reported
Pavel Hrdina
phrdina at redhat.com
Wed Jul 27 10:54:25 UTC 2016
On Wed, Jul 13, 2016 at 01:42:16PM +0300, Derbyshev Dmitriy 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>
> ---
> src/qemu/qemu_driver.c | 39 +++++++++++++++++++++++++++++++++++++--
> tools/virsh.pod | 12 +++++++++++-
> 2 files changed, 48 insertions(+), 3 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 6fa8d01..70f3faa 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -18511,15 +18511,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; \
> +}
This isn't a correct way how to write a MACRO. For starters, the syntax isn't
the same as for functions. If you need to ensure that it is a separate block
the correct way is to do something like this:
#define MACRO() \
do { \
#body of the macro \
} while (0)
But in this case it's not required to use the do-while construct.
Next point to this MACRO is that it uses other variables not passed as
parameters. It's OK to do that but only inside a function and right before its
usage and also you should #undef it right away. For example:
#define MACRO()
MACRO()
MACRO()
MACRO()
#undef MACRO
> +
> static int
> -qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
> +qemuDomainGetStatsBalloon(virQEMUDriverPtr driver,
> 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)) {
> @@ -18544,8 +18558,29 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
> virDomainDefGetMemoryTotal(dom->def)) < 0)
> return -1;
>
> + if (err || !HAVE_JOB(privflags))
> + return 0;
There is no need to check the *err* variable, it's used only to indicate whether
the "balloon.current" should be reported or not. I would change the condition
to this:
if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom))
return 0;
> +
> + nr_stats = qemuDomainMemoryStatsInternal(driver, dom, stats,
> + VIR_DOMAIN_MEMORY_STAT_NR);
> + 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(RSS, "rss")
> + STORE_MEM_RECORD(LAST_UPDATE, "last-update")
> + STORE_MEM_RECORD(USABLE, "usable")
> + }
> +
> return 0;
> }
> +#undef STORE_MEM_RECORD
>
>
> static int
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 6af94d1..cda1874 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -899,7 +899,17 @@ I<--cpu-total> returns:
>
> I<--balloon> returns:
> "balloon.current" - the memory in kiB currently used,
> -"balloon.maximum" - the maximum memory in kiB allowed
> +"balloon.maximum" - the maximum memory in kiB allowed,
> +"balloon.swap_in" - the amount of data read from swap space (in kB),
> +"balloon.swap_out" - the amount of memory written out to swap space (in kB),
> +"balloon.major_fault" - the number of page faults then disk IO was required,
> +"balloon.minor_fault" - the number of other page faults,
> +"balloon.unused" - the amount of memory left unused by the system (in kB),
> +"balloon.available" - the amount of usable memory as seen by the domain (in kB),
> +"balloon.rss" - Resident Set Size of running domain's process (in kB),
> +"balloon.usable" - the amount of memory which can be reclaimed by balloon
> +without causing host swapping (in KB),
> +"balloon.last-update" - timestamp of the last update of statistics (in seconds),
>
> I<--vcpu> returns:
> "vcpu.current" - current number of online virtual CPUs,
> --
> 1.9.5.msysgit.0
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
More information about the libvir-list
mailing list