diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index a1cc1e10e7..b1c3bfca3e 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4664,7 +4664,16 @@ qemu-kvm -net nic,model=? /dev/null
The optional period
allows the QEMU virtio memory
balloon driver to provide statistics through the virsh
- dommemstat [domain]
command.
+ dommemstat [domain] command. By default, collection is
+ not enabled. In order to enable, use the virsh dommemstat
+ [domain] --period [number]
command or virsh edit
+ command to add the option to the XML definition.
+ The virsh dommemstat
will accept the options
+ --live
, --current
, or --config
.
+ If an option is not provided, the change for a running domain will
+ only be made to the active guest.
+ If the QEMU driver is not at the right
+ revision, the attempt to set the period will fail.
Since 1.1.1, requires QEMU 1.5
diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index 5fbd32c164..773f96d8b6 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -314,6 +314,23 @@ static const vshCmdOptDef opts_dommemstat[] = {
.flags = VSH_OFLAG_REQ,
.help = N_("domain name, id or uuid")
},
+ {.name = "period",
+ .type = VSH_OT_DATA,
+ .flags = VSH_OFLAG_REQ_OPT,
+ .help = N_("period in seconds to set collection")
+ },
+ {.name = "config",
+ .type = VSH_OT_BOOL,
+ .help = N_("affect next boot")
+ },
+ {.name = "live",
+ .type = VSH_OT_BOOL,
+ .help = N_("affect running domain")
+ },
+ {.name = "current",
+ .type = VSH_OT_BOOL,
+ .help = N_("affect current domain")
+ },
{.name = NULL}
};
@@ -325,15 +342,56 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
struct _virDomainMemoryStat stats[VIR_DOMAIN_MEMORY_STAT_NR];
unsigned int nr_stats;
size_t i;
+ int ret = false;
+ int rv = 0;
+ int period = -1;
+ bool config = vshCommandOptBool(cmd, "config");
+ bool live = vshCommandOptBool(cmd, "live");
+ bool current = vshCommandOptBool(cmd, "current");
+ unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
+
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
+ VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
+ if (config)
+ flags |= VIR_DOMAIN_AFFECT_CONFIG;
+ if (live)
+ flags |= VIR_DOMAIN_AFFECT_LIVE;
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return false;
+ /* If none of the options were specified and we're active
+ * then be sure to allow active modification */
+ if (!current && !live && !config && virDomainIsActive(dom) == 1)
+ flags |= VIR_DOMAIN_AFFECT_LIVE;
+
+ /* Providing a period will adjust the balloon driver collection period.
+ * This is not really an unsigned long, but it
+ */
+ if ((rv = vshCommandOptInt(cmd, "period", &period)) < 0) {
+ vshError(ctl, "%s",
+ _("Unable to parse integer parameter."));
+ goto cleanup;
+ }
+ if (rv > 0) {
+ if (period < 0) {
+ vshError(ctl, _("Invalid collection period value '%d'"), period);
+ goto cleanup;
+ }
+
+ if (virDomainSetMemoryStatsPeriod(dom, period, flags) < 0) {
+ vshError(ctl, "%s",
+ _("Unable to change balloon collection period."));
+ } else {
+ ret = true;
+ }
+ goto cleanup;
+ }
+
nr_stats = virDomainMemoryStats(dom, stats, VIR_DOMAIN_MEMORY_STAT_NR, 0);
if (nr_stats == -1) {
vshError(ctl, _("Failed to get memory statistics for domain %s"), name);
- virDomainFree(dom);
- return false;
+ goto cleanup;
}
for (i = 0; i < nr_stats; i++) {
@@ -355,8 +413,10 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "rss %llu\n", stats[i].val);
}
+ ret = true;
+cleanup:
virDomainFree(dom);
- return true;
+ return ret;
}
/*
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 51644d911c..7008a578ff 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -668,10 +668,30 @@ 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.
-=item B I
+=item B I [I<--period> B]
+[[I<--config>] [I<--live>] | [I<--current>]]
Get memory stats for a running domain.
+Depending on the hypervisor a variety of statistics can be returned
+
+For QEMU/KVM with a memory balloon, setting the optional I<--period> to a
+value larger than 0 in seconds will allow the balloon driver to return
+additional statistics which will be displayed by subsequent B
+commands. Setting the I<--period> to 0 will stop the balloon driver collection,
+but does not clear the statistics in the balloon driver. Requires at least
+QEMU/KVM 1.5 to be running on the host.
+
+The I<--live>, I<--config>, and I<--current> flags are only valid when using
+the I<--period> option in order to set the collection period for the balloon
+driver. If I<--live> is specified, only the running guest collection period
+is affected. 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<--config> flags may be given, but I<--current> is
+exclusive. If no flag is specified, behavior is different depending
+on the guest state.
+
=item B I
Show errors on block devices. This command usually comes handy when