add cpu management functionality to OpenVZ driver

* src/openvz_conf.c src/openvz_driver.c: patch from Evgeniy Sokolov
  to limit the number of CPUs used by OpenVZ domains.
Daniel
This commit is contained in:
Daniel Veillard 2008-08-20 13:44:03 +00:00
parent ce9439358c
commit b1e5880740
3 changed files with 87 additions and 5 deletions

View File

@ -1,3 +1,8 @@
Wed Aug 20 15:42:09 CEST 2008 Daniel Veillard <veillard@redhat.com>
* src/openvz_conf.c src/openvz_driver.c: patch from Evgeniy Sokolov
to limit the number of CPUs used by OpenVZ domains.
Wed Aug 20 15:31:47 CEST 2008 Daniel Veillard <veillard@redhat.com>
* src/storage_backend_logical.c: Patch from Cole Robinson, fix

View File

@ -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;
}

View File

@ -94,6 +94,9 @@ static int openvzDomainUndefine(virDomainPtr dom);
static void cmdExecFree(const 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(virDomainPtr dom,
//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, const char *xml)
goto exit;
}
//TODO: set number virtual CPUs
//TODO: set quota
if (virRun(conn, prog, NULL) < 0) {
@ -475,6 +477,14 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
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 conn, const char *xml,
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 dom, int *autostart)
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__
@ -886,7 +951,7 @@ static virDriver openvzDriver = {
NULL, /* version */
NULL, /* hostname */
NULL, /* uri */
NULL, /* getMaxVcpus */
openvzGetMaxVCPUs, /* getMaxVcpus */
openvzGetNodeInfo, /* nodeGetInfo */
NULL, /* getCapabilities */
openvzListDomains, /* listDomains */
@ -908,10 +973,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 */