From: Derbyshev Dmitry <dderbyshev@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx> --- 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 0b76177..96343d8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18515,15 +18515,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; \ +} + 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)) { @@ -18548,8 +18562,29 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, virDomainDefGetMemoryTotal(dom->def)) < 0) return -1; + if (err || !HAVE_JOB(privflags)) + 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 881ab76..1d33e6f 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -893,7 +893,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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list