提交 28a36059 编写于 作者: E Eric Blake

vcpu: complete vcpu support in qemu driver

* src/qemu/qemu_driver.c (qemudDomainSetVcpusFlags)
(qemudDomainGetVcpusFlags): Support all feasible flag
combinations.
上级 d67c189e
...@@ -5941,13 +5941,27 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, ...@@ -5941,13 +5941,27 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
{ {
struct qemud_driver *driver = dom->conn->privateData; struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm; virDomainObjPtr vm;
virDomainDefPtr def;
const char * type; const char * type;
int max; int max;
int ret = -1; int ret = -1;
if (flags != VIR_DOMAIN_VCPU_LIVE) { virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), VIR_DOMAIN_VCPU_CONFIG |
flags); VIR_DOMAIN_VCPU_MAXIMUM, -1);
/* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
* mixed with LIVE. */
if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
(flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
(VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
qemuReportError(VIR_ERR_INVALID_ARG,
_("invalid flag combination: (0x%x)"), flags);
return -1;
}
if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
qemuReportError(VIR_ERR_INVALID_ARG,
_("argument out of range: %d"), nvcpus);
return -1; return -1;
} }
...@@ -5966,7 +5980,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, ...@@ -5966,7 +5980,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
if (qemuDomainObjBeginJob(vm) < 0) if (qemuDomainObjBeginJob(vm) < 0)
goto cleanup; goto cleanup;
if (!virDomainObjIsActive(vm)) { if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
qemuReportError(VIR_ERR_OPERATION_INVALID, qemuReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running")); "%s", _("domain is not running"));
goto endjob; goto endjob;
...@@ -5985,6 +5999,11 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, ...@@ -5985,6 +5999,11 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
goto endjob; goto endjob;
} }
if ((flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
VIR_DOMAIN_VCPU_LIVE && vm->def->maxvcpus < max) {
max = vm->def->maxvcpus;
}
if (nvcpus > max) { if (nvcpus > max) {
qemuReportError(VIR_ERR_INVALID_ARG, qemuReportError(VIR_ERR_INVALID_ARG,
_("requested vcpus is greater than max allowable" _("requested vcpus is greater than max allowable"
...@@ -5992,7 +6011,49 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, ...@@ -5992,7 +6011,49 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
goto endjob; goto endjob;
} }
switch (flags) {
case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
def = vm->def;
if (virDomainObjIsActive(vm)) {
if (vm->newDef)
def = vm->newDef;
else{
qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("no persistent state"));
goto endjob;
}
}
def->maxvcpus = nvcpus;
if (nvcpus < vm->newDef->vcpus)
def->vcpus = nvcpus;
ret = 0;
break;
case VIR_DOMAIN_VCPU_CONFIG:
def = vm->def;
if (virDomainObjIsActive(vm)) {
if (vm->newDef)
def = vm->newDef;
else {
qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("no persistent state"));
goto endjob;
}
}
def->vcpus = nvcpus;
ret = 0;
break;
case VIR_DOMAIN_VCPU_LIVE:
ret = qemudDomainHotplugVcpus(vm, nvcpus); ret = qemudDomainHotplugVcpus(vm, nvcpus);
break;
case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
ret = qemudDomainHotplugVcpus(vm, nvcpus);
if (ret == 0 && vm->newDef)
vm->newDef->vcpus = nvcpus;
break;
}
endjob: endjob:
if (qemuDomainObjEndJob(vm) == 0) if (qemuDomainObjEndJob(vm) == 0)
...@@ -6171,12 +6232,17 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) ...@@ -6171,12 +6232,17 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
{ {
struct qemud_driver *driver = dom->conn->privateData; struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm; virDomainObjPtr vm;
const char *type; virDomainDefPtr def;
int ret = -1; int ret = -1;
if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) { virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), VIR_DOMAIN_VCPU_CONFIG |
flags); VIR_DOMAIN_VCPU_MAXIMUM, -1);
/* Exactly one of LIVE or CONFIG must be set. */
if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
qemuReportError(VIR_ERR_INVALID_ARG,
_("invalid flag combination: (0x%x)"), flags);
return -1; return -1;
} }
...@@ -6192,14 +6258,18 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) ...@@ -6192,14 +6258,18 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
goto cleanup; goto cleanup;
} }
if (!(type = virDomainVirtTypeToString(vm->def->virtType))) { if (flags & VIR_DOMAIN_VCPU_LIVE) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, if (!virDomainObjIsActive(vm)) {
_("unknown virt type in domain definition '%d'"), qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
vm->def->virtType); _("domain not active"));
goto cleanup; goto cleanup;
} }
def = vm->def;
} else {
def = vm->newDef ? vm->newDef : vm->def;
}
ret = qemudGetMaxVCPUs(NULL, type); ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
cleanup: cleanup:
if (vm) if (vm)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册