Make qemuGetDomainTotalCPUStats a virCgroup function.

To reuse this from other drivers, like lxc.
This commit is contained in:
Thorsten Behrens 2014-02-14 18:49:01 +01:00 committed by Michal Privoznik
parent 192604ddee
commit 65158899b7
4 changed files with 61 additions and 52 deletions

View File

@ -1025,6 +1025,7 @@ virCgroupGetCpuCfsQuota;
virCgroupGetCpusetCpus; virCgroupGetCpusetCpus;
virCgroupGetCpusetMems; virCgroupGetCpusetMems;
virCgroupGetCpuShares; virCgroupGetCpuShares;
virCgroupGetDomainTotalCpuStats;
virCgroupGetFreezerState; virCgroupGetFreezerState;
virCgroupGetMemoryHardLimit; virCgroupGetMemoryHardLimit;
virCgroupGetMemorySoftLimit; virCgroupGetMemorySoftLimit;

View File

@ -106,7 +106,6 @@
#define QEMU_NB_NUMA_PARAM 2 #define QEMU_NB_NUMA_PARAM 2
#define QEMU_NB_TOTAL_CPU_STAT_PARAM 3
#define QEMU_NB_PER_CPU_STAT_PARAM 2 #define QEMU_NB_PER_CPU_STAT_PARAM 2
#define QEMU_SCHED_MIN_PERIOD 1000LL #define QEMU_SCHED_MIN_PERIOD 1000LL
@ -15903,56 +15902,6 @@ cleanup:
return ret; return ret;
} }
/* qemuDomainGetCPUStats() with start_cpu == -1 */
static int
qemuDomainGetTotalcpuStats(virDomainObjPtr vm,
virTypedParameterPtr params,
int nparams)
{
unsigned long long cpu_time;
int ret;
qemuDomainObjPrivatePtr priv = vm->privateData;
if (nparams == 0) /* return supported number of params */
return QEMU_NB_TOTAL_CPU_STAT_PARAM;
/* entry 0 is cputime */
ret = virCgroupGetCpuacctUsage(priv->cgroup, &cpu_time);
if (ret < 0) {
virReportSystemError(-ret, "%s", _("unable to get cpu account"));
return -1;
}
if (virTypedParameterAssign(&params[0], VIR_DOMAIN_CPU_STATS_CPUTIME,
VIR_TYPED_PARAM_ULLONG, cpu_time) < 0)
return -1;
if (nparams > 1) {
unsigned long long user;
unsigned long long sys;
ret = virCgroupGetCpuacctStat(priv->cgroup, &user, &sys);
if (ret < 0) {
virReportSystemError(-ret, "%s", _("unable to get cpu account"));
return -1;
}
if (virTypedParameterAssign(&params[1],
VIR_DOMAIN_CPU_STATS_USERTIME,
VIR_TYPED_PARAM_ULLONG, user) < 0)
return -1;
if (nparams > 2 &&
virTypedParameterAssign(&params[2],
VIR_DOMAIN_CPU_STATS_SYSTEMTIME,
VIR_TYPED_PARAM_ULLONG, sys) < 0)
return -1;
if (nparams > QEMU_NB_TOTAL_CPU_STAT_PARAM)
nparams = QEMU_NB_TOTAL_CPU_STAT_PARAM;
}
return nparams;
}
/* This function gets the sums of cpu time consumed by all vcpus. /* This function gets the sums of cpu time consumed by all vcpus.
* For example, if there are 4 physical cpus, and 2 vcpus in a domain, * For example, if there are 4 physical cpus, and 2 vcpus in a domain,
* then for each vcpu, the cpuacct.usage_percpu looks like this: * then for each vcpu, the cpuacct.usage_percpu looks like this:
@ -16150,7 +16099,8 @@ qemuDomainGetCPUStats(virDomainPtr domain,
} }
if (start_cpu == -1) if (start_cpu == -1)
ret = qemuDomainGetTotalcpuStats(vm, params, nparams); ret = virCgroupGetDomainTotalCpuStats(priv->cgroup,
params, nparams);
else else
ret = qemuDomainGetPercpuStats(vm, params, nparams, ret = qemuDomainGetPercpuStats(vm, params, nparams,
start_cpu, ncpus); start_cpu, ncpus);

View File

@ -51,11 +51,14 @@
#include "virhashcode.h" #include "virhashcode.h"
#include "virstring.h" #include "virstring.h"
#include "virsystemd.h" #include "virsystemd.h"
#include "virtypedparam.h"
#define CGROUP_MAX_VAL 512 #define CGROUP_MAX_VAL 512
#define VIR_FROM_THIS VIR_FROM_CGROUP #define VIR_FROM_THIS VIR_FROM_CGROUP
#define CGROUP_NB_TOTAL_CPU_STAT_PARAM 3
#if defined(__linux__) && defined(HAVE_GETMNTENT_R) && \ #if defined(__linux__) && defined(HAVE_GETMNTENT_R) && \
defined(_DIRENT_HAVE_D_TYPE) && defined(_SC_CLK_TCK) defined(_DIRENT_HAVE_D_TYPE) && defined(_SC_CLK_TCK)
# define VIR_CGROUP_SUPPORTED # define VIR_CGROUP_SUPPORTED
@ -2821,6 +2824,56 @@ virCgroupDenyDevicePath(virCgroupPtr group, const char *path, int perms)
} }
int
virCgroupGetDomainTotalCpuStats(virCgroupPtr group,
virTypedParameterPtr params,
int nparams)
{
unsigned long long cpu_time;
int ret;
if (nparams == 0) /* return supported number of params */
return CGROUP_NB_TOTAL_CPU_STAT_PARAM;
/* entry 0 is cputime */
ret = virCgroupGetCpuacctUsage(group, &cpu_time);
if (ret < 0) {
virReportSystemError(-ret, "%s", _("unable to get cpu account"));
return -1;
}
if (virTypedParameterAssign(&params[0], VIR_DOMAIN_CPU_STATS_CPUTIME,
VIR_TYPED_PARAM_ULLONG, cpu_time) < 0)
return -1;
if (nparams > 1) {
unsigned long long user;
unsigned long long sys;
ret = virCgroupGetCpuacctStat(group, &user, &sys);
if (ret < 0) {
virReportSystemError(-ret, "%s", _("unable to get cpu account"));
return -1;
}
if (virTypedParameterAssign(&params[1],
VIR_DOMAIN_CPU_STATS_USERTIME,
VIR_TYPED_PARAM_ULLONG, user) < 0)
return -1;
if (nparams > 2 &&
virTypedParameterAssign(&params[2],
VIR_DOMAIN_CPU_STATS_SYSTEMTIME,
VIR_TYPED_PARAM_ULLONG, sys) < 0)
return -1;
if (nparams > CGROUP_NB_TOTAL_CPU_STAT_PARAM)
nparams = CGROUP_NB_TOTAL_CPU_STAT_PARAM;
}
return nparams;
}
int int
virCgroupSetCpuShares(virCgroupPtr group, unsigned long long shares) virCgroupSetCpuShares(virCgroupPtr group, unsigned long long shares)
{ {

View File

@ -201,6 +201,11 @@ int virCgroupDenyDevicePath(virCgroupPtr group,
const char *path, const char *path,
int perms); int perms);
int
virCgroupGetDomainTotalCpuStats(virCgroupPtr group,
virTypedParameterPtr params,
int nparams);
int virCgroupSetCpuShares(virCgroupPtr group, unsigned long long shares); int virCgroupSetCpuShares(virCgroupPtr group, unsigned long long shares);
int virCgroupGetCpuShares(virCgroupPtr group, unsigned long long *shares); int virCgroupGetCpuShares(virCgroupPtr group, unsigned long long *shares);