diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index a3c771aa82..212d8ec316 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -883,6 +883,13 @@ typedef enum { VIR_DOMAIN_MEMORY_PARAM_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, } virMemoryParameterType; +/* flags for setting memory parameters */ +typedef enum { + VIR_DOMAIN_MEMORY_PARAM_CURRENT = 0, /* affect current domain state */ + VIR_DOMAIN_MEMORY_PARAM_LIVE = (1 << 0), /* affect active domain */ + VIR_DOMAIN_MEMORY_PARAM_CONFIG = (1 << 1) /* affect next boot */ +} virMemoryParamFlags; + /** * VIR_DOMAIN_MEMORY_FIELD_LENGTH: * diff --git a/tools/virsh.c b/tools/virsh.c index b43c167cfb..ed6ed61cce 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -3307,6 +3307,9 @@ static const vshCmdOptDef opts_memtune[] = { N_("Max memory plus swap in kilobytes")}, {"min-guarantee", VSH_OT_INT, VSH_OFLAG_NONE, N_("Min guaranteed memory 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} }; @@ -3320,6 +3323,23 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) unsigned int i = 0; virMemoryParameterPtr params = NULL, temp = NULL; bool ret = false; + unsigned int flags = 0; + int current = vshCommandOptBool(cmd, "current"); + int config = vshCommandOptBool(cmd, "config"); + int live = vshCommandOptBool(cmd, "live"); + + if (current) { + if (live || config) { + vshError(ctl, "%s", _("--current must be specified exclusively")); + return false; + } + flags = VIR_DOMAIN_MEMORY_PARAM_CURRENT; + } else { + if (config) + flags |= VIR_DOMAIN_MEMORY_PARAM_CONFIG; + if (live) + flags |= VIR_DOMAIN_MEMORY_PARAM_LIVE; + } if (!vshConnectionUsability(ctl, ctl->conn)) return false; @@ -3350,7 +3370,7 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) if (nparams == 0) { /* get the number of memory parameters */ - if (virDomainGetMemoryParameters(dom, NULL, &nparams, 0) != 0) { + if (virDomainGetMemoryParameters(dom, NULL, &nparams, flags) != 0) { vshError(ctl, "%s", _("Unable to get number of memory parameters")); goto cleanup; @@ -3364,7 +3384,7 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) /* now go get all the memory parameters */ params = vshCalloc(ctl, nparams, sizeof(*params)); - if (virDomainGetMemoryParameters(dom, params, &nparams, 0) != 0) { + if (virDomainGetMemoryParameters(dom, params, &nparams, flags) != 0) { vshError(ctl, "%s", _("Unable to get memory parameters")); goto cleanup; } @@ -3444,7 +3464,7 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) if (temp->value.ul == -1) temp->value.ul = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; } - if (virDomainSetMemoryParameters(dom, params, nparams, 0) != 0) + if (virDomainSetMemoryParameters(dom, params, nparams, flags) != 0) vshError(ctl, "%s", _("Unable to change memory parameters")); else ret = true; diff --git a/tools/virsh.pod b/tools/virsh.pod index ef01f41c94..9251db65d7 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -644,6 +644,13 @@ flags, the current settings are displayed; with a flag, the appropriate limit is adjusted if supported by the hypervisor. LXC and QEMU/KVM support I<--hard-limit>, I<--soft-limit>, and I<--swap-hard-limit>. +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. + For QEMU/KVM, the parameters are applied to the QEMU process as a whole. Thus, when counting them, one needs to add up guest RAM, guest video RAM, and some memory overhead of QEMU itself. The last piece is hard to determine so