On Wed, Aug 13, 2008 at 05:04:45PM +0400, Evgeniy Sokolov wrote:
+static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type) {
+ if (STRCASEEQ(type, "openvz"))
+ return 4096; //OpenVZ has no limitation
This should be 1024 since that's the max CPUs exposed by the kernel
to userspace for sched params.
+ if (virRun(conn, (char **)prog, NULL) < 0) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Could not exec %s"), VZCTL);
+ return -1;
+ }
There's no need to cast to '(char **)' anymore - virRun has
the correct constness defined.
With those two things changed this looks fine to commit
Thanks for review!
fixed patch is attached.
Regards,
Daniel
Index: src/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
--- src/openvz_conf.c 5 Aug 2008 10:53:05 -0000 1.33
+++ src/openvz_conf.c 14 Aug 2008 14:24:25 -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: src/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
--- src/openvz_driver.c 5 Aug 2008 10:53:05 -0000 1.37
+++ src/openvz_driver.c 14 Aug 2008 14:24:25 -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 1028; //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, 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