cgroup: Prepare for sparse vCPU topologies in virCgroupGetPercpuStats

Pass a bitmap of enabled guest vCPUs to virCgroupGetPercpuStats so that
non-continuous vCPU topologies can be used.
This commit is contained in:
Peter Krempa 2015-12-14 15:10:22 +01:00
parent e84ab7938d
commit 7938b533d5
5 changed files with 19 additions and 12 deletions

View File

@ -5706,7 +5706,7 @@ lxcDomainGetCPUStats(virDomainPtr dom,
params, nparams); params, nparams);
else else
ret = virCgroupGetPercpuStats(priv->cgroup, params, ret = virCgroupGetPercpuStats(priv->cgroup, params,
nparams, start_cpu, ncpus, 0); nparams, start_cpu, ncpus, NULL);
cleanup: cleanup:
virObjectUnlock(vm); virObjectUnlock(vm);
return ret; return ret;

View File

@ -18207,6 +18207,7 @@ qemuDomainGetCPUStats(virDomainPtr domain,
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
int ret = -1; int ret = -1;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virBitmapPtr guestvcpus = NULL;
virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1); virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1);
@ -18230,13 +18231,18 @@ qemuDomainGetCPUStats(virDomainPtr domain,
goto cleanup; goto cleanup;
} }
if (qemuDomainHasVcpuPids(vm) &&
!(guestvcpus = virDomainDefGetOnlineVcpumap(vm->def)))
goto cleanup;
if (start_cpu == -1) if (start_cpu == -1)
ret = virCgroupGetDomainTotalCpuStats(priv->cgroup, ret = virCgroupGetDomainTotalCpuStats(priv->cgroup,
params, nparams); params, nparams);
else else
ret = virCgroupGetPercpuStats(priv->cgroup, params, nparams, ret = virCgroupGetPercpuStats(priv->cgroup, params, nparams,
start_cpu, ncpus, priv->nvcpupids); start_cpu, ncpus, guestvcpus);
cleanup: cleanup:
virBitmapFree(guestvcpus);
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
return ret; return ret;
} }

View File

@ -3161,17 +3161,17 @@ virCgroupDenyDevicePath(virCgroupPtr group, const char *path, int perms)
*/ */
static int static int
virCgroupGetPercpuVcpuSum(virCgroupPtr group, virCgroupGetPercpuVcpuSum(virCgroupPtr group,
unsigned int nvcpupids, virBitmapPtr guestvcpus,
unsigned long long *sum_cpu_time, unsigned long long *sum_cpu_time,
size_t nsum, size_t nsum,
virBitmapPtr cpumap) virBitmapPtr cpumap)
{ {
int ret = -1; int ret = -1;
size_t i; ssize_t i = -1;
char *buf = NULL; char *buf = NULL;
virCgroupPtr group_vcpu = NULL; virCgroupPtr group_vcpu = NULL;
for (i = 0; i < nvcpupids; i++) { while ((i = virBitmapNextSetBit(guestvcpus, i)) >= 0) {
char *pos; char *pos;
unsigned long long tmp; unsigned long long tmp;
ssize_t j; ssize_t j;
@ -3233,7 +3233,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
unsigned int nparams, unsigned int nparams,
int start_cpu, int start_cpu,
unsigned int ncpus, unsigned int ncpus,
unsigned int nvcpupids) virBitmapPtr guestvcpus)
{ {
int ret = -1; int ret = -1;
size_t i; size_t i;
@ -3248,7 +3248,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
/* return the number of supported params */ /* return the number of supported params */
if (nparams == 0 && ncpus != 0) { if (nparams == 0 && ncpus != 0) {
if (nvcpupids == 0) if (!guestvcpus)
return CGROUP_NB_PER_CPU_STAT_PARAM; return CGROUP_NB_PER_CPU_STAT_PARAM;
else else
return CGROUP_NB_PER_CPU_STAT_PARAM + 1; return CGROUP_NB_PER_CPU_STAT_PARAM + 1;
@ -3303,11 +3303,11 @@ virCgroupGetPercpuStats(virCgroupPtr group,
/* return percpu vcputime in index 1 */ /* return percpu vcputime in index 1 */
param_idx = 1; param_idx = 1;
if (nvcpupids > 0 && param_idx < nparams) { if (guestvcpus && param_idx < nparams) {
if (VIR_ALLOC_N(sum_cpu_time, need_cpus) < 0) if (VIR_ALLOC_N(sum_cpu_time, need_cpus) < 0)
goto cleanup; goto cleanup;
if (virCgroupGetPercpuVcpuSum(group, nvcpupids, sum_cpu_time, need_cpus, if (virCgroupGetPercpuVcpuSum(group, guestvcpus, sum_cpu_time,
cpumap) < 0) need_cpus, cpumap) < 0)
goto cleanup; goto cleanup;
for (i = start_cpu; i < need_cpus; i++) { for (i = start_cpu; i < need_cpus; i++) {

View File

@ -26,6 +26,7 @@
# define __VIR_CGROUP_H__ # define __VIR_CGROUP_H__
# include "virutil.h" # include "virutil.h"
# include "virbitmap.h"
struct virCgroup; struct virCgroup;
typedef struct virCgroup *virCgroupPtr; typedef struct virCgroup *virCgroupPtr;
@ -246,7 +247,7 @@ virCgroupGetPercpuStats(virCgroupPtr group,
unsigned int nparams, unsigned int nparams,
int start_cpu, int start_cpu,
unsigned int ncpus, unsigned int ncpus,
unsigned int nvcpupids); virBitmapPtr guestvcpus);
int int
virCgroupGetDomainTotalCpuStats(virCgroupPtr group, virCgroupGetDomainTotalCpuStats(virCgroupPtr group,

View File

@ -656,7 +656,7 @@ static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED)
if ((rv = virCgroupGetPercpuStats(cgroup, if ((rv = virCgroupGetPercpuStats(cgroup,
params, params,
1, 0, EXPECTED_NCPUS, 0)) < 0) { 1, 0, EXPECTED_NCPUS, NULL)) < 0) {
fprintf(stderr, "Failed call to virCgroupGetPercpuStats for /virtualmachines cgroup: %d\n", -rv); fprintf(stderr, "Failed call to virCgroupGetPercpuStats for /virtualmachines cgroup: %d\n", -rv);
goto cleanup; goto cleanup;
} }