static const vshCmdOptDef opts_setmaxmem[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
{"kilobytes", VSH_OT_INT, VSH_OFLAG_REQ, N_("maximum memory limit in kilobytes")},
+ {"config", VSH_OT_BOOL, 0, N_("affect next boot")},
+ {"live", VSH_OT_BOOL, 0, N_("affect running domain")},
+ {"current", VSH_OT_BOOL, 0, N_("affect current domain")},
{NULL, 0, 0, NULL}
};
virDomainInfo info;
int kilobytes = 0;
int ret = TRUE;
+ int config = vshCommandOptBool(cmd, "config");
+ int live = vshCommandOptBool(cmd, "live");
+ int current = vshCommandOptBool(cmd, "current");
+ int flags = VIR_DOMAIN_MEM_MAXIMUM;
+
+ if (current) {
+ if (live || config) {
+ vshError(ctl, "%s", _("--current must be specified exclusively"));
+ return FALSE;
+ }
+ } else {
+ if (config)
+ flags |= VIR_DOMAIN_MEM_CONFIG;
+ if (live)
+ flags |= VIR_DOMAIN_MEM_LIVE;
+ /* neither option is specified */
+ if (!live && !config)
+ flags = -1;
+ }
if (!vshConnectionUsability(ctl, ctl->conn))
return FALSE;
return FALSE;
}
- if (virDomainSetMaxMemory(dom, kilobytes) != 0) {
- vshError(ctl, "%s", _("Unable to change MaxMemorySize"));
- ret = FALSE;
+ if (flags == -1) {
+ if (virDomainSetMaxMemory(dom, kilobytes) != 0) {
+ vshError(ctl, "%s", _("Unable to change MaxMemorySize"));
+ ret = FALSE;
+ }
+ } else {
+ if (virDomainSetMemoryFlags(dom, kilobytes, flags) < 0) {
+ vshError(ctl, "%s", _("Unable to change MaxMemorySize"));
+ ret = FALSE;
+ }
}
virDomainFree(dom);
goto cleanup;
}
- if(xmlNodeDump(xml_buf, xml, obj->nodesetval->nodeTab[i], 0, 0) < 0){
+ if (xmlNodeDump(xml_buf, xml, obj->nodesetval->nodeTab[i], 0, 0) < 0) {
vshError(ctl, "%s", _("Failed to create XML"));
goto cleanup;
}
goto cleanup;
}
- if(xmlNodeDump(xml_buf, xml, obj->nodesetval->nodeTab[i], 0, 0) < 0){
+ if (xmlNodeDump(xml_buf, xml, obj->nodesetval->nodeTab[i], 0, 0) < 0) {
vshError(ctl, "%s", _("Failed to create XML"));
goto cleanup;
}
for (g = cmdGroups; g->name; g++) {
for (c = g->commands; c->name; c++) {
- if(STREQ(c->name, cmdname))
+ if (STREQ(c->name, cmdname))
return c;
}
}
const vshCmdGrp *g;
for (g = cmdGroups; g->name; g++) {
- if(STREQ(g->name, grpname) || STREQ(g->keyword, grpname))
+ if (STREQ(g->name, grpname) || STREQ(g->keyword, grpname))
return g;
}
For Xen, you can only adjust the memory of a running domain if the domain is
paravirtualized or running the PV balloon driver.
-=item B<setmaxmem> I<domain-id> B<kilobytes>
+=item B<setmaxmem> I<domain-id> B<kilobytes> optional I<--config> I<--live>
+I<--current>
-Change the maximum memory allocation limit for an inactive guest domain.
+Change the maximum memory allocation limit for a guest domain.
+If I<--live> is specified, affect a running guest.
+If I<--config> is specified, affect the next boot of a persistent guest.
+If I<--current> is specified, affect the current guest state.
+Both I<--live> and I<--current> flags may be given, but I<--current> is
+exclusive. If no flag is specified, behavior is different depending
+on hypervisor.
-This command works for at least the Xen and vSphere/ESX hypervisors,
-but not for QEMU/KVM.
+This command works for at least the Xen, QEMU/KVM and vSphere/ESX hypervisors.
Some hypervisors require a larger granularity than kilobytes, rounding up
requests that are not an even multiple of the desired amount. vSphere/ESX
vSphere/ESX, 263168 (257MB) would be rounded up because it's not a multiple
of 4MB, while 266240 (260MB) is valid without rounding.
-Note, to change the maximum memory allocation for a QEMU/KVM guest domain,
-use the virsh B<edit> command instead to update its XML <memory> element.
=item B<memtune> I<domain-id> optional I<--hard-limit> B<kilobytes>
optional I<--soft-limit> B<kilobytes> optional I<--swap-hard-limit>