Em Thu, Oct 22, 2015 at 11:28:32PM +0900, Namhyung Kim escreveu:
> The --call-graph option is complex so we should provide better guide for
> users.  Also change help message to be consistent with config option
> names.  Now perf top will show help like below:
> 
>   $ perf top --call-graph
>     Error: option `call-graph' requires a value
> 
>    Usage: perf top [<options>]
> 
>       --call-graph 
> <record_mode[,record_size],print_type,threshold[,print_limit],order,sort_key[,branch]>
>            setup and enables call-graph (stack chain/backtrace):
> 
>               record_mode:    call graph recording mode (fp|dwarf|lbr)
>               record_size:    if record_mode is 'dwarf', max size of stack 
> recording (<bytes>)
>                               default: 8192 (bytes)
>               print_type:     call graph printing style 
> (graph|flat|fractal|none)
>               threshold:      minimum call graph inclusion threshold 
> (<percent>)
>               print_limit:    maximum number of call graph entry (<number>)
>               order:          call graph order (caller|callee)
>               sort_key:       call graph sort key (function|address)
>               branch:         include last branch info to call graph (branch)
> 
>               Default: fp,graph,0.5,caller,function

At some point it would be nice to be able to use:

        perf top --call-graph caller

And have that be equivalent to:

        perf top --callgraph fp,graph,0.5,caller,function

I.e. change just one of the defaults.

But I think that how you did it is backwards compatible, i.e. adding
stuff just to the end.

Ah, noticed you forgot to update the 'top' man page

- Arnaldo

> 
> Requested-by: Ingo Molnar <mi...@kernel.org>
> Cc: Adrian Hunter <adrian.hun...@intel.com>
> Cc: Borislav Petkov <b...@suse.de>
> Cc: Brendan Gregg <brendan.d.gr...@gmail.com>
> Cc: Chandler Carruth <chandl...@gmail.com>
> Cc: Frederic Weisbecker <fweis...@gmail.com>
> Cc: Stephane Eranian <eran...@google.com>
> Cc: Wang Nan <wangn...@huawei.com>
> Signed-off-by: Namhyung Kim <namhy...@kernel.org>
> ---
>  tools/perf/Documentation/perf-record.txt |  9 ++++++--
>  tools/perf/Documentation/perf-report.txt | 38 
> ++++++++++++++++++++------------
>  tools/perf/builtin-record.c              |  5 +++--
>  tools/perf/builtin-report.c              | 11 +++++----
>  tools/perf/builtin-top.c                 |  5 +++--
>  tools/perf/util/callchain.h              | 24 +++++++++++++++-----
>  6 files changed, 62 insertions(+), 30 deletions(-)
> 
> diff --git a/tools/perf/Documentation/perf-record.txt 
> b/tools/perf/Documentation/perf-record.txt
> index b027d28658f2..7ff6a9d0ea0d 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -144,7 +144,7 @@ OPTIONS
>  
>  --call-graph::
>       Setup and enable call-graph (stack chain/backtrace) recording,
> -     implies -g.
> +     implies -g.  Default is "fp".
>  
>       Allows specifying "fp" (frame pointer) or "dwarf"
>       (DWARF's CFI - Call Frame Information) or "lbr"
> @@ -154,13 +154,18 @@ OPTIONS
>       In some systems, where binaries are build with gcc
>       --fomit-frame-pointer, using the "fp" method will produce bogus
>       call graphs, using "dwarf", if available (perf tools linked to
> -     the libunwind library) should be used instead.
> +     the libunwind or libdw library) should be used instead.
>       Using the "lbr" method doesn't require any compiler options. It
>       will produce call graphs from the hardware LBR registers. The
>       main limition is that it is only available on new Intel
>       platforms, such as Haswell. It can only get user call chain. It
>       doesn't work with branch stack sampling at the same time.
>  
> +     When "dwarf" recording is used, perf also records (user) stack dump
> +     when sampled.  Default size of the stack dump is 8192 (bytes).
> +     User can change the size by passing the size after comma like
> +     "--call-graph dwarf,4096".
> +
>  -q::
>  --quiet::
>       Don't print any message, useful for scripting.
> diff --git a/tools/perf/Documentation/perf-report.txt 
> b/tools/perf/Documentation/perf-report.txt
> index e4fdeeb51123..ab1fd64e3627 100644
> --- a/tools/perf/Documentation/perf-report.txt
> +++ b/tools/perf/Documentation/perf-report.txt
> @@ -169,30 +169,40 @@ OPTIONS
>  --dump-raw-trace::
>          Dump raw trace in ASCII.
>  
> --g [type,min[,limit],order[,key][,branch]]::
> ---call-graph::
> -        Display call chains using type, min percent threshold, optional print
> -     limit and order.
> -     type can be either:
> +-g::
> +--call-graph=<print_type,threshold[,print_limit],order,sort_key,branch>::
> +        Display call chains using type, min percent threshold, print limit,
> +     call order, sort key and branch.  Note that ordering of parameters is 
> not
> +     fixed so any parement can be given in an arbitraty order.  One exception
> +     is the print_limit which should be preceded by threshold.
> +
> +     print_type can be either:
>       - flat: single column, linear exposure of call chains.
> -     - graph: use a graph tree, displaying absolute overhead rates.
> +     - graph: use a graph tree, displaying absolute overhead rates. (default)
>       - fractal: like graph, but displays relative rates. Each branch of
> -              the tree is considered as a new profiled object. +
> +              the tree is considered as a new profiled object.
> +     - none: disable call chain display.
> +
> +     threshold is a percentage value which specifies a minimum percent to be
> +     included in the output call graph.  Default is 0.5 (%).
> +
> +     print_limit is only applied when stdio interface is used.  It's to limit
> +     number of call graph entries in a single hist entry.  Note that it needs
> +     to be given after threshold (but not necessarily consecutive).
> +     Default is 0 (unlimited).
>  
>       order can be either:
>       - callee: callee based call graph.
>       - caller: inverted caller based call graph.
> +     Default is 'caller' when --children is used, otherwise 'callee'.
>  
> -     key can be:
> -     - function: compare on functions
> +     sort_key can be:
> +     - function: compare on functions (default)
>       - address: compare on individual code addresses
>  
>       branch can be:
> -     - branch: include last branch information in callgraph
> -     when available. Usually more convenient to use --branch-history
> -     for this.
> -
> -     Default: graph,0.5,caller
> +     - branch: include last branch information in callgraph when available.
> +               Usually more convenient to use --branch-history for this.
>  
>  --children::
>       Accumulate callchain of children to parent entry so that then can
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 1a117623d396..2740d7a82ae8 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1010,7 +1010,8 @@ static struct record record = {
>       },
>  };
>  
> -const char record_callchain_help[] = CALLCHAIN_RECORD_HELP;
> +const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
> +     "\n\t\t\t\tDefault: fp";
>  
>  /*
>   * XXX Will stay a global variable till we fix builtin-script.c to stop 
> messing
> @@ -1058,7 +1059,7 @@ struct option __record_options[] = {
>                          NULL, "enables call-graph recording" ,
>                          &record_callchain_opt),
>       OPT_CALLBACK(0, "call-graph", &record.opts,
> -                  "mode[,dump_size]", record_callchain_help,
> +                  "record_mode[,record_size]", record_callchain_help,
>                    &record_parse_callchain_opt),
>       OPT_INCR('v', "verbose", &verbose,
>                   "be more verbose (show counter open errors, etc)"),
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index 545c51cef7f7..50dd4d3d8667 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -625,8 +625,11 @@ parse_percent_limit(const struct option *opt, const char 
> *str,
>       return 0;
>  }
>  
> -const char report_callchain_help[] = "Display callchains using " 
> CALLCHAIN_REPORT_HELP ". "
> -                                  "Default: graph,0.5,caller";
> +#define CALLCHAIN_DEFAULT_OPT  "graph,0.5,caller,function"
> +
> +const char report_callchain_help[] = "Display call graph (stack 
> chain/backtrace):\n\n"
> +                                  CALLCHAIN_REPORT_HELP
> +                                  "\n\t\t\t\tDefault: " 
> CALLCHAIN_DEFAULT_OPT;
>  
>  int cmd_report(int argc, const char **argv, const char *prefix 
> __maybe_unused)
>  {
> @@ -636,7 +639,7 @@ int cmd_report(int argc, const char **argv, const char 
> *prefix __maybe_unused)
>       bool has_br_stack = false;
>       int branch_mode = -1;
>       bool branch_call_mode = false;
> -     char callchain_default_opt[] = "graph,0.5,caller";
> +     char callchain_default_opt[] = CALLCHAIN_DEFAULT_OPT;
>       const char * const report_usage[] = {
>               "perf report [<options>]",
>               NULL
> @@ -703,7 +706,7 @@ int cmd_report(int argc, const char **argv, const char 
> *prefix __maybe_unused)
>       OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
>                   "Only display entries with parent-match"),
>       OPT_CALLBACK_DEFAULT('g', "call-graph", &report,
> -                          
> "output_type,min_percent[,print_limit],call_order[,branch]",
> +                          
> "print_type,threshold[,print_limit],order,sort_key[,branch]",
>                            report_callchain_help, &report_parse_callchain_opt,
>                            callchain_default_opt),
>       OPT_BOOLEAN(0, "children", &symbol_conf.cumulate_callchain,
> diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
> index af849b1d7389..7e2e72e6d9d1 100644
> --- a/tools/perf/builtin-top.c
> +++ b/tools/perf/builtin-top.c
> @@ -1093,7 +1093,8 @@ parse_percent_limit(const struct option *opt, const 
> char *arg,
>       return 0;
>  }
>  
> -const char top_callchain_help[] = CALLCHAIN_RECORD_HELP ", " 
> CALLCHAIN_REPORT_HELP;
> +const char top_callchain_help[] = CALLCHAIN_RECORD_HELP CALLCHAIN_REPORT_HELP
> +     "\n\t\t\t\tDefault: fp,graph,0.5,caller,function";
>  
>  int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
>  {
> @@ -1173,7 +1174,7 @@ int cmd_top(int argc, const char **argv, const char 
> *prefix __maybe_unused)
>                          NULL, "enables call-graph recording and display",
>                          &callchain_opt),
>       OPT_CALLBACK(0, "call-graph", &top.record_opts,
> -                  
> "mode[,dump_size],output_type,min_percent[,print_limit],call_order[,branch]",
> +                  
> "record_mode[,record_size],print_type,threshold[,print_limit],order,sort_key[,branch]",
>                    top_callchain_help, &parse_callchain_opt),
>       OPT_BOOLEAN(0, "children", &symbol_conf.cumulate_callchain,
>                   "Accumulate callchains of children and show total overhead 
> as well"),
> diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
> index aaf467c9ef2b..fce8161e54db 100644
> --- a/tools/perf/util/callchain.h
> +++ b/tools/perf/util/callchain.h
> @@ -7,17 +7,29 @@
>  #include "event.h"
>  #include "symbol.h"
>  
> -#define CALLCHAIN_HELP "setup and enables call-graph (stack chain/backtrace) 
> recording: "
> +#define HELP_PAD "\t\t\t\t"
> +
> +#define CALLCHAIN_HELP "setup and enables call-graph (stack 
> chain/backtrace):\n\n"
>  
>  #ifdef HAVE_DWARF_UNWIND_SUPPORT
> -#define CALLCHAIN_RECORD_HELP  CALLCHAIN_HELP "fp dwarf lbr"
> +# define RECORD_MODE_HELP  HELP_PAD "record_mode:\tcall graph recording mode 
> (fp|dwarf|lbr)\n"
>  #else
> -#define CALLCHAIN_RECORD_HELP  CALLCHAIN_HELP "fp lbr"
> +# define RECORD_MODE_HELP  HELP_PAD "record_mode:\tcall graph recording mode 
> (fp|lbr)\n"
>  #endif
>  
> -#define CALLCHAIN_REPORT_HELP  "output_type (graph, flat, fractal, or none), 
> " \
> -     "min percent threshold, optional print limit, callchain order, " \
> -     "key (function or address), add branches"
> +#define RECORD_SIZE_HELP                                             \
> +     HELP_PAD "record_size:\tif record_mode is 'dwarf', max size of stack 
> recording (<bytes>)\n" \
> +     HELP_PAD "\t\tdefault: 8192 (bytes)\n"
> +
> +#define CALLCHAIN_RECORD_HELP  CALLCHAIN_HELP RECORD_MODE_HELP 
> RECORD_SIZE_HELP
> +
> +#define CALLCHAIN_REPORT_HELP                                                
> \
> +     HELP_PAD "print_type:\tcall graph printing style 
> (graph|flat|fractal|none)\n" \
> +     HELP_PAD "threshold:\tminimum call graph inclusion threshold 
> (<percent>)\n" \
> +     HELP_PAD "print_limit:\tmaximum number of call graph entry 
> (<number>)\n" \
> +     HELP_PAD "order:\t\tcall graph order (caller|callee)\n" \
> +     HELP_PAD "sort_key:\tcall graph sort key (function|address)\n"  \
> +     HELP_PAD "branch:\t\tinclude last branch info to call graph (branch)\n"
>  
>  enum perf_call_graph_mode {
>       CALLCHAIN_NONE,
> -- 
> 2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to