Commit 88c21190 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf annotate: Add --percent-type option

Add --percent-type option to set annotation percent type from following
choices:

  global-period, local-period, global-hits, local-hits

Examples:

  $ perf annotate --percent-type period-local --stdio | head -1
   Percent         |      Source code ... es, percent: local period)
  $ perf annotate --percent-type hits-local --stdio | head -1
   Percent         |      Source code ... es, percent: local hits)
  $ perf annotate --percent-type hits-global --stdio | head -1
   Percent         |      Source code ... es, percent: global hits)
  $ perf annotate --percent-type period-global --stdio | head -1
   Percent         |      Source code ... es, percent: global period)

The local/global keywords set if the percentage is computed in the scope
of the function (local) or the whole data (global).

The period/hits keywords set the base the percentage is computed on -
the samples period or the number of samples (hits).
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20180804130521.11408-20-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 4c04868f
...@@ -118,6 +118,15 @@ OPTIONS ...@@ -118,6 +118,15 @@ OPTIONS
--group:: --group::
Show event group information together Show event group information together
--percent-type::
Set annotation percent type from following choices:
global-period, local-period, global-hits, local-hits
The local/global keywords set if the percentage is computed
in the scope of the function (local) or the whole data (global).
The period/hits keywords set the base the percentage is computed
on - the samples period or the number of samples (hits).
SEE ALSO SEE ALSO
-------- --------
linkperf:perf-record[1], linkperf:perf-report[1] linkperf:perf-record[1], linkperf:perf-report[1]
...@@ -542,6 +542,10 @@ int cmd_annotate(int argc, const char **argv) ...@@ -542,6 +542,10 @@ int cmd_annotate(int argc, const char **argv)
OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode", OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode",
"'always' (default), 'never' or 'auto' only applicable to --stdio mode", "'always' (default), 'never' or 'auto' only applicable to --stdio mode",
stdio__config_color, "always"), stdio__config_color, "always"),
OPT_CALLBACK(0, "percent-type", &annotate.opts, "local-period",
"Set percent type local/global-period/hits",
annotate_parse_percent_type),
OPT_END() OPT_END()
}; };
int ret; int ret;
......
...@@ -2799,3 +2799,55 @@ void annotation_config__init(void) ...@@ -2799,3 +2799,55 @@ void annotation_config__init(void)
annotation__default_options.show_total_period = symbol_conf.show_total_period; annotation__default_options.show_total_period = symbol_conf.show_total_period;
annotation__default_options.show_nr_samples = symbol_conf.show_nr_samples; annotation__default_options.show_nr_samples = symbol_conf.show_nr_samples;
} }
static unsigned int parse_percent_type(char *str1, char *str2)
{
unsigned int type = (unsigned int) -1;
if (!strcmp("period", str1)) {
if (!strcmp("local", str2))
type = PERCENT_PERIOD_LOCAL;
else if (!strcmp("global", str2))
type = PERCENT_PERIOD_GLOBAL;
}
if (!strcmp("hits", str1)) {
if (!strcmp("local", str2))
type = PERCENT_HITS_LOCAL;
else if (!strcmp("global", str2))
type = PERCENT_HITS_GLOBAL;
}
return type;
}
int annotate_parse_percent_type(const struct option *opt, const char *_str,
int unset __maybe_unused)
{
struct annotation_options *opts = opt->value;
unsigned int type;
char *str1, *str2;
int err = -1;
str1 = strdup(_str);
if (!str1)
return -ENOMEM;
str2 = strchr(str1, '-');
if (!str2)
goto out;
*str2++ = 0;
type = parse_percent_type(str1, str2);
if (type == (unsigned int) -1)
type = parse_percent_type(str2, str1);
if (type != (unsigned int) -1) {
opts->percent_type = type;
err = 0;
}
out:
free(str1);
return err;
}
...@@ -397,4 +397,6 @@ static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused, ...@@ -397,4 +397,6 @@ static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
void annotation_config__init(void); void annotation_config__init(void);
int annotate_parse_percent_type(const struct option *opt, const char *_str,
int unset);
#endif /* __PERF_ANNOTATE_H */ #endif /* __PERF_ANNOTATE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment