On Thu, Jan 27, 2022 at 15:25:22 +0800, huangy81@xxxxxxxxxxxxxxx wrote: > From: Hyman Huang(黄勇) <huangy81@xxxxxxxxxxxxxxx> > > Add calc_mode for dirtyrate statistics retured by > virsh domstats --dirtyrate api, also add vcpu dirtyrate > if dirty-ring mode was used in last measurement. > > Signed-off-by: Hyman Huang(黄勇) <huangy81@xxxxxxxxxxxxxxx> > --- > src/libvirt-domain.c | 5 +++++ > src/qemu/qemu_driver.c | 14 ++++++++++++ > src/qemu/qemu_monitor.h | 10 +++++++++ > src/qemu/qemu_monitor_json.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 81 insertions(+) > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c > index 4caa740..b1b6707 100644 > --- a/src/libvirt-domain.c > +++ b/src/libvirt-domain.c > @@ -11941,6 +11941,11 @@ virConnectGetDomainCapabilities(virConnectPtr conn, > * "dirtyrate.megabytes_per_second" - the calculated memory dirty rate in > * MiB/s as long long. It is produced > * only if the calc_status is measured. > + * "dirtyrate.calc_mode" - the calculation mode used last measurement as int, > + * which is one of qemuMonitorDirtyRateCalcMode enum. 'qemuMonitorDirtyRateCalcMode' is an internal qemu-private enum. You can't use it in the public API as the appropriate constants are not exported and also we are free to change meanings of internal constants. > + * "dirtyrate.vcpu.<num>.megabytes_per_second" - the calculated memory dirty > + * rate for a virtual cpu as > + * long long. A signed value doesn't really seem make too much sense to a value which can't be negative. > * > * Note that entire stats groups or individual stat fields may be missing from > * the output in case they are not supported by the given hypervisor, are not > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index feebfc4..09eda6b 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -18537,6 +18537,20 @@ qemuDomainGetStatsDirtyRate(virQEMUDriver *driver, > "dirtyrate.megabytes_per_second") < 0) > return -1; > > + if (virTypedParamListAddInt(params, info.mode, > + "dirtyrate.calc_mode") < 0) > + return -1; > + > + if (info.mode == VIR_DOMAIN_DIRTYRATE_CALC_MODE_DIRTY_RING) { > + int i; > + for (i = 0; i < info.nvcpus; i++) { > + if (virTypedParamListAddLLong(params, info.rates[i].value, > + "dirtyrate.vcpu.%d.megabytes_per_second", > + info.rates[i].index) < 0) Please align it properly even if it exceeds 80 colums. > + return -1; > + } > + } > + > return 0; > } [...]