Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf report: Fix some option handling on --stdio

There's a bug that perf report sometimes ignore some options on --stdio
output. This bug is triggered only if a related config variable is set.
For example, let's assume we have a following config file.

$ cat ~/.perfconfig
[call-graph]
print-type = graph
[hist]
percentage = absolute

Then, following perf config will not honor some options.

$ perf record -ag sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.199 MB perf.data (77 samples) ]

$ perf report -g none --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
# Samples: 77 of event 'cycles'
# Event count (approx.): 25425383
#
# Overhead Command Shared Object Symbol
# ........ ............... ....................... ..............
#
16.34% swapper [kernel.vmlinux] [k] intel_idle
|
---intel_idle
cpuidle_enter_state
cpuidle_enter
cpu_startup_entry
...

With '-g none' option, it should not show callchains, but it still shows
callchains. However it works as expected on --tui output.

Similarly, '--percentage relative' option is not work and still shows a
absolute percentage values.

Looking at the source, I found that those setting were overwritten by
config variables when setup_pager() called. The setup_pager() is to
start a pager process so that it can manage long lines of output on the
stdio mode. But as it calls the perf_config() after parsing arguments,
the settings were overwritten regardless of command line options.

The reason it calls perf_config() is to find the 'pager_program' which
might be set by a config variable, I guess. However current perf code
does not provide the config variable for it, so it's just meaningless
IMHO. Eliminating the call makes the option working as expected.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Taeung Song <treeze.taeung@gmail.com>
Link: http://lkml.kernel.org/r/1431529406-6762-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
4fd113b5 d4c537e6

-7
-1
tools/perf/util/cache.h
··· 30 30 31 31 /* pager.c */ 32 32 extern void setup_pager(void); 33 - extern const char *pager_program; 34 33 extern int pager_in_use(void); 35 34 extern int pager_use_color; 36 35
-1
tools/perf/util/environment.c
··· 5 5 */ 6 6 #include "cache.h" 7 7 8 - const char *pager_program; 9 8 int pager_use_color = 1;
-5
tools/perf/util/pager.c
··· 50 50 51 51 if (!isatty(1)) 52 52 return; 53 - if (!pager) { 54 - if (!pager_program) 55 - perf_config(perf_default_config, NULL); 56 - pager = pager_program; 57 - } 58 53 if (!pager) 59 54 pager = getenv("PAGER"); 60 55 if (!(pager || access("/usr/bin/pager", X_OK)))