From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752896AbbJWQlC (ORCPT ); Fri, 23 Oct 2015 12:41:02 -0400 Received: from mail.kernel.org ([198.145.29.136]:42491 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750922AbbJWQlA (ORCPT ); Fri, 23 Oct 2015 12:41:00 -0400 Date: Fri, 23 Oct 2015 13:40:53 -0300 From: Arnaldo Carvalho de Melo To: Ingo Molnar Cc: Namhyung Kim , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Adrian Hunter , Borislav Petkov , Chandler Carruth , Frederic Weisbecker , Stephane Eranian , Wang Nan , Brendan Gregg Subject: Re: [PATCH 1/3] perf tools: Move callchain help messages to callchain.h Message-ID: <20151023164053.GG27006@kernel.org> References: <1445495330-25416-1-git-send-email-namhyung@kernel.org> <20151022080204.GA18916@gmail.com> <20151023095932.GA22657@gmail.com> <20151023142715.GE27006@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151023142715.GE27006@kernel.org> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Fri, Oct 23, 2015 at 11:27:15AM -0300, Arnaldo Carvalho de Melo escreveu: > Em Fri, Oct 23, 2015 at 11:59:32AM +0200, Ingo Molnar escreveu: > > Btw., another usability detail I noticed yesterday is that when I typed 'perf > > report -h' I got so much output that I couldn't find the specific option I was > > looking for, because there's no apparent ordering of the output: > > > > triton:~/tip> perf report -h 2>&1 | grep -e ' -[a-Z],' > > -i, --input input file name > > -v, --verbose be more verbose (show symbol address, etc) > > -D, --dump-raw-trace dump raw trace in ASCII > SNIP: > > -C, --cpu list of cpus to profile > > -I, --show-info Display extended information about perf.data file > > -M, --disassembler-style > > -b, --branch-stack use branch records for per branch histogram filling > > > > Such (alphabetic) ordering would be easier to navigate: > > > > -b, --branch-stack use branch records for per branch histogram filling > > -c, --comms > > -C, --cpu list of cpus to profile > > Try the patch below: > I fixed a case where long options could be NULL and implemented this other patch based on another suggestion you made, which I'll have to fix to check if opt->long_name is NULL ;-) >>From 648b9931e6bccf1d1e1d14474d56b4b687e5fb71 Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Fri, 23 Oct 2015 13:27:39 -0300 Subject: [PATCH 1/1] perf tools: Provide help for subset of options Some tools have a lot of options, so, providing a way to show help just for some of them may come handy: $ perf report -h --tui Usage: perf report [] --tui Use the TUI interface $ perf report -h --tui --showcpuutilization -b -c Usage: perf report [] -b, --branch-stack use branch records for per branch histogram filling -c, --comms only consider symbols in these comms --showcpuutilization Show sample percentage for different cpu modes --tui Use the TUI interface $ Using it with perf bash completion is also handy, just make sure you source the needed file: $ . ~/git/linux/tools/perf/perf-completion.sh Then press tab/tab after -- to see a list of options, put them after -h and only the options chosen will have its help presented: $ perf report -h -- --asm-raw --demangle-kernel --group --kallsyms --pretty --stdio --branch-history --disassembler-style --gtk --max-stack --showcpuutilization --symbol-filter --branch-stack --dsos --header --mem-mode --show-info --symbols --call-graph --dump-raw-trace --header-only --modules --show-nr-samples --symfs --children --exclude-other --hide-unresolved --objdump --show-ref-call-graph --threads --column-widths --fields --ignore-callees --parent --show-total-period --tid --comms --field-separator --input --percentage --socket-filter --tui --cpu --force --inverted --percent-limit --sort --verbose --demangle --full-source-path --itrace --pid --source --vmlinux $ perf report -h --socket-filter Usage: perf report [] --socket-filter only show processor socket that match with this filter Suggested-by: Ingo Molnar Cc: Adrian Hunter Cc: Borislav Petkov Cc: Brendan Gregg : Chandler Carruth Cc: David Ahern Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Wang Nan Link: http://lkml.kernel.org/n/tip-83mcdd3wj0379jcgea8w0fxa@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/parse-options.c | 42 ++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index fb26532d67c3..47ffa90d1ed4 100644 --- a/tools/perf/util/parse-options.c +++ b/tools/perf/util/parse-options.c @@ -373,7 +373,8 @@ void parse_options_start(struct parse_opt_ctx_t *ctx, } static int usage_with_options_internal(const char * const *, - const struct option *, int); + const struct option *, int, + struct parse_opt_ctx_t *); int parse_options_step(struct parse_opt_ctx_t *ctx, const struct option *options, @@ -397,8 +398,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, if (arg[1] != '-') { ctx->opt = ++arg; - if (internal_help && *ctx->opt == 'h') - return usage_with_options_internal(usagestr, options, 0); + if (internal_help && *ctx->opt == 'h') { + return usage_with_options_internal(usagestr, options, 0, ctx); + } switch (parse_short_opt(ctx, options)) { case -1: return parse_options_usage(usagestr, options, arg, 1); @@ -413,7 +415,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, check_typos(arg, options); while (ctx->opt) { if (internal_help && *ctx->opt == 'h') - return usage_with_options_internal(usagestr, options, 0); + return usage_with_options_internal(usagestr, options, 0, ctx); arg = ctx->opt; switch (parse_short_opt(ctx, options)) { case -1: @@ -446,9 +448,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, arg += 2; if (internal_help && !strcmp(arg, "help-all")) - return usage_with_options_internal(usagestr, options, 1); + return usage_with_options_internal(usagestr, options, 1, ctx); if (internal_help && !strcmp(arg, "help")) - return usage_with_options_internal(usagestr, options, 0); + return usage_with_options_internal(usagestr, options, 0, ctx); if (!strcmp(arg, "list-opts")) return PARSE_OPT_LIST_OPTS; if (!strcmp(arg, "list-cmds")) @@ -682,8 +684,27 @@ out: return ordered; } +static bool option__in_argv(const struct option *opt, const struct parse_opt_ctx_t *ctx) +{ + int i; + + for (i = 1; i < ctx->argc; ++i) { + const char *arg = ctx->argv[i]; + + if (arg[0] != '-') + continue; + + if (arg[1] == opt->short_name || + (arg[1] == '-' && strcmp(opt->long_name, arg + 2) == 0)) + return true; + } + + return false; +} + int usage_with_options_internal(const char * const *usagestr, - const struct option *opts, int full) + const struct option *opts, int full, + struct parse_opt_ctx_t *ctx) { struct option *ordered; @@ -707,8 +728,11 @@ int usage_with_options_internal(const char * const *usagestr, if (ordered) opts = ordered; - for ( ; opts->type != OPTION_END; opts++) + for ( ; opts->type != OPTION_END; opts++) { + if (ctx && ctx->argc > 1 && !option__in_argv(opts, ctx)) + continue; print_option_help(opts, full); + } fputc('\n', stderr); @@ -721,7 +745,7 @@ void usage_with_options(const char * const *usagestr, const struct option *opts) { exit_browser(false); - usage_with_options_internal(usagestr, opts, 0); + usage_with_options_internal(usagestr, opts, 0, NULL); exit(129); } -- 2.1.0