mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
qemu: Provide virDomainGetCPUStats() implementation for session connection
We have virDomainGetCPUStats() API which offers querying statistics on host CPU usage by given guest. And it works in two modes: getting overall stats (@start_cpu == -1, @ncpus == 1) or getting per host CPU usage. For the QEMU driver it is implemented by looking into values stored in corresponding cpuacct CGroup controller. Well, this works for system instances, where libvirt has permissions to create CGroups and place QEMU process into them. But it does not fly for session connection, where no CGroups are set up. Fortunately, we can do something similar to v8.8.0-rc1~95 and use virProcessGetStatInfo() to fill the overall stats. Unfortunately, I haven't found any source of per host CPU usage, so we just continue throwing an error in that case. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
818c9717c5
commit
8865c42771
@ -16009,6 +16009,50 @@ qemuDomainGetMetadata(virDomainPtr dom,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define QEMU_CPU_STATS_PROC_TOTAL 3
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainGetCPUStatsProc(virDomainObj *vm,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
unsigned int nparams)
|
||||||
|
{
|
||||||
|
unsigned long long cpuTime = 0;
|
||||||
|
unsigned long long userTime = 0;
|
||||||
|
unsigned long long sysTime = 0;
|
||||||
|
|
||||||
|
if (nparams == 0) {
|
||||||
|
/* return supported number of params */
|
||||||
|
return QEMU_CPU_STATS_PROC_TOTAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virProcessGetStatInfo(&cpuTime, &userTime, &sysTime,
|
||||||
|
NULL, NULL, vm->pid, 0) < 0) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
||||||
|
_("cannot read cputime for domain"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_CPU_STATS_CPUTIME,
|
||||||
|
VIR_TYPED_PARAM_ULLONG, cpuTime) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (nparams > 1 &&
|
||||||
|
virTypedParameterAssign(¶ms[1], VIR_DOMAIN_CPU_STATS_USERTIME,
|
||||||
|
VIR_TYPED_PARAM_ULLONG, userTime) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (nparams > 2 &&
|
||||||
|
virTypedParameterAssign(¶ms[2], VIR_DOMAIN_CPU_STATS_SYSTEMTIME,
|
||||||
|
VIR_TYPED_PARAM_ULLONG, sysTime) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (nparams > 3)
|
||||||
|
nparams = 3;
|
||||||
|
|
||||||
|
return nparams;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef QEMU_CPU_STATS_PROC_TOTAL
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuDomainGetCPUStats(virDomainPtr domain,
|
qemuDomainGetCPUStats(virDomainPtr domain,
|
||||||
@ -16037,8 +16081,12 @@ qemuDomainGetCPUStats(virDomainPtr domain,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUACCT)) {
|
if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUACCT)) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
if (start_cpu == -1) {
|
||||||
"%s", _("cgroup CPUACCT controller is not mounted"));
|
ret = qemuDomainGetCPUStatsProc(vm, params, nparams);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("cgroup CPUACCT controller is not mounted"));
|
||||||
|
}
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user