[libvirt] [PATCH] manage number of virtual CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



OpenVZ containers use all CPUs available in system by default.
Limitations may be caused only by Linux kernel limitation.

There is way to artificially limit number of CPUs.

patch add cpu management functionality to OpenVZ driver.
Index: openvz_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/openvz_conf.c,v
retrieving revision 1.33
diff -u -p -r1.33 openvz_conf.c
--- openvz_conf.c	5 Aug 2008 10:53:05 -0000	1.33
+++ openvz_conf.c	13 Aug 2008 12:49:58 -0000
@@ -513,6 +513,7 @@ openvzGetVPSInfo(virConnectPtr conn) {
     struct openvz_vm  **pnext;
     struct openvz_driver *driver;
     struct openvz_vm_def *vmdef;
+    char temp[124];
 
     vm =  NULL;
     driver = conn->privateData;
@@ -569,6 +570,17 @@ openvzGetVPSInfo(virConnectPtr conn) {
             goto error;
         }
 
+        /*get VCPU*/
+        ret = openvzReadConfigParam(veid, "CPUS", temp, sizeof(temp));
+        if (ret < 0) {
+             openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+                            _("Cound not read config for container %d"), veid);
+             goto error;
+        } else if (ret > 0) {
+             vmdef->vcpus = strtoI(temp);
+        }
+
+
         (*pnext)->vmdef = vmdef;
         pnext = &(*pnext)->next;
     }
Index: openvz_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/openvz_driver.c,v
retrieving revision 1.37
diff -u -p -r1.37 openvz_driver.c
--- openvz_driver.c	5 Aug 2008 10:53:05 -0000	1.37
+++ openvz_driver.c	13 Aug 2008 12:49:58 -0000
@@ -94,6 +94,9 @@ static int openvzDomainUndefine(virDomai
 static void cmdExecFree(char *cmdExec[]);
 
 static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid);
+static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type);
+static int openvzDomainGetMaxVcpus(virDomainPtr dom);
+static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus);
 
 struct openvz_driver ovz_driver;
 
@@ -266,7 +269,7 @@ static int openvzDomainGetInfo(virDomain
     //info->cpuTime =
     //info->maxMem = vm->def->maxmem;
     //info->memory = vm->def->memory;
-    //info->nrVirtCpu = vm->def->vcpus;
+    info->nrVirtCpu = vm->vmdef->vcpus;
     return 0;
 }
 
@@ -450,7 +453,6 @@ openvzDomainDefineXML(virConnectPtr conn
         goto exit;
     }
 
-    //TODO: set number virtual CPUs
     //TODO: set quota
 
     if (virRun(conn, (char **)prog, NULL) < 0) {
@@ -475,6 +477,14 @@ openvzDomainDefineXML(virConnectPtr conn
         goto exit;
     }
 
+    if (vmdef->vcpus > 0) {
+        if (openvzDomainSetVcpus(dom, vmdef->vcpus) < 0) {
+            openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+                     _("Could not set number of virtual cpu"));
+             goto exit;
+        }
+    }
+
     exit:
     cmdExecFree(prog);
     return dom;
@@ -548,6 +558,15 @@ openvzDomainCreateLinux(virConnectPtr co
     dom = virGetDomain(conn, vm->vmdef->name, vm->vmdef->uuid);
     if (dom)
         dom->id = vm->vpsid;
+
+    if (vmdef->vcpus > 0) {
+        if (openvzDomainSetVcpus(dom, vmdef->vcpus) < 0) {
+            openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+                     _("Could not set number of virtual cpu"));
+             goto exit;
+        }
+    }
+
  exit:
     cmdExecFree(progcreate);
     return dom;
@@ -662,6 +681,52 @@ openvzDomainGetAutostart(virDomainPtr do
     return 0;
 }
 
+static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type) {
+    if (STRCASEEQ(type, "openvz"))
+        return 4096; //OpenVZ has no limitation
+
+    openvzError(conn, VIR_ERR_INVALID_ARG,
+                     _("unknown type '%s'"), type);
+    return -1;
+}
+
+
+static int openvzDomainGetMaxVcpus(virDomainPtr dom) {
+    return openvzGetMaxVCPUs(dom->conn, "openvz");
+}
+
+static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
+    virConnectPtr conn= dom->conn;
+    struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
+    struct openvz_vm *vm = openvzFindVMByUUID(driver, dom->uuid);
+    char   str_vcpus[32];
+    const char *prog[] = { VZCTL, "--quiet", "set", vm->vmdef->name,
+                           "--cpus", str_vcpus, "--save", NULL };
+    snprintf(str_vcpus, 31, "%d", nvcpus);
+    str_vcpus[31] = '\0';
+
+    if (nvcpus <= 0) {
+        openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+                         _("VCPUs should be >= 1"));
+        return -1;
+    }
+
+    if (!vm) {
+        openvzError(conn, VIR_ERR_INVALID_DOMAIN,
+                         _("no domain with matching uuid"));
+        return -1;
+    }
+
+    if (virRun(conn, (char **)prog, NULL) < 0) {
+        openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+                             _("Could not exec %s"), VZCTL);
+        return -1;
+    }
+
+    vm->vmdef->vcpus = nvcpus;
+    return 0;
+}
+
 static const char *openvzProbe(void)
 {
 #ifdef __linux__
@@ -884,7 +949,7 @@ static virDriver openvzDriver = {
     NULL, /* version */
     NULL, /* hostname */
     NULL, /* uri */
-    NULL, /* getMaxVcpus */
+    openvzGetMaxVCPUs, /* getMaxVcpus */
     openvzGetNodeInfo, /* nodeGetInfo */
     NULL, /* getCapabilities */
     openvzListDomains, /* listDomains */
@@ -906,10 +971,10 @@ static virDriver openvzDriver = {
     NULL, /* domainSave */
     NULL, /* domainRestore */
     NULL, /* domainCoreDump */
-    NULL, /* domainSetVcpus */
+    openvzDomainSetVcpus, /* domainSetVcpus */
     NULL, /* domainPinVcpu */
     NULL, /* domainGetVcpus */
-    NULL, /* domainGetMaxVcpus */
+    openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
     NULL, /* domainDumpXML */
     openvzListDefinedDomains, /* listDomains */
     openvzNumDefinedDomains, /* numOfDomains */
--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]