[libvirt] [PATCH v4 7/8] virsh: implement new command to support perf

Daniel P. Berrange berrange at redhat.com
Tue Mar 29 12:10:35 UTC 2016


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 at 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,
> +                                     &params, &nparams, &maxparams) < 0)
> +        goto cleanup;
> +
> +    if (disable && virshParseEventStr(ctl, disable, false,
> +                                      &params, &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 :|




More information about the libvir-list mailing list