提交 19c6ad9a 编写于 作者: P Peter Krempa

qemu: Refactor qemuDomainSetMemoryParameters

The new TypedParam helper APIs allow to simplify this function
significantly.

This patch integrates the fix in 75e5bec9
by correctly ordering the setting functions instead of reordering the
parameters.
上级 65bb1b97
...@@ -7217,15 +7217,15 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, ...@@ -7217,15 +7217,15 @@ qemuDomainSetMemoryParameters(virDomainPtr dom,
unsigned int flags) unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
int i;
virDomainDefPtr persistentDef = NULL; virDomainDefPtr persistentDef = NULL;
virCgroupPtr group = NULL; virCgroupPtr group = NULL;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
virTypedParameterPtr hard_limit = NULL; unsigned long long swap_hard_limit;
virTypedParameterPtr swap_hard_limit = NULL; unsigned long long memory_hard_limit;
int hard_limit_index = 0; unsigned long long memory_soft_limit;
int swap_hard_limit_index = 0; bool set_swap_hard_limit = false;
unsigned long long val = 0; bool set_memory_hard_limit = false;
bool set_memory_soft_limit = false;
virQEMUDriverConfigPtr cfg = NULL; virQEMUDriverConfigPtr cfg = NULL;
int ret = -1; int ret = -1;
int rc; int rc;
...@@ -7244,13 +7244,9 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, ...@@ -7244,13 +7244,9 @@ qemuDomainSetMemoryParameters(virDomainPtr dom,
NULL) < 0) NULL) < 0)
return -1; return -1;
vm = virDomainObjListFindByUUID(driver->domains, dom->uuid);
if (vm == NULL) { if (!(vm = qemuDomObjFromDomain(dom)))
virReportError(VIR_ERR_INTERNAL_ERROR, return -1;
_("No such domain %s"), dom->uuid);
goto cleanup;
}
cfg = virQEMUDriverGetConfig(driver); cfg = virQEMUDriverGetConfig(driver);
...@@ -7275,109 +7271,73 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, ...@@ -7275,109 +7271,73 @@ qemuDomainSetMemoryParameters(virDomainPtr dom,
} }
} }
for (i = 0; i < nparams; i++) { #define VIR_GET_LIMIT_PARAMETER(PARAM, VALUE) \
if (STREQ(params[i].field, VIR_DOMAIN_MEMORY_HARD_LIMIT)) { if ((rc = virTypedParamsGetULLong(params, nparams, PARAM, &VALUE) < 0)) \
hard_limit = &params[i]; goto cleanup; \
hard_limit_index = i; \
} else if (STREQ(params[i].field, VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT)) { if (rc == 1) \
swap_hard_limit = &params[i]; set_ ## VALUE = true;
swap_hard_limit_index = i;
} VIR_GET_LIMIT_PARAMETER(VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT, swap_hard_limit)
} VIR_GET_LIMIT_PARAMETER(VIR_DOMAIN_MEMORY_HARD_LIMIT, memory_hard_limit)
VIR_GET_LIMIT_PARAMETER(VIR_DOMAIN_MEMORY_SOFT_LIMIT, memory_soft_limit)
#undef VIR_GET_LIMIT_PARAMETER
/* It will fail if hard limit greater than swap hard limit anyway */ /* It will fail if hard limit greater than swap hard limit anyway */
if (swap_hard_limit && if (set_swap_hard_limit && set_memory_hard_limit &&
hard_limit && memory_hard_limit > swap_hard_limit) {
(hard_limit->value.ul > swap_hard_limit->value.ul)) {
virReportError(VIR_ERR_INVALID_ARG, "%s", virReportError(VIR_ERR_INVALID_ARG, "%s",
_("hard limit must be lower than swap hard limit")); _("memory hard_limit tunable value must be lower than "
"swap_hard_limit"));
goto cleanup; goto cleanup;
} }
if (flags & VIR_DOMAIN_AFFECT_LIVE) { if (set_swap_hard_limit) {
/* Get current swap hard limit */ if (flags & VIR_DOMAIN_AFFECT_LIVE &&
rc = virCgroupGetMemSwapHardLimit(group, &val); (rc = virCgroupSetMemSwapHardLimit(group, swap_hard_limit)) < 0) {
if (rc != 0) {
virReportSystemError(-rc, "%s", virReportSystemError(-rc, "%s",
_("unable to get swap hard limit")); _("unable to set memory swap_hard_limit tunable"));
goto cleanup; goto cleanup;
} }
/* Swap hard_limit and swap_hard_limit to ensure the setting if (flags & VIR_DOMAIN_AFFECT_CONFIG)
* could succeed if both of them are provided. persistentDef->mem.swap_hard_limit = swap_hard_limit;
*/
if (swap_hard_limit && hard_limit) {
virTypedParameter param;
if (swap_hard_limit->value.ul > val) {
if (hard_limit_index < swap_hard_limit_index) {
param = params[hard_limit_index];
params[hard_limit_index] = params[swap_hard_limit_index];
params[swap_hard_limit_index] = param;
}
} else {
if (hard_limit_index > swap_hard_limit_index) {
param = params[hard_limit_index];
params[hard_limit_index] = params[swap_hard_limit_index];
params[swap_hard_limit_index] = param;
}
}
}
} }
ret = 0; if (set_memory_hard_limit) {
for (i = 0; i < nparams; i++) { if (flags & VIR_DOMAIN_AFFECT_LIVE &&
virTypedParameterPtr param = &params[i]; (rc = virCgroupSetMemoryHardLimit(group, memory_hard_limit)) < 0) {
if (STREQ(param->field, VIR_DOMAIN_MEMORY_HARD_LIMIT)) {
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
rc = virCgroupSetMemoryHardLimit(group, param->value.ul);
if (rc != 0) {
virReportSystemError(-rc, "%s", virReportSystemError(-rc, "%s",
_("unable to set memory hard_limit tunable")); _("unable to set memory hard_limit tunable"));
ret = -1; goto cleanup;
}
} }
if (flags & VIR_DOMAIN_AFFECT_CONFIG) { if (flags & VIR_DOMAIN_AFFECT_CONFIG)
persistentDef->mem.hard_limit = param->value.ul; persistentDef->mem.hard_limit = memory_hard_limit;
} }
} else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SOFT_LIMIT)) {
if (flags & VIR_DOMAIN_AFFECT_LIVE) { if (set_memory_soft_limit) {
rc = virCgroupSetMemorySoftLimit(group, param->value.ul); if (flags & VIR_DOMAIN_AFFECT_LIVE &&
if (rc != 0) { (rc = virCgroupSetMemorySoftLimit(group, memory_soft_limit)) < 0) {
virReportSystemError(-rc, "%s", virReportSystemError(-rc, "%s",
_("unable to set memory soft_limit tunable")); _("unable to set memory soft_limit tunable"));
ret = -1; goto cleanup;
}
} }
if (flags & VIR_DOMAIN_AFFECT_CONFIG) { if (flags & VIR_DOMAIN_AFFECT_CONFIG)
persistentDef->mem.soft_limit = param->value.ul; persistentDef->mem.soft_limit = memory_soft_limit;
}
} else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT)) {
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
rc = virCgroupSetMemSwapHardLimit(group, param->value.ul);
if (rc != 0) {
virReportSystemError(-rc, "%s",
_("unable to set swap_hard_limit tunable"));
ret = -1;
}
}
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
persistentDef->mem.swap_hard_limit = param->value.ul;
}
}
} }
if (flags & VIR_DOMAIN_AFFECT_CONFIG) { if (flags & VIR_DOMAIN_AFFECT_CONFIG &&
if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) virDomainSaveConfig(cfg->configDir, persistentDef) < 0)
ret = -1; goto cleanup;
}
ret = 0;
cleanup: cleanup:
virCgroupFree(&group); virCgroupFree(&group);
if (vm)
virObjectUnlock(vm); virObjectUnlock(vm);
virObjectUnref(caps); virObjectUnref(caps);
virObjectUnref(cfg); virObjectUnref(cfg);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册