From a4e0f2343fd6a661819e9ba109d271c07ab7cf5a Mon Sep 17 00:00:00 2001 From: Maxim Nestratov Date: Tue, 10 Mar 2015 23:12:19 +0300 Subject: [PATCH] parallels: cpumask support Signed-off-by: Maxim Nestratov --- src/parallels/parallels_driver.c | 4 +--- src/parallels/parallels_sdk.c | 31 ++++++++++++++++--------------- src/parallels/parallels_utils.h | 1 - 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 650b79051e..09d1ccaa1d 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -777,7 +777,6 @@ parallelsDomainGetVcpus(virDomainPtr domain, int maplen) { parallelsConnPtr privconn = domain->conn->privateData; - parallelsDomObjPtr privdomdata = NULL; virDomainObjPtr privdom = NULL; size_t i; int v, maxcpu, hostcpus; @@ -799,7 +798,6 @@ parallelsDomainGetVcpus(virDomainPtr domain, goto cleanup; } - privdomdata = privdom->privateData; if ((hostcpus = nodeGetCPUCount()) < 0) goto cleanup; @@ -820,7 +818,7 @@ parallelsDomainGetVcpus(virDomainPtr domain, int tmpmapLen = 0; memset(cpumaps, 0, maplen * maxinfo); - virBitmapToData(privdomdata->cpumask, &tmpmap, &tmpmapLen); + virBitmapToData(privdom->def->cpumask, &tmpmap, &tmpmapLen); if (tmpmapLen > maplen) tmpmapLen = maplen; diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c index fec145d185..5a3969ea6a 100644 --- a/src/parallels/parallels_sdk.c +++ b/src/parallels/parallels_sdk.c @@ -412,7 +412,6 @@ prlsdkDomObjFreePrivate(void *p) return; PrlHandle_Free(pdom->sdkdom); - virBitmapFree(pdom->cpumask); VIR_FREE(pdom->uuid); VIR_FREE(pdom->home); VIR_FREE(p); @@ -1053,8 +1052,7 @@ prlsdkConvertDomainState(VIRTUAL_MACHINE_STATE domainState, static int prlsdkConvertCpuInfo(PRL_HANDLE sdkdom, - virDomainDefPtr def, - parallelsDomObjPtr pdom) + virDomainDefPtr def) { char *buf; PRL_UINT32 buflen = 0; @@ -1085,11 +1083,11 @@ prlsdkConvertCpuInfo(PRL_HANDLE sdkdom, pret = PrlVmCfg_GetCpuMask(sdkdom, buf, &buflen); if (strlen(buf) == 0) { - if (!(pdom->cpumask = virBitmapNew(hostcpus))) + if (!(def->cpumask = virBitmapNew(hostcpus))) goto cleanup; - virBitmapSetAll(pdom->cpumask); + virBitmapSetAll(def->cpumask); } else { - if (virBitmapParse(buf, 0, &pdom->cpumask, hostcpus) < 0) + if (virBitmapParse(buf, 0, &def->cpumask, hostcpus) < 0) goto cleanup; } @@ -1217,7 +1215,7 @@ prlsdkLoadDomain(parallelsConnPtr privconn, convert to Kbytes */ def->mem.cur_balloon = def->mem.max_balloon; - if (prlsdkConvertCpuInfo(sdkdom, def, pdom) < 0) + if (prlsdkConvertCpuInfo(sdkdom, def) < 0) goto error; if (prlsdkConvertCpuMode(sdkdom, def) < 0) @@ -1807,13 +1805,6 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def) return -1; } - if (def->cpumask != NULL) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("changing cpu mask is not supported " - "by parallels driver")); - return -1; - } - if (def->cputune.shares || def->cputune.sharesSpecified || def->cputune.period || @@ -2842,6 +2833,7 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, size_t i; char uuidstr[VIR_UUID_STRING_BUFLEN + 2]; bool needBoot = true; + char *mask = NULL; if (prlsdkCheckUnsupportedParams(sdkdom, def) < 0) return -1; @@ -2869,6 +2861,13 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, pret = PrlVmCfg_SetCpuCount(sdkdom, def->vcpus); prlsdkCheckRetGoto(pret, error); + if (!(mask = virBitmapFormat(def->cpumask))) + goto error; + + pret = PrlVmCfg_SetCpuMask(sdkdom, mask); + prlsdkCheckRetGoto(pret, error); + VIR_FREE(mask); + if (prlsdkClearDevices(sdkdom) < 0) goto error; @@ -2912,7 +2911,9 @@ prlsdkDoApplyConfig(PRL_HANDLE sdkdom, return 0; error: - return -1; + VIR_FREE(mask); + + return -1; } int diff --git a/src/parallels/parallels_utils.h b/src/parallels/parallels_utils.h index ead5586a68..394548ade5 100644 --- a/src/parallels/parallels_utils.h +++ b/src/parallels/parallels_utils.h @@ -69,7 +69,6 @@ struct parallelsDomObj { int id; char *uuid; char *home; - virBitmapPtr cpumask; PRL_HANDLE sdkdom; }; -- GitLab