On 05/17/2011 12:20 AM, Hu Tao wrote:
Support for virDomainSetSchedulerParametersFlags of qemu driver.
---
src/qemu/qemu_driver.c | 94 ++++++++++++++++++++++++++++++++++++------------
1 files changed, 71 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ccaae66..d3b832d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4835,7 +4835,7 @@ static int qemuDomainSetMemoryParameters(virDomainPtr dom,
goto cleanup;
}
- if (!virDomainObjIsActive(vm)) {
+ if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_SCHEDPARAM_LIVE)) {
This hunk doesn't belong. SCHEDPARAM flags should not affect
MemoryParameters.
+ bool isActive;
+
+ virCheckFlags(VIR_DOMAIN_SCHEDPARAM_LIVE |
+ VIR_DOMAIN_SCHEDPARAM_CONFIG |
+ VIR_DOMAIN_SCHEDPARAM_CURRENT, -1);
Given that _CURRENT is 0, it is redundant in this check.
+ if (!isActive && (flags &
VIR_DOMAIN_SCHEDPARAM_LIVE)) {
qemuReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
Missing a check that a transient domain can't use _CONFIG.
- vm->def->cputune.shares = params[i].value.ul;
+ if (flags & VIR_DOMAIN_SCHEDPARAM_CONFIG) {
+ persistentDef = virDomainObjGetPersistentDef(driver->caps, vm);
+ if (!persistentDef) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("can't get persistentDef"));
+ goto cleanup;
+ }
+ persistentDef->cputune.shares = params[i].value.ul;
+ rc = virDomainSaveConfig(driver->configDir, persistentDef);
Hmm, this is fetching and saving persistentDef every time through the
loop. Then again, qemu only goes through the loop at most once, so it's
not wasteful. But if we ever add another parameter, it would be worth
refactoring things to grab persistentDef before the loop, and call
virDomainSaveConfig only after the loop completes, rather than repeating
it each iteration.
@@ -5143,9 +5190,8 @@ static int
qemuGetSchedulerParameters(virDomainPtr dom,
}
if (!virDomainObjIsActive(vm)) {
- qemuReportError(VIR_ERR_OPERATION_INVALID,
- "%s", _("domain is not running"));
- goto cleanup;
+ val = vm->def->cputune.shares;
+ goto out;
Hmm, this really argues that we need qemuGetSchedulerParametersFlags as
a counterpart to qemuSetSchedulerParametersFlags. But that can be a
separate patch.
ACK with this squashed in, so I'm pushing:
diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index d3b832d..fdb3b30 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -4835,7 +4835,7 @@ static int
qemuDomainSetMemoryParameters(virDomainPtr dom,
goto cleanup;
}
- if (!virDomainObjIsActive(vm) && (flags &
VIR_DOMAIN_SCHEDPARAM_LIVE)) {
+ if (!virDomainObjIsActive(vm)) {
qemuReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
@@ -5052,8 +5052,7 @@ static int
qemuSetSchedulerParametersFlags(virDomainPtr dom,
bool isActive;
virCheckFlags(VIR_DOMAIN_SCHEDPARAM_LIVE |
- VIR_DOMAIN_SCHEDPARAM_CONFIG |
- VIR_DOMAIN_SCHEDPARAM_CURRENT, -1);
+ VIR_DOMAIN_SCHEDPARAM_CONFIG, -1);
qemuDriverLock(driver);
@@ -5074,13 +5073,19 @@ static int
qemuSetSchedulerParametersFlags(virDomainPtr dom,
flags = VIR_DOMAIN_SCHEDPARAM_CONFIG;
}
- if (!isActive && (flags & VIR_DOMAIN_SCHEDPARAM_LIVE)) {
- qemuReportError(VIR_ERR_OPERATION_INVALID,
- "%s", _("domain is not running"));
+ if ((flags & VIR_DOMAIN_MEM_CONFIG) && !vm->persistent) {
+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("cannot change persistent config of a
transient domain"));
goto cleanup;
}
if (flags & VIR_DOMAIN_SCHEDPARAM_LIVE) {
+ if (!isActive) {
+ qemuReportError(VIR_ERR_OPERATION_INVALID,
+ "%s", _("domain is not running"));
+ goto cleanup;
+ }
+
if (!qemuCgroupControllerActive(driver,
VIR_CGROUP_CONTROLLER_CPU)) {
qemuReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("cgroup CPU controller is not
mounted"));
@@ -5088,7 +5093,8 @@ static int
qemuSetSchedulerParametersFlags(virDomainPtr dom,
}
if (virCgroupForDomain(driver->cgroup, vm->def->name, &group,
0) != 0) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
- _("cannot find cgroup for domain %s"),
vm->def->name);
+ _("cannot find cgroup for domain %s"),
+ vm->def->name);
goto cleanup;
}
}
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org