diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 87668f2b9a..20936994ce 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -2260,6 +2260,10 @@ When selecting the *--state* group the following fields are returned: * ``cpu.time`` - total cpu time spent for this domain in nanoseconds * ``cpu.user`` - user cpu time spent in nanoseconds * ``cpu.system`` - system cpu time spent in nanoseconds +* ``cpu.haltpoll.success.time`` - cpu halt polling success time spent in + nanoseconds +* ``cpu.haltpoll.fail.time`` - cpu halt polling fail time spent in + nanoseconds * ``cpu.cache.monitor.count`` - the number of cache monitors for this domain * ``cpu.cache.monitor..name`` - the name of cache monitor diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 35c0df0ebc..4eb14d4176 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -11625,6 +11625,13 @@ virConnectGetDomainCapabilities(virConnectPtr conn, * "cpu.user" - user cpu time spent in nanoseconds as unsigned long long. * "cpu.system" - system cpu time spent in nanoseconds as unsigned long * long. + * "cpu.haltpoll.success.time" - halt-polling cpu usage about the VCPU polled + * until a virtual interrupt was delivered in + * nanoseconds as unsigned long long. + * "cpu.haltpoll.fail.time" - halt-polling cpu usage about the VCPU had to schedule + * out (either because the maximum poll time was reached + * or it needed to yield the CPU) in nanoseconds as + * unsigned long long. * "cpu.cache.monitor.count" - the number of cache monitors for this domain * "cpu.cache.monitor..name" - the name of cache monitor * "cpu.cache.monitor..vcpus" - vcpu list of cache monitor diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a2663283ba..0b35bbc15c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -17857,6 +17857,23 @@ qemuDomainGetStatsCpuCgroup(virDomainObj *dom, return 0; } +static int +qemuDomainGetStatsCpuHaltPollTime(virDomainObj *dom, + virTypedParamList *params) +{ + unsigned long long haltPollSuccess = 0; + unsigned long long haltPollFail = 0; + pid_t pid = dom->pid; + + if (virHostCPUGetHaltPollTime(pid, &haltPollSuccess, &haltPollFail) < 0) + return 0; + + if (virTypedParamListAddULLong(params, haltPollSuccess, "cpu.haltpoll.success.time") < 0 || + virTypedParamListAddULLong(params, haltPollFail, "cpu.haltpoll.fail.time") < 0) + return -1; + + return 0; +} static int qemuDomainGetStatsCpu(virQEMUDriver *driver, @@ -17870,6 +17887,9 @@ qemuDomainGetStatsCpu(virQEMUDriver *driver, if (qemuDomainGetStatsCpuCache(driver, dom, params) < 0) return -1; + if (qemuDomainGetStatsCpuHaltPollTime(dom, params) < 0) + return -1; + return 0; }