On 06/24/2015 10:11 AM, Peter Krempa wrote:
Drop internal data structures and use the proper fields in
virDomainDef.
This allows to greatly simplify the code and allows to remove the
private data structure that was holding just redundant data.
This patch also fixes the bogous output where we'd report that a fresh
Another bogus typo
VM without vCPU pinning would not run on all vcpus.
---
src/test/test_driver.c | 224 +++++++++++--------------------------------------
1 file changed, 49 insertions(+), 175 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ae332ef..ed67dca 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
...
@@ -2541,45 +2416,47 @@ static int testDomainGetVcpus(virDomainPtr
domain,
statbase = (tv.tv_sec * 1000UL * 1000UL) + tv.tv_usec;
-
hostcpus = VIR_NODEINFO_MAXCPUS(privconn->nodeInfo);
maxcpu = maplen * 8;
if (maxcpu > hostcpus)
maxcpu = hostcpus;
+ if (!(allcpumap = virBitmapNew(hostcpus)))
+ goto cleanup;
+
+ virBitmapSetAll(allcpumap);
+
/* Clamp to actual number of vcpus */
if (maxinfo > privdom->def->vcpus)
maxinfo = privdom->def->vcpus;
- /* Populate virVcpuInfo structures */
- if (info != NULL) {
- memset(info, 0, sizeof(*info) * maxinfo);
+ memset(info, 0, sizeof(*info) * maxinfo);
+ memset(cpumaps, 0, maxinfo * maplen);
- for (i = 0; i < maxinfo; i++) {
- virVcpuInfo privinfo = privdomdata->vcpu_infos[i];
+ for (i = 0; i < maxinfo; i++) {
+ virDomainPinDefPtr pininfo;
+ virBitmapPtr bitmap = NULL;
- info[i].number = privinfo.number;
- info[i].state = privinfo.state;
- info[i].cpu = privinfo.cpu;
+ pininfo = virDomainPinFind(def->cputune.vcpupin,
+ def->cputune.nvcpupin,
+ i);
- /* Fake an increasing cpu time value */
- info[i].cpuTime = statbase / 10;
- }
- }
+ if (pininfo && pininfo->cpumask)
+ bitmap = pininfo->cpumask;
+ else if (def->cpumask)
+ bitmap = def->cpumask;
+ else
+ bitmap = allcpumap;
- /* Populate cpumaps */
- if (cpumaps != NULL) {
- int privmaplen = VIR_CPU_MAPLEN(hostcpus);
- memset(cpumaps, 0, maplen * maxinfo);
+ if (cpumaps)
+ virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, i), maplen);
- for (v = 0; v < maxinfo; v++) {
- unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
+ info[i].number = i;
+ info[i].state = VIR_VCPU_RUNNING;
+ info[i].cpu = virBitmapLastSetBit(bitmap);
- for (i = 0; i < maxcpu; i++) {
- if (VIR_CPU_USABLE(privdomdata->cpumaps, privmaplen, v, i))
- VIR_USE_CPU(cpumap, i);
- }
- }
+ /* Fake an increasing cpu time value */
+ info[i].cpuTime = statbase / 10;
}
ret = maxinfo;
...
Coverity determines that there's a need for virBitmapFree(allcpumap);
John