[libvirt] [PATCH 1/4] parallels: cpumask support

Maxim Nestratov mnestratov at parallels.com
Tue Mar 10 20:12:19 UTC 2015


Signed-off-by: Maxim Nestratov <mnestratov at parallels.com>
---
 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 650b790..09d1cca 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 fec145d..5a3969e 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 ead5586..394548a 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;
 };
 
-- 
1.7.1




More information about the libvir-list mailing list