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@xxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list