--- src/lxc/lxc_driver.c | 41 ++++++++++++++++++++++++++++++++++++----- 1 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 72c0a0a..5db1035 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2244,21 +2244,28 @@ static char *lxcGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, return schedulerType; } -static int lxcSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, - int nparams) +static int lxcSetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr params, + int nparams, + unsigned int flags) { lxc_driver_t *driver = domain->conn->privateData; int i; virCgroupPtr group = NULL; virDomainObjPtr vm = NULL; + virDomainDefPtr persistentDef = NULL; int ret = -1; + bool isActive; + + virCheckFlags(VIR_DOMAIN_SCHED_PARAMS_LIVE | + VIR_DOMAIN_SCHED_PARAMS_PERSISTENT, -1); if (driver->cgroup == NULL) return -1; lxcDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, domain->uuid); + lxcDriverUnlock(driver); if (vm == NULL) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2268,9 +2275,20 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, goto cleanup; } + /* Could find cgroup for domain implies the domain is running. */ if (virCgroupForDomain(driver->cgroup, vm->def->name, &group, 0) != 0) goto cleanup; + if (flags & VIR_DOMAIN_SCHED_PARAMS_PERSISTENT) { + if (!vm->persistent) { + lxcError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot change persistent config of a transient domain")); + goto cleanup; + } + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm))) + goto cleanup; + } + for (i = 0; i < nparams; i++) { virSchedParameterPtr param = ¶ms[i]; @@ -2294,17 +2312,30 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, } vm->def->cputune.shares = params[i].value.ul; + + if (flags & VIR_DOMAIN_SCHED_PARAMS_PERSISTENT) { + persistentDef->cputune.shares = params[i].value.ul; + ret = virDomainSaveConfig(driver->configDir, persistentDef); + goto cleanup; + } } ret = 0; cleanup: - lxcDriverUnlock(driver); virCgroupFree(&group); if (vm) virDomainObjUnlock(vm); return ret; } +static int lxcSetSchedulerParameters(virDomainPtr domain, + virSchedParameterPtr params, + int nparams) +{ + return lxcSetSchedulerParametersFlags(domain, params, nparams, + VIR_DOMAIN_SCHED_PARAMS_LIVE); +} + static int lxcGetSchedulerParameters(virDomainPtr domain, virSchedParameterPtr params, int *nparams) @@ -2860,7 +2891,7 @@ static virDriver lxcDriver = { lxcGetSchedulerType, /* domainGetSchedulerType */ lxcGetSchedulerParameters, /* domainGetSchedulerParameters */ lxcSetSchedulerParameters, /* domainSetSchedulerParameters */ - NULL, /* domainSetSchedulerParametersFlags */ + lxcSetSchedulerParametersFlags, /* domainSetSchedulerParametersFlags */ NULL, /* domainMigratePrepare */ NULL, /* domainMigratePerform */ NULL, /* domainMigrateFinish */ -- 1.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list