On Mon, Mar 28, 2016 at 09:30:32PM +0800, Qiaowei Ren wrote:
This patch add new perf command to enable/disable perf event
for a guest domain.
Signed-off-by: Qiaowei Ren <qiaowei.ren(a)intel.com>
---
tools/virsh-domain.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++
tools/virsh.pod | 20 ++++++++
2 files changed, 148 insertions(+)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 17be5b4..0d020a7 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -8506,6 +8506,128 @@ cmdMemtune(vshControl *ctl, const vshCmd *cmd)
}
/*
+ * "perf" command
+ */
+static const vshCmdInfo info_perf[] = {
+ {.name = "help",
+ .data = N_("Get or set perf event")
+ },
+ {.name = "desc",
+ .data = N_("Get or set the current perf events for a guest"
+ " domain.\n"
+ " To get the perf events list use following command:
\n\n"
+ " virsh # perf <domain>")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_perf[] = {
+ {.name = "domain",
+ .type = VSH_OT_DATA,
+ .flags = VSH_OFLAG_REQ,
+ .help = N_("domain name, id or uuid")
+ },
+ {.name = "enable",
+ .type = VSH_OT_STRING,
+ .help = N_("perf events which will be enabled")
+ },
+ {.name = "disable",
+ .type = VSH_OT_STRING,
+ .help = N_("perf events which will be disabled")
+ },
+ {.name = NULL}
+};
+
+static int
+virshParseEventStr(vshControl *ctl,
+ const char *event,
+ bool state,
+ virTypedParameterPtr *params,
+ int *nparams,
+ int *maxparams)
+{
+ char **tok = NULL;
+ size_t i, ntok;
+ int ret = -1;
+
+ if (!(tok = virStringSplitCount(event, "|", 0, &ntok)))
+ return -1;
+
+ if (ntok > VIR_PERF_EVENT_LAST) {
+ vshError(ctl, _("event string '%s' has too many fields"),
event);
+ goto cleanup;
+ }
+
+ for(i = 0; i < ntok; i++) {
Needs space after the 'for'
+ if ((*tok[i] != '\0') &&
+ virTypedParamsAddBoolean(params, nparams,
+ maxparams, tok[i], state) < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ virStringFreeList(tok);
+ return ret;
+}
+
+static bool
+cmdPerf(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom;
+ int nparams = 0;
+ int maxparams = 0;
+ size_t i;
+ virTypedParameterPtr params = NULL;
+ bool ret = false;
+ const char *enable = NULL, *disable = NULL;
+
+ if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ if (vshCommandOptStringReq(ctl, cmd, "enable", &enable) < 0 ||
+ vshCommandOptStringReq(ctl, cmd, "disable", &disable) < 0)
+ return false;
+
+ if (enable && virshParseEventStr(ctl, enable, true,
+ ¶ms, &nparams, &maxparams) < 0)
+ goto cleanup;
+
+ if (disable && virshParseEventStr(ctl, disable, false,
+ ¶ms, &nparams, &maxparams) <
0)
+ goto cleanup;
Using tab instead of space
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|