Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1430186 > unrolled thread
| Started by | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| First post | 2016-06-23 23:30 +0200 |
| Last post | 2016-06-26 12:50 +0200 |
| Articles | 12 — 2 participants |
Back to article view | Back to linux.kernel
[GIT PULL 00/27] perf/core improvements and fixes Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:30 +0200
[PATCH 26/27] perf config: Introduce new init() and exit() Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:30 +0200
[PATCH 23/27] perf script: Print sample flags more nicely Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:30 +0200
[PATCH 05/27] perf hists browser: Move horizontal scroll init to new() Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 07/27] perf hists browser: Introduce init() Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 06/27] perf hists browser: Introduce perf_evsel_browser constructor Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 02/27] perf hists browser: Move hist_browser into header file Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 04/27] perf hists browser: Introduce struct hist_browser title callback Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 11/27] perf tests time-to-tsc: No need to disable an event before deleting it Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 03/27] perf hists browser: Make (new|delete|run) public Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
[PATCH 24/27] perf auxtrace: Add option to feed branches to the thread stack Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-23 23:40 +0200
Re: [GIT PULL 00/27] perf/core improvements and fixes Ingo Molnar <mingo@kernel.org> - 2016-06-26 12:50 +0200
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:30 +0200 |
| Subject | [GIT PULL 00/27] perf/core improvements and fixes |
| Message-ID | <rNkmd-7qp-3@gated-at.bofh.it> |
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit 4330b439bbe16b48dd2fe9a379bd58a07b97aab8:
Merge tag 'perf-core-for-mingo-20160621' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-06-22 09:34:19 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160623
for you to fetch changes up to 4a35b3497c413de8b409f9d75700eeb4772b21b8:
perf config: Reimplement show_config() using config_set__for_each (2016-06-23 17:23:00 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
New features:
- Add 'callindent' option to 'perf script -F', to indent the Intel PT
call stack, making this output more ftrace-like (Adrian Hunter, Andi Kleen)
User visible:
- Enlarge 'pid' column width, to cope with large pids (Jiri Olsa)
Infrastructure:
- Cross platform unwind fixes (He Kuang)
- Make destructors accept NULL, behaving like free() (Arnaldo Carvalho de Melo)
- Remove reference to perl interpreted in the recently added 'perf script'
stackcollapse python script (Arnaldo Carvalho de Melo)
- Rename CLASS__for_each() macros to CLASS__for_each_entry(), to use the
list_for_each_entry() semantics, as most of these class specific loop helpers
are list_for_each_entry*() wrappers (Arnaldo Carvalho de Melo)
- Expose the hist_browser code, will be used with data structures other
than perf_evsel (Jiri Olsa)
- 'perf config' refactorings (Taeung Song)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
----------------------------------------------------------------
Adrian Hunter (3):
perf script: Print sample flags more nicely
perf auxtrace: Add option to feed branches to the thread stack
perf script: Add callindent option
Arnaldo Carvalho de Melo (9):
perf script stackcollapse: Remove reference to the perl interpreter
perf evlist: Destructors should accept NULL
perf session: Destructors should accept NULL
perf tests time-to-tsc: No need to disable an event before deleting it
perf machine: Destructors should accept NULL
perf evlist: Rename for_each() macros to for_each_entry()
perf tools: Rename strlist_for_each() macros to for_each_entry()
perf rb_resort: Rename for_each() macros to for_each_entry()
perf intlist: Rename for_each() macros to for_each_entry()
He Kuang (5):
perf tools: Let python use correct gcc for build_ext
perf tools: Find right DSO taking into account if binary is 32 or 64-bit
perf unwind: Change macro names of perf register
perf unwind: Fix wrongly used regs for x86_32 unwind
perf unwind: Fix wrongly used regs for aarch64 unwind
Jiri Olsa (7):
perf hists browser: Move hist_browser into header file
perf hists browser: Make (new|delete|run) public
perf hists browser: Introduce struct hist_browser title callback
perf hists browser: Move horizontal scroll init to new()
perf hists browser: Introduce perf_evsel_browser constructor
perf hists browser: Introduce init()
perf hists: Enlarge pid sort entry size
Taeung Song (3):
perf config: Move config declarations from util/cache.h to util/config.h
perf config: Introduce new init() and exit()
perf config: Reimplement show_config() using config_set__for_each
tools/perf/Documentation/perf-script.txt | 11 ++-
tools/perf/Makefile.perf | 3 +-
tools/perf/arch/x86/tests/perf-time-to-tsc.c | 6 +-
tools/perf/arch/x86/util/auxtrace.c | 2 +-
tools/perf/arch/x86/util/intel-bts.c | 8 +-
tools/perf/arch/x86/util/intel-pt.c | 10 +--
tools/perf/builtin-annotate.c | 2 +-
tools/perf/builtin-buildid-cache.c | 13 ++-
tools/perf/builtin-config.c | 21 +++--
tools/perf/builtin-diff.c | 10 +--
tools/perf/builtin-evlist.c | 2 +-
tools/perf/builtin-help.c | 2 +-
tools/perf/builtin-inject.c | 8 +-
tools/perf/builtin-kmem.c | 4 +-
tools/perf/builtin-kvm.c | 8 +-
tools/perf/builtin-probe.c | 4 +-
tools/perf/builtin-record.c | 3 +-
tools/perf/builtin-report.c | 12 +--
tools/perf/builtin-script.c | 115 +++++++++++++++++++++++++--
tools/perf/builtin-stat.c | 22 ++---
tools/perf/builtin-top.c | 10 +--
tools/perf/builtin-trace.c | 10 +--
tools/perf/perf.c | 4 +-
tools/perf/scripts/python/stackcollapse.py | 2 -
tools/perf/tests/backward-ring-buffer.c | 2 +-
tools/perf/tests/event-times.c | 3 +-
tools/perf/tests/evsel-roundtrip-name.c | 2 +-
tools/perf/tests/hists_filter.c | 4 +-
tools/perf/tests/hists_link.c | 4 +-
tools/perf/tests/mmap-basic.c | 2 +-
tools/perf/tests/parse-events.c | 4 +-
tools/perf/tests/parse-no-sample-id-all.c | 3 +-
tools/perf/tests/switch-tracking.c | 2 +-
tools/perf/ui/browser.c | 2 +-
tools/perf/ui/browsers/annotate.c | 1 +
tools/perf/ui/browsers/hists.c | 109 ++++++++++++-------------
tools/perf/ui/browsers/hists.h | 32 ++++++++
tools/perf/ui/gtk/hists.c | 2 +-
tools/perf/ui/hist.c | 2 +-
tools/perf/util/alias.c | 1 +
tools/perf/util/auxtrace.h | 2 +
tools/perf/util/cache.h | 11 ---
tools/perf/util/cgroup.c | 4 +-
tools/perf/util/color.c | 1 +
tools/perf/util/config.c | 92 ++++++++++-----------
tools/perf/util/config.h | 40 ++++++++++
tools/perf/util/data-convert-bt.c | 4 +-
tools/perf/util/evlist.c | 59 +++++++-------
tools/perf/util/evlist.h | 40 +++++-----
tools/perf/util/header.c | 18 ++---
tools/perf/util/help-unknown-cmd.c | 1 +
tools/perf/util/hist.c | 4 +-
tools/perf/util/intel-bts.c | 24 ++++--
tools/perf/util/intel-pt.c | 26 +++---
tools/perf/util/intlist.h | 8 +-
tools/perf/util/jitdump.c | 2 +-
tools/perf/util/libunwind/arm64.c | 5 ++
tools/perf/util/libunwind/x86_32.c | 6 ++
tools/perf/util/llvm-utils.c | 1 +
tools/perf/util/machine.c | 6 +-
tools/perf/util/parse-events.c | 4 +-
tools/perf/util/probe-event.c | 12 ++-
tools/perf/util/probe-file.c | 8 +-
tools/perf/util/python.c | 2 +-
tools/perf/util/rb_resort.h | 4 +-
tools/perf/util/record.c | 8 +-
tools/perf/util/session.c | 12 +--
tools/perf/util/sort.c | 14 ++--
tools/perf/util/stat.c | 6 +-
tools/perf/util/strlist.h | 4 +-
tools/perf/util/symbol.c | 2 +-
tools/perf/util/thread-stack.c | 7 ++
tools/perf/util/thread-stack.h | 1 +
tools/perf/util/thread_map.c | 4 +-
tools/perf/util/unwind-libunwind-local.c | 6 +-
tools/perf/util/unwind.h | 9 +++
tools/perf/util/vdso.c | 40 +++++++++-
77 files changed, 606 insertions(+), 358 deletions(-)
create mode 100644 tools/perf/ui/browsers/hists.h
[toc] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:30 +0200 |
| Subject | [PATCH 26/27] perf config: Introduce new init() and exit() |
| Message-ID | <rNkmf-7qp-53@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Taeung Song <treeze.taeung@gmail.com>
Many sub-commands use perf_config() but everytime perf_config() is
called, perf_config() always read config files. (i.e. user config
'~/.perfconfig' and system config '$(sysconfdir)/perfconfig')
But it is better to use the config set that already contains all config
key-value pairs to avoid this repetitive work reading the config files
in perf_config(). (the config set mean a static variable 'config_set')
In other words, if new perf_config__init() is called, only first time
'config_set' is initialized collecting all configs from the config
files. And then we could use new perf_config() like old perf_config().
When a sub-command finished, free the config set by perf_config__exit()
at run_builtin().
If we do, 'config_set' can be reused wherever perf_config() is called
and a feature of old perf_config() is the same as new perf_config() work
without the repetitive work that read the config files.
In summary, in order to use features about configuration,
we can call the functions at perf.c and other source files as below.
# initialize a config set
perf_config__init()
# configure actual variables from a config set
perf_config()
# eliminate allocated config set
perf_config__exit()
# destroy existing config set and initialize a new config set.
perf_config__refresh()
Signed-off-by: Taeung Song <treeze.taeung@gmail.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1466691272-24117-3-git-send-email-treeze.taeung@gmail.com
[ 'init' counterpart is 'exit', not 'finish' ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-config.c | 4 ++
tools/perf/perf.c | 2 +
tools/perf/util/config.c | 92 +++++++++++++++++++++++----------------------
tools/perf/util/config.h | 29 ++++++++++++++
4 files changed, 82 insertions(+), 45 deletions(-)
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index fe1b77fa21f9..cfd1036b1d24 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -80,6 +80,10 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)
else if (use_user_config)
config_exclusive_filename = user_config;
+ /*
+ * At only 'config' sub-command, individually use the config set
+ * because of reinitializing with options config file location.
+ */
set = perf_config_set__new();
if (!set) {
ret = -1;
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 66772dafa3ec..8f219223f305 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -355,6 +355,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
perf_env__set_cmdline(&perf_env, argc, argv);
status = p->fn(argc, argv, prefix);
+ perf_config__exit();
exit_browser(status);
perf_env__exit(&perf_env);
bpf__clear();
@@ -522,6 +523,7 @@ int main(int argc, const char **argv)
srandom(time(NULL));
+ perf_config__init();
perf_config(perf_default_config, NULL);
set_buildid_dir(NULL);
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index d15c59267644..18dae745034f 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -26,6 +26,7 @@ static FILE *config_file;
static const char *config_file_name;
static int config_linenr;
static int config_file_eof;
+static struct perf_config_set *config_set;
const char *config_exclusive_filename;
@@ -478,51 +479,6 @@ static int perf_config_global(void)
return !perf_env_bool("PERF_CONFIG_NOGLOBAL", 0);
}
-int perf_config(config_fn_t fn, void *data)
-{
- int ret = -1;
- const char *home = NULL;
-
- /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
- if (config_exclusive_filename)
- return perf_config_from_file(fn, config_exclusive_filename, data);
- if (perf_config_system() && !access(perf_etc_perfconfig(), R_OK)) {
- if (perf_config_from_file(fn, perf_etc_perfconfig(), data) < 0)
- goto out;
- }
-
- home = getenv("HOME");
- if (perf_config_global() && home) {
- char *user_config = strdup(mkpath("%s/.perfconfig", home));
- struct stat st;
-
- if (user_config == NULL) {
- warning("Not enough memory to process %s/.perfconfig, "
- "ignoring it.", home);
- goto out;
- }
-
- if (stat(user_config, &st) < 0)
- goto out_free;
-
- if (st.st_uid && (st.st_uid != geteuid())) {
- warning("File %s not owned by current user or root, "
- "ignoring it.", user_config);
- goto out_free;
- }
-
- if (!st.st_size)
- goto out_free;
-
- ret = perf_config_from_file(fn, user_config, data);
-
-out_free:
- free(user_config);
- }
-out:
- return ret;
-}
-
static struct perf_config_section *find_section(struct list_head *sections,
const char *section_name)
{
@@ -706,6 +662,52 @@ struct perf_config_set *perf_config_set__new(void)
return set;
}
+int perf_config(config_fn_t fn, void *data)
+{
+ int ret = 0;
+ char key[BUFSIZ];
+ struct perf_config_section *section;
+ struct perf_config_item *item;
+
+ if (config_set == NULL)
+ return -1;
+
+ perf_config_set__for_each_entry(config_set, section, item) {
+ char *value = item->value;
+
+ if (value) {
+ scnprintf(key, sizeof(key), "%s.%s",
+ section->name, item->name);
+ ret = fn(key, value, data);
+ if (ret < 0) {
+ pr_err("Error: wrong config key-value pair %s=%s\n",
+ key, value);
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+
+void perf_config__init(void)
+{
+ if (config_set == NULL)
+ config_set = perf_config_set__new();
+}
+
+void perf_config__exit(void)
+{
+ perf_config_set__delete(config_set);
+ config_set = NULL;
+}
+
+void perf_config__refresh(void)
+{
+ perf_config__exit();
+ perf_config__init();
+}
+
static void perf_config_item__delete(struct perf_config_item *item)
{
zfree(&item->name);
diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h
index 155a441343e2..6f813d46045e 100644
--- a/tools/perf/util/config.h
+++ b/tools/perf/util/config.h
@@ -33,5 +33,34 @@ const char *perf_etc_perfconfig(void);
struct perf_config_set *perf_config_set__new(void);
void perf_config_set__delete(struct perf_config_set *set);
+void perf_config__init(void);
+void perf_config__exit(void);
+void perf_config__refresh(void);
+
+/**
+ * perf_config_sections__for_each - iterate thru all the sections
+ * @list: list_head instance to iterate
+ * @section: struct perf_config_section iterator
+ */
+#define perf_config_sections__for_each_entry(list, section) \
+ list_for_each_entry(section, list, node)
+
+/**
+ * perf_config_items__for_each - iterate thru all the items
+ * @list: list_head instance to iterate
+ * @item: struct perf_config_item iterator
+ */
+#define perf_config_items__for_each_entry(list, item) \
+ list_for_each_entry(item, list, node)
+
+/**
+ * perf_config_set__for_each - iterate thru all the config section-item pairs
+ * @set: evlist instance to iterate
+ * @section: struct perf_config_section iterator
+ * @item: struct perf_config_item iterator
+ */
+#define perf_config_set__for_each_entry(set, section, item) \
+ perf_config_sections__for_each_entry(&set->sections, section) \
+ perf_config_items__for_each_entry(§ion->items, item)
#endif /* __PERF_CONFIG_H */
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:30 +0200 |
| Subject | [PATCH 23/27] perf script: Print sample flags more nicely |
| Message-ID | <rNkmf-7qp-51@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Adrian Hunter <adrian.hunter@intel.com>
The flags field is synthesized and may have a value when Instruction
Trace decoding. The flags are "bcrosyiABEx" which stand for branch,
call, return, conditional, system, asynchronous, interrupt, transaction
abort, trace begin, trace end, and in transaction, respectively.
Change the display so that known combinations of flags are printed more
nicely e.g.: "call" for "bc", "return" for "br", "jcc" for "bo", "jmp"
for "b", "int" for "bci", "iret" for "bri", "syscall" for "bcs",
"sysret" for "brs", "async" for "by", "hw int" for "bcyi", "tx abrt" for
"bA", "tr strt" for "bB", "tr end" for "bE".
However the "x" flag will be displayed separately in those cases e.g.
"jcc (x)" for a condition branch within a transaction.
Example:
perf record -e intel_pt//u ls
perf script --ns -F comm,cpu,pid,tid,time,ip,addr,sym,dso,symoff,flags
...
ls 3689/3689 [001] 2062.020965237: jcc 7f06a958847a _dl_sysdep_start+0xfa (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a9588450 _dl_sysdep_start+0xd0 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020965237: jmp 7f06a9588461 _dl_sysdep_start+0xe1 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a95885a0 _dl_sysdep_start+0x220 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020965237: jmp 7f06a95885a4 _dl_sysdep_start+0x224 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a9588470 _dl_sysdep_start+0xf0 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020965904: call 7f06a95884c3 _dl_sysdep_start+0x143 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a9589140 brk+0x0 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020965904: syscall 7f06a958914a brk+0xa (/lib/x86_64-linux-gnu/ld-2.19.so) => 0 [unknown] ([unknown])
ls 3689/3689 [001] 2062.020966237: tr strt 0 [unknown] ([unknown]) => 7f06a958914c brk+0xc (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020966237: return 7f06a9589165 brk+0x25 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a95884c8 _dl_sysdep_start+0x148 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020966237: jcc 7f06a95884d7 _dl_sysdep_start+0x157 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a95885f0 _dl_sysdep_start+0x270 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020966237: call 7f06a95885f0 _dl_sysdep_start+0x270 (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a958ac50 strlen+0x0 (/lib/x86_64-linux-gnu/ld-2.19.so)
ls 3689/3689 [001] 2062.020966237: jcc 7f06a958ac6e strlen+0x1e (/lib/x86_64-linux-gnu/ld-2.19.so) => 7f06a958ac60 strlen+0x10 (/lib/x86_64-linux-gnu/ld-2.19.so)
...
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Andi Kleen <ak@linux.intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1466689258-28493-2-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Documentation/perf-script.txt | 7 ++++++-
tools/perf/builtin-script.c | 35 +++++++++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
index 4f34379ebd77..a46030d8962d 100644
--- a/tools/perf/Documentation/perf-script.txt
+++ b/tools/perf/Documentation/perf-script.txt
@@ -170,7 +170,12 @@ OPTIONS
Trace decoding. The flags are "bcrosyiABEx" which stand for branch,
call, return, conditional, system, asynchronous, interrupt,
transaction abort, trace begin, trace end, and in transaction,
- respectively.
+ respectively. Known combinations of flags are printed more nicely e.g.
+ "call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b",
+ "int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs",
+ "async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB",
+ "tr end" for "bE". However the "x" flag will be display separately in those
+ cases e.g. "jcc (x)" for a condition branch within a transaction.
Finally, a user may not set fields to none for all event types.
i.e., -F "" is not allowed.
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 0e18e06e7fd5..56b2fb8135ce 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -606,13 +606,42 @@ static void print_sample_bts(struct perf_sample *sample,
printf("\n");
}
+static struct {
+ u32 flags;
+ const char *name;
+} sample_flags[] = {
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL, "call"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN, "return"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL, "jcc"},
+ {PERF_IP_FLAG_BRANCH, "jmp"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_INTERRUPT, "int"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_INTERRUPT, "iret"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_SYSCALLRET, "syscall"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_SYSCALLRET, "sysret"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_ASYNC, "async"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC | PERF_IP_FLAG_INTERRUPT, "hw int"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT, "tx abrt"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_BEGIN, "tr strt"},
+ {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_END, "tr end"},
+ {0, NULL}
+};
+
static void print_sample_flags(u32 flags)
{
const char *chars = PERF_IP_FLAG_CHARS;
const int n = strlen(PERF_IP_FLAG_CHARS);
+ bool in_tx = flags & PERF_IP_FLAG_IN_TX;
+ const char *name = NULL;
char str[33];
int i, pos = 0;
+ for (i = 0; sample_flags[i].name ; i++) {
+ if (sample_flags[i].flags == (flags & ~PERF_IP_FLAG_IN_TX)) {
+ name = sample_flags[i].name;
+ break;
+ }
+ }
+
for (i = 0; i < n; i++, flags >>= 1) {
if (flags & 1)
str[pos++] = chars[i];
@@ -622,7 +651,11 @@ static void print_sample_flags(u32 flags)
str[pos++] = '?';
}
str[pos] = 0;
- printf(" %-4s ", str);
+
+ if (name)
+ printf(" %-7s%4s ", name, in_tx ? "(x)" : "");
+ else
+ printf(" %-11s ", str);
}
struct printer_data {
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 05/27] perf hists browser: Move horizontal scroll init to new() |
| Message-ID | <rNkvT-7uA-5@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
Moving horizontal scroll init to initialization function as already
intended.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index a74cbd381607..ccb9ed62a037 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2049,6 +2049,8 @@ struct hist_browser *hist_browser__new(struct hists *hists,
struct hist_browser *browser = zalloc(sizeof(*browser));
if (browser) {
+ struct perf_hpp_fmt *fmt;
+
browser->hists = hists;
browser->b.refresh = hist_browser__refresh;
browser->b.refresh_dimensions = hist_browser__refresh_dimensions;
@@ -2058,6 +2060,11 @@ struct hist_browser *hist_browser__new(struct hists *hists,
browser->hbt = hbt;
browser->env = env;
browser->title = perf_evsel_browser_title;
+
+ hists__for_each_format(hists, fmt) {
+ perf_hpp__reset_width(fmt, hists);
+ ++browser->b.columns;
+ }
}
return browser;
@@ -2654,7 +2661,6 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
int key = -1;
char buf[64];
int delay_secs = hbt ? hbt->refresh : 0;
- struct perf_hpp_fmt *fmt;
#define HIST_BROWSER_HELP_COMMON \
"h/?/F1 Show this window\n" \
@@ -2713,18 +2719,6 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
memset(options, 0, sizeof(options));
memset(actions, 0, sizeof(actions));
- hists__for_each_format(browser->hists, fmt) {
- perf_hpp__reset_width(fmt, hists);
- /*
- * This is done just once, and activates the horizontal scrolling
- * code in the ui_browser code, it would be better to have a the
- * counter in the perf_hpp code, but I couldn't find doing it here
- * works, FIXME by setting this in hist_browser__new, for now, be
- * clever 8-)
- */
- ++browser->b.columns;
- }
-
if (symbol_conf.col_width_list_str)
perf_hpp__set_user_width(symbol_conf.col_width_list_str);
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 07/27] perf hists browser: Introduce init() |
| Message-ID | <rNkvT-7uA-9@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
Factoring out the hist_browser initialization code, so it could be used
from other parts in following patches.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-8-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 35 ++++++++++++++++++++---------------
tools/perf/ui/browsers/hists.h | 2 ++
2 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index a81b298b79f9..9d744358ca78 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2042,25 +2042,30 @@ static int hist_browser__dump(struct hist_browser *browser)
return 0;
}
+void hist_browser__init(struct hist_browser *browser,
+ struct hists *hists)
+{
+ struct perf_hpp_fmt *fmt;
+
+ browser->hists = hists;
+ browser->b.refresh = hist_browser__refresh;
+ browser->b.refresh_dimensions = hist_browser__refresh_dimensions;
+ browser->b.seek = ui_browser__hists_seek;
+ browser->b.use_navkeypressed = true;
+ browser->show_headers = symbol_conf.show_hist_headers;
+
+ hists__for_each_format(hists, fmt) {
+ perf_hpp__reset_width(fmt, hists);
+ ++browser->b.columns;
+ }
+}
+
struct hist_browser *hist_browser__new(struct hists *hists)
{
struct hist_browser *browser = zalloc(sizeof(*browser));
- if (browser) {
- struct perf_hpp_fmt *fmt;
-
- browser->hists = hists;
- browser->b.refresh = hist_browser__refresh;
- browser->b.refresh_dimensions = hist_browser__refresh_dimensions;
- browser->b.seek = ui_browser__hists_seek;
- browser->b.use_navkeypressed = true;
- browser->show_headers = symbol_conf.show_hist_headers;
-
- hists__for_each_format(hists, fmt) {
- perf_hpp__reset_width(fmt, hists);
- ++browser->b.columns;
- }
- }
+ if (browser)
+ hist_browser__init(browser, hists);
return browser;
}
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h
index ec55a511d910..39bd0f28f211 100644
--- a/tools/perf/ui/browsers/hists.h
+++ b/tools/perf/ui/browsers/hists.h
@@ -27,4 +27,6 @@ struct hist_browser {
struct hist_browser *hist_browser__new(struct hists *hists);
void hist_browser__delete(struct hist_browser *browser);
int hist_browser__run(struct hist_browser *browser, const char *help);
+void hist_browser__init(struct hist_browser *browser,
+ struct hists *hists);
#endif /* _PERF_UI_BROWSER_HISTS_H_ */
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 06/27] perf hists browser: Introduce perf_evsel_browser constructor |
| Message-ID | <rNkvT-7uA-7@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
So we could use hist_browser__new for generic hist browser in following
patches.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-7-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 24 +++++++++++++++++-------
tools/perf/ui/browsers/hists.h | 4 +---
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index ccb9ed62a037..a81b298b79f9 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2042,9 +2042,7 @@ static int hist_browser__dump(struct hist_browser *browser)
return 0;
}
-struct hist_browser *hist_browser__new(struct hists *hists,
- struct hist_browser_timer *hbt,
- struct perf_env *env)
+struct hist_browser *hist_browser__new(struct hists *hists)
{
struct hist_browser *browser = zalloc(sizeof(*browser));
@@ -2057,9 +2055,6 @@ struct hist_browser *hist_browser__new(struct hists *hists,
browser->b.seek = ui_browser__hists_seek;
browser->b.use_navkeypressed = true;
browser->show_headers = symbol_conf.show_hist_headers;
- browser->hbt = hbt;
- browser->env = env;
- browser->title = perf_evsel_browser_title;
hists__for_each_format(hists, fmt) {
perf_hpp__reset_width(fmt, hists);
@@ -2070,6 +2065,21 @@ struct hist_browser *hist_browser__new(struct hists *hists,
return browser;
}
+static struct hist_browser *
+perf_evsel_browser__new(struct perf_evsel *evsel,
+ struct hist_browser_timer *hbt,
+ struct perf_env *env)
+{
+ struct hist_browser *browser = hist_browser__new(evsel__hists(evsel));
+
+ if (browser) {
+ browser->hbt = hbt;
+ browser->env = env;
+ browser->title = perf_evsel_browser_title;
+ }
+ return browser;
+}
+
void hist_browser__delete(struct hist_browser *browser)
{
free(browser);
@@ -2652,7 +2662,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
struct perf_env *env)
{
struct hists *hists = evsel__hists(evsel);
- struct hist_browser *browser = hist_browser__new(hists, hbt, env);
+ struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env);
struct branch_info *bi;
#define MAX_OPTIONS 16
char *options[MAX_OPTIONS];
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h
index cf9d04928ccc..ec55a511d910 100644
--- a/tools/perf/ui/browsers/hists.h
+++ b/tools/perf/ui/browsers/hists.h
@@ -24,9 +24,7 @@ struct hist_browser {
char *bf, size_t size);
};
-struct hist_browser *hist_browser__new(struct hists *hists,
- struct hist_browser_timer *hbt,
- struct perf_env *env);
+struct hist_browser *hist_browser__new(struct hists *hists);
void hist_browser__delete(struct hist_browser *browser);
int hist_browser__run(struct hist_browser *browser, const char *help);
#endif /* _PERF_UI_BROWSER_HISTS_H_ */
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 02/27] perf hists browser: Move hist_browser into header file |
| Message-ID | <rNkvT-7uA-11@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
This way we can use it outside of ui/browsers/hists.c and extend it in
following patches.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-3-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 19 +------------------
tools/perf/ui/browsers/hists.h | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+), 18 deletions(-)
create mode 100644 tools/perf/ui/browsers/hists.h
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index b1b60544a545..cc8dece609ad 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -12,30 +12,13 @@
#include "../../util/top.h"
#include "../../arch/common.h"
-#include "../browser.h"
+#include "../browsers/hists.h"
#include "../helpline.h"
#include "../util.h"
#include "../ui.h"
#include "map.h"
#include "annotate.h"
-struct hist_browser {
- struct ui_browser b;
- struct hists *hists;
- struct hist_entry *he_selection;
- struct map_symbol *selection;
- struct hist_browser_timer *hbt;
- struct pstack *pstack;
- struct perf_env *env;
- int print_seq;
- bool show_dso;
- bool show_headers;
- float min_pcnt;
- u64 nr_non_filtered_entries;
- u64 nr_hierarchy_entries;
- u64 nr_callchain_rows;
-};
-
extern void hist_browser__init_hpp(void);
static int hists__browser_title(struct hists *hists,
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h
new file mode 100644
index 000000000000..9b6785ce79b4
--- /dev/null
+++ b/tools/perf/ui/browsers/hists.h
@@ -0,0 +1,23 @@
+#ifndef _PERF_UI_BROWSER_HISTS_H_
+#define _PERF_UI_BROWSER_HISTS_H_ 1
+
+#include "ui/browser.h"
+
+struct hist_browser {
+ struct ui_browser b;
+ struct hists *hists;
+ struct hist_entry *he_selection;
+ struct map_symbol *selection;
+ struct hist_browser_timer *hbt;
+ struct pstack *pstack;
+ struct perf_env *env;
+ int print_seq;
+ bool show_dso;
+ bool show_headers;
+ float min_pcnt;
+ u64 nr_non_filtered_entries;
+ u64 nr_hierarchy_entries;
+ u64 nr_callchain_rows;
+};
+
+#endif /* _PERF_UI_BROWSER_HISTS_H_ */
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 04/27] perf hists browser: Introduce struct hist_browser title callback |
| Message-ID | <rNkvT-7uA-17@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
We can now setup title callback for hist_browser, which will be useful
in following changes to create customized hist_browsers.
This also separates struct perf_evsel dependency out of hist_browser
basic code.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-5-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 21 +++++++++++++--------
tools/perf/ui/browsers/hists.h | 4 ++++
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 539b69065d9d..a74cbd381607 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -21,9 +21,8 @@
extern void hist_browser__init_hpp(void);
-static int hists__browser_title(struct hists *hists,
- struct hist_browser_timer *hbt,
- char *bf, size_t size);
+static int perf_evsel_browser_title(struct hist_browser *browser,
+ char *bf, size_t size);
static void hist_browser__update_nr_entries(struct hist_browser *hb);
static struct rb_node *hists__filter_entries(struct rb_node *nd,
@@ -568,6 +567,11 @@ static void ui_browser__warn_lost_events(struct ui_browser *browser)
"Or reduce the sampling frequency.");
}
+static int hist_browser__title(struct hist_browser *browser, char *bf, size_t size)
+{
+ return browser->title ? browser->title(browser, bf, size) : 0;
+}
+
int hist_browser__run(struct hist_browser *browser, const char *help)
{
int key;
@@ -578,7 +582,7 @@ int hist_browser__run(struct hist_browser *browser, const char *help)
browser->b.entries = &browser->hists->entries;
browser->b.nr_entries = hist_browser__nr_entries(browser);
- hists__browser_title(browser->hists, hbt, title, sizeof(title));
+ hist_browser__title(browser, title, sizeof(title));
if (ui_browser__show(&browser->b, title, "%s", help) < 0)
return -1;
@@ -604,8 +608,7 @@ int hist_browser__run(struct hist_browser *browser, const char *help)
ui_browser__warn_lost_events(&browser->b);
}
- hists__browser_title(browser->hists,
- hbt, title, sizeof(title));
+ hist_browser__title(browser, title, sizeof(title));
ui_browser__show_title(&browser->b, title);
continue;
}
@@ -2054,6 +2057,7 @@ struct hist_browser *hist_browser__new(struct hists *hists,
browser->show_headers = symbol_conf.show_hist_headers;
browser->hbt = hbt;
browser->env = env;
+ browser->title = perf_evsel_browser_title;
}
return browser;
@@ -2080,10 +2084,11 @@ static inline bool is_report_browser(void *timer)
return timer == NULL;
}
-static int hists__browser_title(struct hists *hists,
- struct hist_browser_timer *hbt,
+static int perf_evsel_browser_title(struct hist_browser *browser,
char *bf, size_t size)
{
+ struct hist_browser_timer *hbt = browser->hbt;
+ struct hists *hists = browser->hists;
char unit;
int printed;
const struct dso *dso = hists->dso_filter;
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h
index 57b7764800b7..cf9d04928ccc 100644
--- a/tools/perf/ui/browsers/hists.h
+++ b/tools/perf/ui/browsers/hists.h
@@ -18,6 +18,10 @@ struct hist_browser {
u64 nr_non_filtered_entries;
u64 nr_hierarchy_entries;
u64 nr_callchain_rows;
+
+ /* Get title string. */
+ int (*title)(struct hist_browser *browser,
+ char *bf, size_t size);
};
struct hist_browser *hist_browser__new(struct hists *hists,
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 11/27] perf tests time-to-tsc: No need to disable an event before deleting it |
| Message-ID | <rNkvT-7uA-13@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Because at the destructor we will call close() and that will do the
disable. And we destructors can accept NULL, just like free(), so no
need to check it.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/n/tip-i98mcyfkkjh5qp62dle27ac1@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/arch/x86/tests/perf-time-to-tsc.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/tools/perf/arch/x86/tests/perf-time-to-tsc.c b/tools/perf/arch/x86/tests/perf-time-to-tsc.c
index d4aa567a29c4..5c76cc83186a 100644
--- a/tools/perf/arch/x86/tests/perf-time-to-tsc.c
+++ b/tools/perf/arch/x86/tests/perf-time-to-tsc.c
@@ -154,10 +154,6 @@ next_event:
err = 0;
out_err:
- if (evlist) {
- perf_evlist__disable(evlist);
- perf_evlist__delete(evlist);
- }
-
+ perf_evlist__delete(evlist);
return err;
}
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 03/27] perf hists browser: Make (new|delete|run) public |
| Message-ID | <rNkvU-7uA-23@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Jiri Olsa <jolsa@kernel.org>
This way we can use it outside of ui/browsers/hists.c and extend it in
following patches.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1466459899-1166-4-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/browsers/hists.c | 10 +++++-----
tools/perf/ui/browsers/hists.h | 5 +++++
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index cc8dece609ad..539b69065d9d 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -568,7 +568,7 @@ static void ui_browser__warn_lost_events(struct ui_browser *browser)
"Or reduce the sampling frequency.");
}
-static int hist_browser__run(struct hist_browser *browser, const char *help)
+int hist_browser__run(struct hist_browser *browser, const char *help)
{
int key;
char title[160];
@@ -2039,9 +2039,9 @@ static int hist_browser__dump(struct hist_browser *browser)
return 0;
}
-static struct hist_browser *hist_browser__new(struct hists *hists,
- struct hist_browser_timer *hbt,
- struct perf_env *env)
+struct hist_browser *hist_browser__new(struct hists *hists,
+ struct hist_browser_timer *hbt,
+ struct perf_env *env)
{
struct hist_browser *browser = zalloc(sizeof(*browser));
@@ -2059,7 +2059,7 @@ static struct hist_browser *hist_browser__new(struct hists *hists,
return browser;
}
-static void hist_browser__delete(struct hist_browser *browser)
+void hist_browser__delete(struct hist_browser *browser)
{
free(browser);
}
diff --git a/tools/perf/ui/browsers/hists.h b/tools/perf/ui/browsers/hists.h
index 9b6785ce79b4..57b7764800b7 100644
--- a/tools/perf/ui/browsers/hists.h
+++ b/tools/perf/ui/browsers/hists.h
@@ -20,4 +20,9 @@ struct hist_browser {
u64 nr_callchain_rows;
};
+struct hist_browser *hist_browser__new(struct hists *hists,
+ struct hist_browser_timer *hbt,
+ struct perf_env *env);
+void hist_browser__delete(struct hist_browser *browser);
+int hist_browser__run(struct hist_browser *browser, const char *help);
#endif /* _PERF_UI_BROWSER_HISTS_H_ */
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-06-23 23:40 +0200 |
| Subject | [PATCH 24/27] perf auxtrace: Add option to feed branches to the thread stack |
| Message-ID | <rNkvU-7uA-25@gated-at.bofh.it> |
| In reply to | #1430186 |
From: Adrian Hunter <adrian.hunter@intel.com>
In preparation for using the thread stack to print an indent
representing the stack depth in perf script, add an option to tell
decoders to feed branches to the thread stack. Add support for that
option to Intel PT and Intel BTS.
The advantage of using the decoder to feed the thread stack is that it
happens before branch filtering and so can be used with different itrace
options (e.g. it still works when only showing calls, even though the
thread stack needs to see calls and returns). Also it does not conflict
with using the thread stack to get callchains.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1466689258-28493-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/auxtrace.h | 2 ++
tools/perf/util/intel-bts.c | 22 +++++++++++++++++-----
tools/perf/util/intel-pt.c | 5 ++++-
3 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
index 767989e0e312..ac5f0d7167e6 100644
--- a/tools/perf/util/auxtrace.h
+++ b/tools/perf/util/auxtrace.h
@@ -63,6 +63,7 @@ enum itrace_period_type {
* @calls: limit branch samples to calls (can be combined with @returns)
* @returns: limit branch samples to returns (can be combined with @calls)
* @callchain: add callchain to 'instructions' events
+ * @thread_stack: feed branches to the thread_stack
* @last_branch: add branch context to 'instruction' events
* @callchain_sz: maximum callchain size
* @last_branch_sz: branch context size
@@ -82,6 +83,7 @@ struct itrace_synth_opts {
bool calls;
bool returns;
bool callchain;
+ bool thread_stack;
bool last_branch;
unsigned int callchain_sz;
unsigned int last_branch_sz;
diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c
index ecec73f6fe5a..749e6f2e37ca 100644
--- a/tools/perf/util/intel-bts.c
+++ b/tools/perf/util/intel-bts.c
@@ -422,7 +422,8 @@ static int intel_bts_get_branch_type(struct intel_bts_queue *btsq,
}
static int intel_bts_process_buffer(struct intel_bts_queue *btsq,
- struct auxtrace_buffer *buffer)
+ struct auxtrace_buffer *buffer,
+ struct thread *thread)
{
struct branch *branch;
size_t sz, bsz = sizeof(struct branch);
@@ -444,6 +445,12 @@ static int intel_bts_process_buffer(struct intel_bts_queue *btsq,
if (!branch->from && !branch->to)
continue;
intel_bts_get_branch_type(btsq, branch);
+ if (btsq->bts->synth_opts.thread_stack)
+ thread_stack__event(thread, btsq->sample_flags,
+ le64_to_cpu(branch->from),
+ le64_to_cpu(branch->to),
+ btsq->intel_pt_insn.length,
+ buffer->buffer_nr + 1);
if (filter && !(filter & btsq->sample_flags))
continue;
err = intel_bts_synth_branch_sample(btsq, branch);
@@ -507,12 +514,13 @@ static int intel_bts_process_queue(struct intel_bts_queue *btsq, u64 *timestamp)
goto out_put;
}
- if (!btsq->bts->synth_opts.callchain && thread &&
+ if (!btsq->bts->synth_opts.callchain &&
+ !btsq->bts->synth_opts.thread_stack && thread &&
(!old_buffer || btsq->bts->sampling_mode ||
(btsq->bts->snapshot_mode && !buffer->consecutive)))
thread_stack__set_trace_nr(thread, buffer->buffer_nr + 1);
- err = intel_bts_process_buffer(btsq, buffer);
+ err = intel_bts_process_buffer(btsq, buffer, thread);
auxtrace_buffer__drop_data(buffer);
@@ -905,10 +913,14 @@ int intel_bts_process_auxtrace_info(union perf_event *event,
if (dump_trace)
return 0;
- if (session->itrace_synth_opts && session->itrace_synth_opts->set)
+ if (session->itrace_synth_opts && session->itrace_synth_opts->set) {
bts->synth_opts = *session->itrace_synth_opts;
- else
+ } else {
itrace_synth_opts__set_default(&bts->synth_opts);
+ if (session->itrace_synth_opts)
+ bts->synth_opts.thread_stack =
+ session->itrace_synth_opts->thread_stack;
+ }
if (bts->synth_opts.calls)
bts->branches_filter |= PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC |
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index dc243b19197b..551ff6f640be 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -1234,7 +1234,7 @@ static int intel_pt_sample(struct intel_pt_queue *ptq)
if (!(state->type & INTEL_PT_BRANCH))
return 0;
- if (pt->synth_opts.callchain)
+ if (pt->synth_opts.callchain || pt->synth_opts.thread_stack)
thread_stack__event(ptq->thread, ptq->flags, state->from_ip,
state->to_ip, ptq->insn_len,
state->trace_nr);
@@ -2137,6 +2137,9 @@ int intel_pt_process_auxtrace_info(union perf_event *event,
pt->synth_opts.branches = false;
pt->synth_opts.callchain = true;
}
+ if (session->itrace_synth_opts)
+ pt->synth_opts.thread_stack =
+ session->itrace_synth_opts->thread_stack;
}
if (pt->synth_opts.log)
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2016-06-26 12:50 +0200 |
| Message-ID | <rOfNy-1LJ-129@gated-at.bofh.it> |
| In reply to | #1430186 |
* Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > Hi Ingo, > > Please consider pulling, > > - Arnaldo > > The following changes since commit 4330b439bbe16b48dd2fe9a379bd58a07b97aab8: > > Merge tag 'perf-core-for-mingo-20160621' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-06-22 09:34:19 +0200) > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160623 > > for you to fetch changes up to 4a35b3497c413de8b409f9d75700eeb4772b21b8: > > perf config: Reimplement show_config() using config_set__for_each (2016-06-23 17:23:00 -0300) > > ---------------------------------------------------------------- > perf/core improvements and fixes: > > New features: > > - Add 'callindent' option to 'perf script -F', to indent the Intel PT > call stack, making this output more ftrace-like (Adrian Hunter, Andi Kleen) > > User visible: > > - Enlarge 'pid' column width, to cope with large pids (Jiri Olsa) > > Infrastructure: > > - Cross platform unwind fixes (He Kuang) > > - Make destructors accept NULL, behaving like free() (Arnaldo Carvalho de Melo) > > - Remove reference to perl interpreted in the recently added 'perf script' > stackcollapse python script (Arnaldo Carvalho de Melo) > > - Rename CLASS__for_each() macros to CLASS__for_each_entry(), to use the > list_for_each_entry() semantics, as most of these class specific loop helpers > are list_for_each_entry*() wrappers (Arnaldo Carvalho de Melo) > > - Expose the hist_browser code, will be used with data structures other > than perf_evsel (Jiri Olsa) > > - 'perf config' refactorings (Taeung Song) > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > > ---------------------------------------------------------------- > Adrian Hunter (3): > perf script: Print sample flags more nicely > perf auxtrace: Add option to feed branches to the thread stack > perf script: Add callindent option > > Arnaldo Carvalho de Melo (9): > perf script stackcollapse: Remove reference to the perl interpreter > perf evlist: Destructors should accept NULL > perf session: Destructors should accept NULL > perf tests time-to-tsc: No need to disable an event before deleting it > perf machine: Destructors should accept NULL > perf evlist: Rename for_each() macros to for_each_entry() > perf tools: Rename strlist_for_each() macros to for_each_entry() > perf rb_resort: Rename for_each() macros to for_each_entry() > perf intlist: Rename for_each() macros to for_each_entry() > > He Kuang (5): > perf tools: Let python use correct gcc for build_ext > perf tools: Find right DSO taking into account if binary is 32 or 64-bit > perf unwind: Change macro names of perf register > perf unwind: Fix wrongly used regs for x86_32 unwind > perf unwind: Fix wrongly used regs for aarch64 unwind > > Jiri Olsa (7): > perf hists browser: Move hist_browser into header file > perf hists browser: Make (new|delete|run) public > perf hists browser: Introduce struct hist_browser title callback > perf hists browser: Move horizontal scroll init to new() > perf hists browser: Introduce perf_evsel_browser constructor > perf hists browser: Introduce init() > perf hists: Enlarge pid sort entry size > > Taeung Song (3): > perf config: Move config declarations from util/cache.h to util/config.h > perf config: Introduce new init() and exit() > perf config: Reimplement show_config() using config_set__for_each > > tools/perf/Documentation/perf-script.txt | 11 ++- > tools/perf/Makefile.perf | 3 +- > tools/perf/arch/x86/tests/perf-time-to-tsc.c | 6 +- > tools/perf/arch/x86/util/auxtrace.c | 2 +- > tools/perf/arch/x86/util/intel-bts.c | 8 +- > tools/perf/arch/x86/util/intel-pt.c | 10 +-- > tools/perf/builtin-annotate.c | 2 +- > tools/perf/builtin-buildid-cache.c | 13 ++- > tools/perf/builtin-config.c | 21 +++-- > tools/perf/builtin-diff.c | 10 +-- > tools/perf/builtin-evlist.c | 2 +- > tools/perf/builtin-help.c | 2 +- > tools/perf/builtin-inject.c | 8 +- > tools/perf/builtin-kmem.c | 4 +- > tools/perf/builtin-kvm.c | 8 +- > tools/perf/builtin-probe.c | 4 +- > tools/perf/builtin-record.c | 3 +- > tools/perf/builtin-report.c | 12 +-- > tools/perf/builtin-script.c | 115 +++++++++++++++++++++++++-- > tools/perf/builtin-stat.c | 22 ++--- > tools/perf/builtin-top.c | 10 +-- > tools/perf/builtin-trace.c | 10 +-- > tools/perf/perf.c | 4 +- > tools/perf/scripts/python/stackcollapse.py | 2 - > tools/perf/tests/backward-ring-buffer.c | 2 +- > tools/perf/tests/event-times.c | 3 +- > tools/perf/tests/evsel-roundtrip-name.c | 2 +- > tools/perf/tests/hists_filter.c | 4 +- > tools/perf/tests/hists_link.c | 4 +- > tools/perf/tests/mmap-basic.c | 2 +- > tools/perf/tests/parse-events.c | 4 +- > tools/perf/tests/parse-no-sample-id-all.c | 3 +- > tools/perf/tests/switch-tracking.c | 2 +- > tools/perf/ui/browser.c | 2 +- > tools/perf/ui/browsers/annotate.c | 1 + > tools/perf/ui/browsers/hists.c | 109 ++++++++++++------------- > tools/perf/ui/browsers/hists.h | 32 ++++++++ > tools/perf/ui/gtk/hists.c | 2 +- > tools/perf/ui/hist.c | 2 +- > tools/perf/util/alias.c | 1 + > tools/perf/util/auxtrace.h | 2 + > tools/perf/util/cache.h | 11 --- > tools/perf/util/cgroup.c | 4 +- > tools/perf/util/color.c | 1 + > tools/perf/util/config.c | 92 ++++++++++----------- > tools/perf/util/config.h | 40 ++++++++++ > tools/perf/util/data-convert-bt.c | 4 +- > tools/perf/util/evlist.c | 59 +++++++------- > tools/perf/util/evlist.h | 40 +++++----- > tools/perf/util/header.c | 18 ++--- > tools/perf/util/help-unknown-cmd.c | 1 + > tools/perf/util/hist.c | 4 +- > tools/perf/util/intel-bts.c | 24 ++++-- > tools/perf/util/intel-pt.c | 26 +++--- > tools/perf/util/intlist.h | 8 +- > tools/perf/util/jitdump.c | 2 +- > tools/perf/util/libunwind/arm64.c | 5 ++ > tools/perf/util/libunwind/x86_32.c | 6 ++ > tools/perf/util/llvm-utils.c | 1 + > tools/perf/util/machine.c | 6 +- > tools/perf/util/parse-events.c | 4 +- > tools/perf/util/probe-event.c | 12 ++- > tools/perf/util/probe-file.c | 8 +- > tools/perf/util/python.c | 2 +- > tools/perf/util/rb_resort.h | 4 +- > tools/perf/util/record.c | 8 +- > tools/perf/util/session.c | 12 +-- > tools/perf/util/sort.c | 14 ++-- > tools/perf/util/stat.c | 6 +- > tools/perf/util/strlist.h | 4 +- > tools/perf/util/symbol.c | 2 +- > tools/perf/util/thread-stack.c | 7 ++ > tools/perf/util/thread-stack.h | 1 + > tools/perf/util/thread_map.c | 4 +- > tools/perf/util/unwind-libunwind-local.c | 6 +- > tools/perf/util/unwind.h | 9 +++ > tools/perf/util/vdso.c | 40 +++++++++- > 77 files changed, 606 insertions(+), 358 deletions(-) > create mode 100644 tools/perf/ui/browsers/hists.h Pulled, thanks a lot Arnaldo! Ingo
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web