Check if cpu stats are read correctly from a sample
/proc/stat collected from a 24 CPU machine.
---
src/libvirt_linux.syms | 1 +
src/nodeinfo.c | 6 +-
tests/nodeinfodata/linux-cpustat-24cpu.out | 150 ++++++++++++++++++++++++++++
tests/nodeinfodata/linux-cpustat-24cpu.stat | 25 +++++
tests/nodeinfotest.c | 131 ++++++++++++++++++++++++
5 files changed, 312 insertions(+), 1 deletion(-)
create mode 100644 tests/nodeinfodata/linux-cpustat-24cpu.out
create mode 100644 tests/nodeinfodata/linux-cpustat-24cpu.stat
diff --git a/src/libvirt_linux.syms b/src/libvirt_linux.syms
index 3500898..b3b2384 100644
--- a/src/libvirt_linux.syms
+++ b/src/libvirt_linux.syms
@@ -3,6 +3,7 @@
#
# nodeinfo.h
+linuxNodeGetCPUStats;
linuxNodeInfoCPUPopulate;
# util/virstatslinux.h
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index cba2fc1..9c236cd 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -193,6 +193,10 @@ freebsdNodeGetMemoryStats(virNodeMemoryStatsPtr params,
int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
const char *sysfs_dir,
virNodeInfoPtr nodeinfo);
+int linuxNodeGetCPUStats(FILE *procstat,
+ int cpuNum,
+ virNodeCPUStatsPtr params,
+ int *nparams);
/* Return the positive decimal contents of the given
* DIR/cpu%u/FILE, or -1 on error. If DEFAULT_VALUE is non-negative
@@ -681,7 +685,7 @@ cleanup:
# define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
-static int
+int
linuxNodeGetCPUStats(FILE *procstat,
int cpuNum,
virNodeCPUStatsPtr params,
diff --git a/tests/nodeinfodata/linux-cpustat-24cpu.out
b/tests/nodeinfodata/linux-cpustat-24cpu.out
new file mode 100644
index 0000000..0a1a5bc
--- /dev/null
+++ b/tests/nodeinfodata/linux-cpustat-24cpu.out
@@ -0,0 +1,150 @@
+cpu:
+kernel: 8751170
+user: 14128079
+idle: 1816344522
+iowait: 81323
+
+cpu0:
+kernel: 447603
+user: 749021
+idle: 75399242
+iowait: 5295
+
+cpu1:
+kernel: 167215
+user: 337326
+idle: 76178612
+iowait: 1121
+
+cpu2:
+kernel: 308930
+user: 666889
+idle: 75649696
+iowait: 4298
+
+cpu3:
+kernel: 227674
+user: 328464
+idle: 76131634
+iowait: 1219
+
+cpu4:
+kernel: 299514
+user: 583915
+idle: 75746383
+iowait: 3997
+
+cpu5:
+kernel: 112287
+user: 231867
+idle: 76336319
+iowait: 798
+
+cpu6:
+kernel: 546590
+user: 896252
+idle: 75132665
+iowait: 7210
+
+cpu7:
+kernel: 177715
+user: 342337
+idle: 76154889
+iowait: 1933
+
+cpu8:
+kernel: 452773
+user: 772479
+idle: 75359327
+iowait: 5845
+
+cpu9:
+kernel: 1050230
+user: 1079258
+idle: 74532776
+iowait: 3340
+
+cpu10:
+kernel: 535495
+user: 847295
+idle: 75202362
+iowait: 4038
+
+cpu11:
+kernel: 171635
+user: 323891
+idle: 76181622
+iowait: 993
+
+cpu12:
+kernel: 331031
+user: 683257
+idle: 75587176
+iowait: 5174
+
+cpu13:
+kernel: 112686
+user: 230633
+idle: 76345295
+iowait: 1367
+
+cpu14:
+kernel: 251393
+user: 547599
+idle: 75824554
+iowait: 5195
+
+cpu15:
+kernel: 199044
+user: 260673
+idle: 76230586
+iowait: 1379
+
+cpu16:
+kernel: 244158
+user: 463357
+idle: 75923993
+iowait: 6211
+
+cpu17:
+kernel: 88571
+user: 189253
+idle: 76411610
+iowait: 1388
+
+cpu18:
+kernel: 546539
+user: 875655
+idle: 75096896
+iowait: 5756
+
+cpu19:
+kernel: 186366
+user: 348768
+idle: 76137323
+iowait: 1299
+
+cpu20:
+kernel: 449460
+user: 765202
+idle: 75348938
+iowait: 4389
+
+cpu21:
+kernel: 1045076
+user: 1116075
+idle: 74500557
+iowait: 2411
+
+cpu22:
+kernel: 534125
+user: 847779
+idle: 75178185
+iowait: 5632
+
+cpu23:
+kernel: 265029
+user: 640815
+idle: 75753872
+iowait: 1026
+
diff --git a/tests/nodeinfodata/linux-cpustat-24cpu.stat
b/tests/nodeinfodata/linux-cpustat-24cpu.stat
new file mode 100644
index 0000000..bc9d449
--- /dev/null
+++ b/tests/nodeinfodata/linux-cpustat-24cpu.stat
@@ -0,0 +1,25 @@
+cpu 14126233 1846 7764352 1816344522 81323 395581 591237 0 5880634 0
+cpu0 748997 24 320851 75399242 5295 22050 104702 0 331814 0
+cpu1 337325 1 140909 76178612 1121 8962 17344 0 166726 0
+cpu2 666860 29 269302 75649696 4298 18473 21155 0 272094 0
+cpu3 328387 77 211400 76131634 1219 9701 6573 0 115551 0
+cpu4 583896 19 265185 75746383 3997 17525 16804 0 253387 0
+cpu5 231867 0 100660 76336319 798 6856 4771 0 118465 0
+cpu6 896023 229 472933 75132665 7210 25811 47846 0 410328 0
+cpu7 342336 1 159567 76154889 1933 8675 9473 0 204523 0
+cpu8 772415 64 382065 75359327 5845 22810 47898 0 347169 0
+cpu9 1078771 487 1007467 74532776 3340 28419 14344 0 150374 0
+cpu10 847174 121 461786 75202362 4038 25206 48503 0 370309 0
+cpu11 323890 1 153521 76181622 993 9462 8652 0 199566 0
+cpu12 683237 20 290483 75587176 5174 19287 21261 0 293663 0
+cpu13 230633 0 100001 76345295 1367 7171 5514 0 103907 0
+cpu14 547593 6 220118 75824554 5195 14963 16312 0 207464 0
+cpu15 260648 25 185128 76230586 1379 8448 5468 0 76655 0
+cpu16 463328 29 214199 75923993 6211 14403 15556 0 184943 0
+cpu17 189247 6 79317 76411610 1388 5455 3799 0 85456 0
+cpu18 875552 103 470237 75096896 5756 25159 51143 0 408446 0
+cpu19 348767 1 167550 76137323 1299 8813 10003 0 208604 0
+cpu20 765169 33 380697 75348938 4389 21782 46981 0 353323 0
+cpu21 1115675 400 1003579 74500557 2411 28146 13351 0 162678 0
+cpu22 847629 150 463239 75178185 5632 24933 45953 0 376150 0
+cpu23 640804 11 244148 75753872 1026 13061 7820 0 479032 0
diff --git a/tests/nodeinfotest.c b/tests/nodeinfotest.c
index 74f6d4d..6101551 100644
--- a/tests/nodeinfotest.c
+++ b/tests/nodeinfotest.c
@@ -31,6 +31,13 @@ extern int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
char *sysfs_dir,
virNodeInfoPtr nodeinfo);
+extern int
+linuxNodeGetCPUStats(FILE *procstat,
+ int cpuNum,
+ virNodeCPUStatsPtr params,
+ int *nparams);
+
+
static int
linuxTestCompareFiles(const char *cpuinfofile,
char *sysfs_dir,
@@ -83,6 +90,93 @@ fail:
return ret;
}
+# define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
+
+static int
+linuxCPUStatsToBuf(virBufferPtr buf,
+ int cpu,
+ virNodeCPUStatsPtr param,
+ size_t nparams)
+{
+ size_t i = 0;
+
+ if (cpu < 0)
+ virBufferAddLit(buf, "cpu:\n");
+ else
+ virBufferAsprintf(buf, "cpu%d:\n", cpu);
+
+ for (i = 0; i < nparams; i++)
+ virBufferAsprintf(buf, "%s: %llu\n", param[i].field,
+ param[i].value / TICK_TO_NSEC);
+
+ virBufferAddChar(buf, '\n');
+ return 0;
+}
+
+static int
+linuxCPUStatsCompareFiles(const char *cpustatfile,
+ size_t ncpus,
+ const char *outfile)
+{
+ int ret = -1;
+ char *actualData = NULL;
+ char *expectData = NULL;
+ FILE *cpustat = NULL;
+ virNodeCPUStatsPtr params = NULL;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ size_t i;
+ int nparams = 0;
+
+ if (virtTestLoadFile(outfile, &expectData) < 0)
+ goto fail;
+
+ if (!(cpustat = fopen(cpustatfile, "r"))) {
+ virReportSystemError(errno, "failed to open '%s': ",
cpustatfile);
+ goto fail;
+ }
+
+ if (linuxNodeGetCPUStats(NULL, 0, NULL, &nparams) < 0)
+ goto fail;
+
+ if (VIR_ALLOC_N(params, nparams) < 0)
+ goto fail;
+
+ if (linuxNodeGetCPUStats(cpustat, VIR_NODE_CPU_STATS_ALL_CPUS, params,
+ &nparams) < 0)
+ goto fail;
+
+ if (linuxCPUStatsToBuf(&buf, VIR_NODE_CPU_STATS_ALL_CPUS,
+ params, nparams) < 0)
+ goto fail;
+
+ for (i = 0; i < ncpus; i++) {
+ if (linuxNodeGetCPUStats(cpustat, i, params, &nparams) < 0)
+ goto fail;
+ if (linuxCPUStatsToBuf(&buf, i, params, nparams) < 0)
+ goto fail;
+ }
+
+ if (!(actualData = virBufferContentAndReset(&buf))) {
+ virReportOOMError();
+ goto fail;
+ }
+
+ if (STRNEQ(actualData, expectData)) {
+ virtTestDifference(stderr, expectData, actualData);
+ goto fail;
+ }
+
+ ret = 0;
+
+fail:
+ virBufferFreeAndReset(&buf);
+ VIR_FORCE_FCLOSE(cpustat);
+ VIR_FREE(expectData);
+ VIR_FREE(actualData);
+ VIR_FREE(params);
+ return ret;
+}
+
static int
linuxTestNodeInfo(const void *data)
@@ -118,6 +212,34 @@ cleanup:
return result;
}
+struct nodeCPUStatsData {
+ const char *name;
+ int ncpus;
+};
+
+static int
+linuxTestNodeCPUStats(const void *data)
+{
+ const struct nodeCPUStatsData *testData = data;
+ int result = -1;
+ char *cpustatfile = NULL;
+ char *outfile = NULL;
+
+ if (virAsprintf(&cpustatfile, "%s/nodeinfodata/linux-cpustat-%s.stat",
+ abs_srcdir, testData->name) < 0 ||
+ virAsprintf(&outfile, "%s/nodeinfodata/linux-cpustat-%s.out",
+ abs_srcdir, testData->name) < 0)
+ goto fail;
+
+ result = linuxCPUStatsCompareFiles(cpustatfile,
+ testData->ncpus,
+ outfile);
+fail:
+ VIR_FREE(cpustatfile);
+ VIR_FREE(outfile);
+ return result;
+}
+
static int
mymain(void)
@@ -145,6 +267,15 @@ mymain(void)
if (virtTestRun(nodeData[i], linuxTestNodeInfo, nodeData[i]) != 0)
ret = -1;
+# define DO_TEST_CPU_STATS(name, ncpus) \
+ do { \
+ static struct nodeCPUStatsData data = { name, ncpus }; \
+ if (virtTestRun("CPU stats " name, linuxTestNodeCPUStats, &data)
< 0) \
+ ret = -1; \
+ } while (0)
+
+ DO_TEST_CPU_STATS("24cpu", 24);
+
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--
1.8.3.2