On 01/22/2015 04:26 AM, Ján Tomko wrote: > Per-cpu stats are only shown for present CPUs in the cgroups, > but we were only parsing the largest CPU number from > /sys/devices/system/cpu/present and looking for stats even for > non-present CPUs. > This resulted in: > internal error: cpuacct parse error > --- > cfg.mk | 2 +- > src/nodeinfo.c | 17 +++++++++++++++++ > src/nodeinfo.h | 1 + > src/util/vircgroup.c | 24 ++++++++++++++++++------ > tests/vircgroupmock.c | 44 ++++++++++++++++++++++++++++++++++++++------ > tests/vircgrouptest.c | 47 +++++++++++++++++++++++++++++++++++------------ > 6 files changed, 110 insertions(+), 25 deletions(-) > > +++ b/tests/vircgroupmock.c > @@ -51,6 +51,8 @@ const char *fakedevicedir1 = FAKEDEVDIR1; > > > # define SYSFS_PREFIX "/not/really/sys/fs/cgroup/" > +# define SYSFS_CPU_PRESENT "/sys/devices/system/cpu/present" > +# define SYSFS_CPU_PRESENT_MOCKED "devices_system_cpu_present" This mock file is not working on RHEL 5: > +++ b/tests/vircgrouptest.c > @@ -538,12 +538,35 @@ static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED) > virCgroupPtr cgroup = NULL; > size_t i; > int rv, ret = -1; > - virTypedParameter params[2]; > + virTypedParameterPtr params = NULL; > +# define EXPECTED_NCPUS 160 > @@ -553,37 +576,37 @@ static int testCgroupGetPercpuStats(const void *args ATTRIBUTE_UNUSED) > goto cleanup; > } > > - if (nodeGetCPUCount() < 1) { > + if (nodeGetCPUCount() != EXPECTED_NCPUS) { On Fedora 21, I see the mocking kicking in during linuxParseCPUmax(): nodeGetCPUCount () at nodeinfo.c:1209 1209 { (gdb) n 1216 char *cpupath = NULL; (gdb) 1219 if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/present")) { (gdb) 1220 ncpu = linuxParseCPUmax(SYSFS_SYSTEM_PATH "/cpu/present"); (gdb) 1237 VIR_FREE(cpupath); (gdb) p ncpu $1 = 160 but in RHEL 5, we aren't mocking the virFileExists() gate, and I see: nodeGetCPUCount () at nodeinfo.c:1209 1209 { (gdb) n 1216 char *cpupath = NULL; (gdb) 1219 if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/present")) { (gdb) 1221 } else if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/cpu0")) { (gdb) 1225 VIR_FREE(cpupath); (gdb) 1224 ncpu++; (gdb) 1225 VIR_FREE(cpupath); (gdb) 1226 if (virAsprintf(&cpupath, "%s/cpu/cpu%d", (gdb) fin Run till exit from #0 nodeGetCPUCount () at nodeinfo.c:1226 0x0804ae19 in testCgroupGetPercpuStats (args=0x0) at vircgrouptest.c:659 659 if (nodeGetCPUCount() != EXPECTED_NCPUS) { Value returned is $1 = 3 I didn't investigate further, but we need to improve the mock code so that virFileExists(SYSFS_SYSTEM_PATH "/cpu/present") works even when run on an older kernel where it is not natively present. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list