* [PATCHv2 00/27] perf tools: Add traceevent plugins support
@ 2013-11-28 11:32 Jiri Olsa
2013-11-28 11:33 ` [PATCH 01/29] perf tools: Remove stackprotector feature check Jiri Olsa
` (28 more replies)
0 siblings, 29 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:32 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
hi,
backporting traceevent plugin support from trace-cmd.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
Initial RFC is here:
http://marc.info/?l=linux-kernel&m=137803257921043&w=2
Having plugins allow traceevent to properly parse 'print fmt'
line of tracepoint format and display proper/additional data
in perf script command (check examples below).
Plugins backported from trace-cmd:
plugin_function.c
plugin_hrtimer.c
plugin_jbd2.c
plugin_kmem.c
plugin_kvm.c
plugin_mac80211.c
plugin_sched_switch.c
Plugins newly added:
plugin_cfg80211.c
plugin_scsi.c
plugin_xen.c
v2 changes:
- removing usage of malloc_or_die from event-pluginc.c
- using static methods in plugins where possible
- added Steven's Signed-off-by tags
- changed traceevent_host_bigendian with code suggested by Steven
- using pevent_print_func_field in hrtimer_start handler
- plugin_function.c changes:
* switching malloc_or_die into malloc
* removing index field from struct func_stack as it's not needed
* renaming get_index into add_and_get_index
* using '%*X' format string capability instead of the loop
- changing pevent_parse_format interface instead
of the pevent_parse_event as requested by Steven
- breakout LIBTRACEEVENT_FLAGS in Makefile.perf as suggested
by Namhyung
- added better error handling for filename__read_str
suggested by Nmahyung
- using _eprintf code in pr_stat function as suggested
by Namhyung
- removing stackprotector feature check as it's not needed
and is causing warnings - build failures on old gcc
Changes from RFC:
- added comment about repo/HEAD of the backport source
- omitted options plugin support
- change plugins installation path to:
$(perfexecdir)/traceevent/plugins
The code is available in here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/core_plugins
thanks,
jirka
Examples (diffs of 'perf script' output):
* data was generated by 'perf record -e 'cfg80211:*' -a'
--- script.cfg80211.old
+++ script.cfg80211.new
- ifconfig 2705 [003] 662.896560: cfg80211:cfg80211_tx_mlme_mgmt: [FAILED TO PARSE] name=wlan0 ifindex=3 frame=ARRAY[c0, 00,
+ ifconfig 2705 [003] 662.896560: cfg80211:cfg80211_tx_mlme_mgmt: netdev:wlan0(3), ftype:0xc0
- kworker/u16:0 1697 [002] 664.808210: cfg80211:cfg80211_rx_mlme_mgmt: [FAILED TO PARSE] name=wlan0 ifindex=3 frame=ARRAY[b0, 00,
+ kworker/u16:0 1697 [002] 664.808210: cfg80211:cfg80211_rx_mlme_mgmt: netdev:wlan0(3), ftype:0xb0
* data was generated by 'perf record -e sched:sched_switch -a'
--- script.sched_switch.old
+++ script.sched_switch.new
- perf 577 [002] 30965.311852: sched:sched_switch: prev_comm=perf prev_pid=577 prev_prio=120 prev_state=S ==> next_comm=sw
+ perf 577 [002] 30965.311852: sched:sched_switch: perf:577 [120] S ==> swapper/2:0 [120]
* data was generated by 'perf record -e ftrace:function ls'
--- script.function.old
+++ script.function.new
- ls 10781 [001] 32667.291379: ftrace:function: ffffffff811adb80 <-- ffffffff811afc48
- ls 10781 [001] 32667.291379: ftrace:function: ffffffff811b35d0 <-- ffffffff811adb9b
- ls 10781 [001] 32667.291380: ftrace:function: ffffffff811b3520 <-- ffffffff811b35e8
- ls 10781 [001] 32667.291380: ftrace:function: ffffffff811b2720 <-- ffffffff811b3549
- ls 10781 [001] 32667.291381: ftrace:function: ffffffff81297e10 <-- ffffffff811b356c
- ls 10781 [001] 32667.291381: ftrace:function: ffffffff81298f40 <-- ffffffff81297e2c
- ls 10781 [001] 32667.291382: ftrace:function: ffffffff81076160 <-- ffffffff811afbf0
- ls 10781 [001] 32667.291383: ftrace:function: ffffffff811c3eb0 <-- ffffffff811afbfc
- ls 10781 [001] 32667.291383: ftrace:function: ffffffff8164e100 <-- ffffffff811c3ed8
- ls 10781 [001] 32667.291384: ftrace:function: ffffffff811a5d10 <-- ffffffff811c3f53
- ls 10781 [001] 32667.291384: ftrace:function: ffffffff811e8e70 <-- ffffffff811a5d58
- ls 10781 [001] 32667.291385: ftrace:function: ffffffff811f38e0 <-- ffffffff811a5d63
- ls 10781 [001] 32667.291385: ftrace:function: ffffffff811a9ff0 <-- ffffffff811a5d6b
- ls 10781 [001] 32667.291386: ftrace:function: ffffffff811a9fa0 <-- ffffffff811aa015
- ls 10781 [001] 32667.291387: ftrace:function: ffffffff810851c0 <-- ffffffff811aa053
- ls 10781 [001] 32667.291387: ftrace:function: ffffffff81090e00 <-- ffffffff81085211
+ ls 10781 [001] 32667.291379: ftrace:function: would_dump <-- setup_new_exec
+ ls 10781 [001] 32667.291379: ftrace:function: inode_permission <-- would_dump
+ ls 10781 [001] 32667.291380: ftrace:function: __inode_permission <-- inode_permission
+ ls 10781 [001] 32667.291380: ftrace:function: generic_permission <-- __inode_permission
+ ls 10781 [001] 32667.291381: ftrace:function: security_inode_permission <-- __inode_permission
+ ls 10781 [001] 32667.291381: ftrace:function: cap_inode_permission <-- security_inode_permission
+ ls 10781 [001] 32667.291382: ftrace:function: flush_signal_handlers <-- setup_new_exec
+ ls 10781 [001] 32667.291383: ftrace:function: do_close_on_exec <-- setup_new_exec
+ ls 10781 [001] 32667.291383: ftrace:function: _raw_spin_lock <-- do_close_on_exec
+ ls 10781 [001] 32667.291384: ftrace:function: filp_close <-- do_close_on_exec
+ ls 10781 [001] 32667.291384: ftrace:function: dnotify_flush <-- filp_close
+ ls 10781 [001] 32667.291385: ftrace:function: locks_remove_posix <-- filp_close
+ ls 10781 [001] 32667.291385: ftrace:function: fput <-- filp_close
+ ls 10781 [001] 32667.291386: ftrace:function: file_sb_list_del <-- fput
+ ls 10781 [001] 32667.291387: ftrace:function: task_work_add <-- fput
+ ls 10781 [001] 32667.291387: ftrace:function: kick_process <-- task_work_add
* data was generated by 'perf record -e 'kvm:*,kvmmmu:*' -a'
--- script.kvm.old
+++ script.kvm.new
qemu-system-x86 17414 [000] 6868.995053: kvm:kvm_exit: reason EPT_VIOLATION rip 0xfff0 info 184 0
qemu-system-x86 17414 [000] 6868.995109: kvm:kvm_emulate_insn: f0000:c46b:e4 71 (real)
- qemu-system-x86 3006 [002] 10562.079422: kvmmmu:kvm_mmu_get_page: [FAILED TO PARSE] mmu_valid_gen=0x2 gfn=0 role=122884 root_count=0
+ qemu-system-x86 3006 [002] 10562.079422: kvmmmu:kvm_mmu_get_page: new sp gfn 0 0/4 q0 direct --- !pge !nxe root 0 sync
- qemu-system-x86 3006 [002] 10562.080502: kvmmmu:kvm_mmu_prepare_zap_page: [FAILED TO PARSE] mmu_valid_gen=0x2 gfn=0 role=122884 root
+ qemu-system-x86 3006 [002] 10562.080502: kvmmmu:kvm_mmu_prepare_zap_page: 0/4 q0 direct --- !pge !nxe root 1 sync
qemu-system-x86 3290 [002] 10708.755312: kvmmmu:fast_page_fault: [FAILED TO PARSE] vcpu_id=0 gva=4094486080 error_code=3 sptep=0xfff
- insmod 2576 [001] 781.731666: kvmmmu:kvm_mmu_sync_page: [FAILED TO PARSE] mmu_valid_gen=0x1 gfn=2 role=24624 root_count=1
+ insmod 2576 [001] 781.731666: kvmmmu:kvm_mmu_sync_page: 3/0 q0 --- !pge !nxe root 10 unsync
- insmod 2576 [001] 781.731668: kvmmmu:kvm_mmu_unsync_page: [FAILED TO PARSE] mmu_valid_gen=0x1 gfn=2 role=24624 root_count
+ insmod 2576 [001] 781.731668: kvmmmu:kvm_mmu_unsync_page: 3/0 q0 --- !pge !nxe root 10 unsync
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
Jiri Olsa (29):
perf tools: Remove stackprotector feature check
perf tools: Include test-stackprotector-all.c in test-all
tools lib traceevent: Add plugin support
tools lib traceevent: Add plugin build support
tools lib traceevent: Add traceevent_host_bigendian function
tools lib traceevent: Add jbd2 plugin
tools lib traceevent: Add hrtimer plugin
tools lib traceevent: Add kmem plugin
tools lib traceevent: Add kvm plugin
tools lib traceevent: Add mac80211 plugin
tools lib traceevent: Add sched_switch plugin
tools lib traceevent: Add function plugin
tools lib traceevent: Add xen plugin
tools lib traceevent: Add scsi plugin
tools lib traceevent: Add cfg80211 plugin
tools lib traceevent: Remove malloc_or_die from event-plugin.c
tools lib traceevent: Use static functions in jbd2 plugin
tools lib traceevent: Use pevent_print_func_field in hrtimer_start handler
tools lib traceevent: Several cleanups for function plugin
tools lib traceevent: Remove malloc_or_die from plugin_function.c
tools lib traceevent: Update kvm plugin with is_writable_pte helper
tools lib traceevent: Change pevent_parse_format to include pevent handle
tools lib traceevent: Harmonize the install messages in lib-traceevent
perf tools: Add build and install plugins targets
perf tools: Add udis86 disassembler feature check
perf tools: Add filename__read_str util function
perf tools: Add trace-event object
perf tools: Add trace-event global object for tracepoint interface
perf tools: Overload pr_stat traceevent print function
tools/lib/traceevent/Makefile | 71 +++++++++++--
tools/lib/traceevent/event-parse.c | 56 ++++++----
tools/lib/traceevent/event-parse.h | 19 +++-
tools/lib/traceevent/event-plugin.c | 215 +++++++++++++++++++++++++++++++++++++
tools/lib/traceevent/plugin_cfg80211.c | 24 +++++
tools/lib/traceevent/plugin_function.c | 160 ++++++++++++++++++++++++++++
tools/lib/traceevent/plugin_hrtimer.c | 78 ++++++++++++++
tools/lib/traceevent/plugin_jbd2.c | 68 ++++++++++++
tools/lib/traceevent/plugin_kmem.c | 72 +++++++++++++
tools/lib/traceevent/plugin_kvm.c | 436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/lib/traceevent/plugin_mac80211.c | 95 +++++++++++++++++
tools/lib/traceevent/plugin_sched_switch.c | 148 ++++++++++++++++++++++++++
tools/lib/traceevent/plugin_scsi.c | 423 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/lib/traceevent/plugin_xen.c | 130 +++++++++++++++++++++++
tools/perf/Makefile.perf | 18 +++-
tools/perf/builtin-script.c | 2 +-
tools/perf/builtin-trace.c | 5 +-
tools/perf/config/Makefile | 21 +++-
tools/perf/config/feature-checks/Makefile | 12 +--
tools/perf/config/feature-checks/test-all.c | 10 ++
tools/perf/config/feature-checks/test-stackprotector.c | 6 --
tools/perf/config/feature-checks/test-udis86.c | 11 ++
tools/perf/util/debug.c | 30 +++++-
tools/perf/util/debug.h | 2 +
tools/perf/util/evsel.c | 44 +-------
tools/perf/util/header.c | 8 +-
tools/perf/util/python-ext-sources | 1 +
tools/perf/util/session.h | 3 +-
tools/perf/util/trace-event-parse.c | 13 ---
tools/perf/util/trace-event-read.c | 20 ++--
tools/perf/util/trace-event.c | 82 +++++++++++++++
tools/perf/util/trace-event.h | 15 ++-
tools/perf/util/util.c | 50 +++++++++
tools/perf/util/util.h | 1 +
34 files changed, 2220 insertions(+), 129 deletions(-)
create mode 100644 tools/lib/traceevent/event-plugin.c
create mode 100644 tools/lib/traceevent/plugin_cfg80211.c
create mode 100644 tools/lib/traceevent/plugin_function.c
create mode 100644 tools/lib/traceevent/plugin_hrtimer.c
create mode 100644 tools/lib/traceevent/plugin_jbd2.c
create mode 100644 tools/lib/traceevent/plugin_kmem.c
create mode 100644 tools/lib/traceevent/plugin_kvm.c
create mode 100644 tools/lib/traceevent/plugin_mac80211.c
create mode 100644 tools/lib/traceevent/plugin_sched_switch.c
create mode 100644 tools/lib/traceevent/plugin_scsi.c
create mode 100644 tools/lib/traceevent/plugin_xen.c
delete mode 100644 tools/perf/config/feature-checks/test-stackprotector.c
create mode 100644 tools/perf/config/feature-checks/test-udis86.c
create mode 100644 tools/perf/util/trace-event.c
^ permalink raw reply [flat|nested] 45+ messages in thread
* [PATCH 01/29] perf tools: Remove stackprotector feature check
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-29 18:34 ` Arnaldo Carvalho de Melo
2013-11-28 11:33 ` [PATCH 02/29] perf tools: Include test-stackprotector-all.c in test-all Jiri Olsa
` (27 subsequent siblings)
28 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
We use -fstack-protector-all option to enable stack protecting
for all available functions. There's no reason for enabling
-Wstack-protector to get warning for unprotected functions.
Removing stackprotector feature check which was used to
enable the -Wstack-protector option.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/config/Makefile | 5 -----
tools/perf/config/feature-checks/Makefile | 6 +-----
tools/perf/config/feature-checks/test-stackprotector.c | 6 ------
3 files changed, 1 insertion(+), 16 deletions(-)
delete mode 100644 tools/perf/config/feature-checks/test-stackprotector.c
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 80ea6d8..38f388c2 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -161,7 +161,6 @@ CORE_FEATURE_TESTS = \
libslang \
libunwind \
on-exit \
- stackprotector \
stackprotector-all \
timerfd
@@ -229,10 +228,6 @@ ifeq ($(feature-stackprotector-all), 1)
CFLAGS += -fstack-protector-all
endif
-ifeq ($(feature-stackprotector), 1)
- CFLAGS += -Wstack-protector
-endif
-
ifeq ($(DEBUG),0)
ifeq ($(feature-fortify-source), 1)
CFLAGS += -D_FORTIFY_SOURCE=2
diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile
index 8dffb62..fc78699 100644
--- a/tools/perf/config/feature-checks/Makefile
+++ b/tools/perf/config/feature-checks/Makefile
@@ -26,7 +26,6 @@ FILES= \
test-libunwind-debug-frame \
test-on-exit \
test-stackprotector-all \
- test-stackprotector \
test-timerfd
CC := $(CC) -MD
@@ -38,7 +37,7 @@ BUILD = $(CC) $(CFLAGS) $(LDFLAGS) -o $(OUTPUT)$@ $@.c
###############################
test-all:
- $(BUILD) -Werror -fstack-protector -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
+ $(BUILD) -Werror -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
test-hello:
$(BUILD)
@@ -46,9 +45,6 @@ test-hello:
test-stackprotector-all:
$(BUILD) -Werror -fstack-protector-all
-test-stackprotector:
- $(BUILD) -Werror -fstack-protector -Wstack-protector
-
test-fortify-source:
$(BUILD) -O2 -Werror -D_FORTIFY_SOURCE=2
diff --git a/tools/perf/config/feature-checks/test-stackprotector.c b/tools/perf/config/feature-checks/test-stackprotector.c
deleted file mode 100644
index c9f398d..0000000
--- a/tools/perf/config/feature-checks/test-stackprotector.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <stdio.h>
-
-int main(void)
-{
- return puts("hi");
-}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 02/29] perf tools: Include test-stackprotector-all.c in test-all
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
2013-11-28 11:33 ` [PATCH 01/29] perf tools: Remove stackprotector feature check Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-12-04 15:41 ` [tip:perf/core] " tip-bot for Jiri Olsa
2013-11-28 11:33 ` [PATCH 03/29] tools lib traceevent: Add plugin support Jiri Olsa
` (26 subsequent siblings)
28 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
We're missing test-stackprotector-all.c in test-all
check, adding it.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/config/feature-checks/test-all.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/perf/config/feature-checks/test-all.c b/tools/perf/config/feature-checks/test-all.c
index 59e7a70..9b8a544 100644
--- a/tools/perf/config/feature-checks/test-all.c
+++ b/tools/perf/config/feature-checks/test-all.c
@@ -85,6 +85,10 @@
# include "test-timerfd.c"
#undef main
+#define main main_test_stackprotector_all
+# include "test-stackprotector-all.c"
+#undef main
+
int main(int argc, char *argv[])
{
main_test_libpython();
@@ -106,6 +110,7 @@ int main(int argc, char *argv[])
main_test_backtrace();
main_test_libnuma();
main_test_timerfd();
+ main_test_stackprotector_all();
return 0;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 03/29] tools lib traceevent: Add plugin support
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
2013-11-28 11:33 ` [PATCH 01/29] perf tools: Remove stackprotector feature check Jiri Olsa
2013-11-28 11:33 ` [PATCH 02/29] perf tools: Include test-stackprotector-all.c in test-all Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 04/29] tools lib traceevent: Add plugin build support Jiri Olsa
` (25 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting plugin support for traceevent lib.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
It's now possible to use following interface to load plugins
(shared objects) to enhance pevent object functionality.
The plugin interface/hooks are as follows:
(taken from event-parse.h comments)
- 'pevent_plugin_loader' (required)
The function name to initialized the plugin.
int pevent_plugin_loader(struct pevent *pevent)
- 'pevent_plugin_unloader' (optional)
The function called just before unloading
int pevent_plugin_unloader(void)
- 'pevent_plugin_options' (optional)
Plugin options that can be set before loading
struct plugin_option pevent_plugin_options[] = {
{
.name = "option-name",
.plugin_alias = "overide-file-name", (optional)
.description = "description of option to show users",
},
{
.name = NULL,
},
};
Array must end with .name = NULL;
The plugin_alias (below) can be used to give a shorter
name to access the variable. Useful if a plugin handles
more than one event.
NOTE options support is not backported yet.
- 'pevent_plugin_alias' (optional)
The name to use for finding options (uses filename if not defined)
New traceevent functions are added to search and load
available plugins:
struct plugin_list*
traceevent_load_plugins(struct pevent *pevent)
- loads plusing for 'struct pevent' object and returns
loaded plugins list
void traceevent_unload_plugins(struct plugin_list *plugin_list);
- unload plugin list
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 6 +-
tools/lib/traceevent/event-parse.h | 5 +
tools/lib/traceevent/event-plugin.c | 202 ++++++++++++++++++++++++++++++++++++
3 files changed, 212 insertions(+), 1 deletion(-)
create mode 100644 tools/lib/traceevent/event-plugin.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index fc15020..2ccb5bc 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -180,7 +180,11 @@ $(obj)/%.o: $(src)/%.c
%.o: $(src)/%.c
$(Q)$(call do_compile)
-PEVENT_LIB_OBJS = event-parse.o trace-seq.o parse-filter.o parse-utils.o
+PEVENT_LIB_OBJS = event-parse.o
+PEVENT_LIB_OBJS += event-plugin.o
+PEVENT_LIB_OBJS += trace-seq.o
+PEVENT_LIB_OBJS += parse-filter.o
+PEVENT_LIB_OBJS += parse-utils.o
PEVENT_LIB_OBJS += kbuffer-parse.o
ALL_OBJS = $(PEVENT_LIB_OBJS)
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index 8d73d25..a288860 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -377,6 +377,11 @@ enum pevent_errno {
};
#undef _PE
+struct plugin_list;
+
+struct plugin_list *traceevent_load_plugins(struct pevent *pevent);
+void traceevent_unload_plugins(struct plugin_list *plugin_list);
+
struct cmdline;
struct cmdline_list;
struct func_map;
diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c
new file mode 100644
index 0000000..d272d87
--- /dev/null
+++ b/tools/lib/traceevent/event-plugin.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+#include <string.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
+#include "event-parse.h"
+#include "event-utils.h"
+
+#define LOCAL_PLUGIN_DIR ".traceevent/plugins"
+
+struct plugin_list {
+ struct plugin_list *next;
+ char *name;
+ void *handle;
+};
+
+static void
+load_plugin(struct pevent *pevent, const char *path,
+ const char *file, void *data)
+{
+ struct plugin_list **plugin_list = data;
+ pevent_plugin_load_func func;
+ struct plugin_list *list;
+ const char *alias;
+ char *plugin;
+ void *handle;
+
+ plugin = malloc_or_die(strlen(path) + strlen(file) + 2);
+
+ strcpy(plugin, path);
+ strcat(plugin, "/");
+ strcat(plugin, file);
+
+ handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle) {
+ warning("could not load plugin '%s'\n%s\n",
+ plugin, dlerror());
+ goto out_free;
+ }
+
+ alias = dlsym(handle, PEVENT_PLUGIN_ALIAS_NAME);
+ if (!alias)
+ alias = file;
+
+ func = dlsym(handle, PEVENT_PLUGIN_LOADER_NAME);
+ if (!func) {
+ warning("could not find func '%s' in plugin '%s'\n%s\n",
+ PEVENT_PLUGIN_LOADER_NAME, plugin, dlerror());
+ goto out_free;
+ }
+
+ list = malloc_or_die(sizeof(*list));
+ list->next = *plugin_list;
+ list->handle = handle;
+ list->name = plugin;
+ *plugin_list = list;
+
+ pr_stat("registering plugin: %s", plugin);
+ func(pevent);
+ return;
+
+ out_free:
+ free(plugin);
+}
+
+static void
+load_plugins_dir(struct pevent *pevent, const char *suffix,
+ const char *path,
+ void (*load_plugin)(struct pevent *pevent,
+ const char *path,
+ const char *name,
+ void *data),
+ void *data)
+{
+ struct dirent *dent;
+ struct stat st;
+ DIR *dir;
+ int ret;
+
+ ret = stat(path, &st);
+ if (ret < 0)
+ return;
+
+ if (!S_ISDIR(st.st_mode))
+ return;
+
+ dir = opendir(path);
+ if (!dir)
+ return;
+
+ while ((dent = readdir(dir))) {
+ const char *name = dent->d_name;
+
+ if (strcmp(name, ".") == 0 ||
+ strcmp(name, "..") == 0)
+ continue;
+
+ /* Only load plugins that end in suffix */
+ if (strcmp(name + (strlen(name) - strlen(suffix)), suffix) != 0)
+ continue;
+
+ load_plugin(pevent, path, name, data);
+ }
+
+ closedir(dir);
+}
+
+static void
+load_plugins(struct pevent *pevent, const char *suffix,
+ void (*load_plugin)(struct pevent *pevent,
+ const char *path,
+ const char *name,
+ void *data),
+ void *data)
+{
+ char *home;
+ char *path;
+ char *envdir;
+
+ /*
+ * If a system plugin directory was defined,
+ * check that first.
+ */
+#ifdef PLUGIN_DIR
+ load_plugins_dir(pevent, suffix, PLUGIN_DIR, load_plugin, data);
+#endif
+
+ /*
+ * Next let the environment-set plugin directory
+ * override the system defaults.
+ */
+ envdir = getenv("TRACEEVENT_PLUGIN_DIR");
+ if (envdir)
+ load_plugins_dir(pevent, suffix, envdir, load_plugin, data);
+
+ /*
+ * Now let the home directory override the environment
+ * or system defaults.
+ */
+ home = getenv("HOME");
+ if (!home)
+ return;
+
+ path = malloc_or_die(strlen(home) + strlen(LOCAL_PLUGIN_DIR) + 2);
+
+ strcpy(path, home);
+ strcat(path, "/");
+ strcat(path, LOCAL_PLUGIN_DIR);
+
+ load_plugins_dir(pevent, suffix, path, load_plugin, data);
+
+ free(path);
+}
+
+struct plugin_list*
+traceevent_load_plugins(struct pevent *pevent)
+{
+ struct plugin_list *list = NULL;
+
+ load_plugins(pevent, ".so", load_plugin, &list);
+ return list;
+}
+
+void
+traceevent_unload_plugins(struct plugin_list *plugin_list)
+{
+ pevent_plugin_unload_func func;
+ struct plugin_list *list;
+
+ while (plugin_list) {
+ list = plugin_list;
+ plugin_list = list->next;
+ func = dlsym(list->handle, PEVENT_PLUGIN_UNLOADER_NAME);
+ if (func)
+ func();
+ dlclose(list->handle);
+ free(list->name);
+ free(list);
+ }
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 04/29] tools lib traceevent: Add plugin build support
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (2 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 03/29] tools lib traceevent: Add plugin support Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 05/29] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
` (24 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting missing pieces of plugin building infrastructure:
- adding Makefile 'plugins' target to build all
defined plugins
- adding Makefile 'install_plugins' target as 'install_lib'
target dependency
- link plugin objects with shared object building
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
Plugins are by default installed into following locations:
'$(HOME)/.traceevent/plugins'
- if we are installing under $(HOME)
'$(prefix)/lib/traceevent/plugins'
- otherwise
This path is propagated to the plugin object as
a plugins search path.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 52 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 47 insertions(+), 5 deletions(-)
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 2ccb5bc..1526798 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -43,6 +43,30 @@ man_dir_SQ = '$(subst ','\'',$(man_dir))'
export man_dir man_dir_SQ INSTALL
export DESTDIR DESTDIR_SQ
+set_plugin_dir := 1
+
+# Set plugin_dir to preffered global plugin location
+# If we install under $HOME directory we go under
+# $(HOME)/.traceevent/plugins
+#
+# We dont set PLUGIN_DIR in case we install under $HOME
+# directory, because by default the code looks under:
+# $(HOME)/.traceevent/plugins by default.
+#
+ifeq ($(plugin_dir),)
+ifeq ($(prefix),$(HOME))
+override plugin_dir = $(HOME)/.traceevent/plugins
+set_plugin_dir := 0
+else
+override plugin_dir = $(prefix)/lib/traceevent/plugins
+endif
+endif
+
+ifeq ($(set_plugin_dir),1)
+PLUGIN_DIR = -DPLUGIN_DIR="$(DESTDIR)/$(plugin_dir)"
+PLUGIN_DIR_SQ = '$(subst ','\'',$(PLUGIN_DIR))'
+endif
+
# copy a bit from Linux kbuild
ifeq ("$(origin V)", "command line")
@@ -96,6 +120,7 @@ export prefix bindir src obj
# Shell quotes
bindir_SQ = $(subst ','\'',$(bindir))
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
+plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
LIB_FILE = libtraceevent.a libtraceevent.so
@@ -138,8 +163,8 @@ else
print_app_build = echo ' BUILD '$(OBJ);
print_fpic_compile = echo ' CC FPIC '$(OBJ);
print_shared_lib_compile = echo ' BUILD SHARED LIB '$(OBJ);
- print_plugin_obj_compile = echo ' BUILD PLUGIN OBJ '$(OBJ);
- print_plugin_build = echo ' BUILD PLUGIN '$(OBJ);
+ print_plugin_obj_compile = echo ' CC FPIC '$(OBJ);
+ print_plugin_build = echo ' BUILD PLUGIN '$(OBJ);
print_static_lib_build = echo ' BUILD STATIC LIB '$(OBJ);
print_install = echo ' INSTALL '$1' to $(DESTDIR_SQ)$2';
endif
@@ -187,9 +212,11 @@ PEVENT_LIB_OBJS += parse-filter.o
PEVENT_LIB_OBJS += parse-utils.o
PEVENT_LIB_OBJS += kbuffer-parse.o
-ALL_OBJS = $(PEVENT_LIB_OBJS)
+PLUGINS := $(PLUGIN_OBJS:.o=.so)
+
+ALL_OBJS = $(PEVENT_LIB_OBJS) $(PLUGIN_OBJS)
-CMD_TARGETS = $(LIB_FILE)
+CMD_TARGETS = $(LIB_FILE) $(PLUGINS)
TARGETS = $(CMD_TARGETS)
@@ -204,9 +231,17 @@ libtraceevent.so: $(PEVENT_LIB_OBJS)
libtraceevent.a: $(PEVENT_LIB_OBJS)
$(Q)$(do_build_static_lib)
+plugins: $(PLUGINS)
+
$(PEVENT_LIB_OBJS): %.o: $(src)/%.c TRACEEVENT-CFLAGS
$(Q)$(do_fpic_compile)
+$(PLUGIN_OBJS): %.o : $(src)/%.c
+ $(Q)$(do_compile_plugin_obj)
+
+$(PLUGINS): %.so: %.o
+ $(Q)$(do_plugin_build)
+
define make_version.h
(echo '/* This file is automatically generated. Do not modify. */'; \
echo \#define VERSION_CODE $(shell \
@@ -294,9 +329,16 @@ define do_install
$(INSTALL) $1 '$(DESTDIR_SQ)$2'
endef
-install_lib: all_cmd
+install_lib: all_cmd install_plugins
$(Q)$(call do_install,$(LIB_FILE),$(bindir_SQ))
+PLUGINS_INSTALL = $(subst .so,.install,$(PLUGINS))
+
+$(PLUGINS_INSTALL): %.install : %.so force
+ $(Q)$(call do_install,$<,$(plugin_dir_SQ))
+
+install_plugins: $(PLUGINS_INSTALL)
+
install: install_lib
clean:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 05/29] tools lib traceevent: Add traceevent_host_bigendian function
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (3 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 04/29] tools lib traceevent: Add plugin build support Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 06/29] tools lib traceevent: Add jbd2 plugin Jiri Olsa
` (23 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding traceevent_host_bigendian function to get host
endianity. It's used in following patches.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/event-parse.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index a288860..54273c0 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -23,6 +23,7 @@
#include <stdbool.h>
#include <stdarg.h>
#include <regex.h>
+#include <string.h>
#ifndef __maybe_unused
#define __maybe_unused __attribute__((unused))
@@ -527,6 +528,15 @@ __data2host8(struct pevent *pevent, unsigned long long data)
__data2host8(pevent, __val); \
})
+static inline int traceevent_host_bigendian(void)
+{
+ unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
+ unsigned int val;
+
+ memcpy(&val, str, 4);
+ return val == 0x01020304;
+}
+
/* taken from kernel/trace/trace.h */
enum trace_flag_type {
TRACE_FLAG_IRQS_OFF = 0x01,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (4 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 05/29] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-29 18:42 ` Arnaldo Carvalho de Melo
2013-11-28 11:33 ` [PATCH 07/29] tools lib traceevent: Add hrtimer plugin Jiri Olsa
` (22 subsequent siblings)
28 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting jbd2 plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds field resolving functions for following
tracepoint events:
jbd2:jbd2_checkpoint_stats
jbd2:jbd2_run_stats
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'jbd2:jbd2_run_stats,jbd2:jbd2_checkpoint_stats' -a')
--- script.jbd2.old
+++ script.jbd2.new
- jbd2/dm-3-8 576 [000] 2983.748423: jbd2:jbd2_checkpoint_stats: [FAILED TO PARSE] dev=265289731 tid=0x3f2bbb chp_time=0x0 forced_to_close=0 written=0 dropped=2
+ jbd2/dm-3-8 576 [000] 2983.748423: jbd2:jbd2_checkpoint_stats: dev 253,3 tid 4139963 chp_time 0 forced_to_close 0 written 0 dropped 2
- jbd2/dm-3-8 576 [000] 2983.852789: jbd2:jbd2_run_stats: [FAILED TO PARSE] dev=265289731 tid=0x3f2bc0 wait=0x0 request_delay=0x0 running=0x138d locked=0x0 flushing=0x0 logging=0x68 handle_count=2995 blocks=17 blocks_logged=18
+ jbd2/dm-3-8 576 [000] 2983.852789: jbd2:jbd2_run_stats: dev 253,3 tid 4139968 wait 0 request_delay 0 running 5005 locked 0 flushing 0 logging 104 handle_count 2995 blocks 17 blocks_logged 18
This plugin also adds jbd2_dev_to_name function, which
was removed from jdb2 tracepoints recently. Keeping it
in for backward compatibility reasons.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 2 ++
tools/lib/traceevent/plugin_jbd2.c | 66 ++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_jbd2.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 1526798..474485a 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -212,6 +212,8 @@ PEVENT_LIB_OBJS += parse-filter.o
PEVENT_LIB_OBJS += parse-utils.o
PEVENT_LIB_OBJS += kbuffer-parse.o
+PLUGIN_OBJS = plugin_jbd2.o
+
PLUGINS := $(PLUGIN_OBJS:.o=.so)
ALL_OBJS = $(PEVENT_LIB_OBJS) $(PLUGIN_OBJS)
diff --git a/tools/lib/traceevent/plugin_jbd2.c b/tools/lib/traceevent/plugin_jbd2.c
new file mode 100644
index 0000000..5d85de7
--- /dev/null
+++ b/tools/lib/traceevent/plugin_jbd2.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+#define MINORBITS 20
+#define MINORMASK ((1U << MINORBITS) - 1)
+
+#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
+#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
+
+unsigned long long process_jbd2_dev_to_name(struct trace_seq *s,
+ unsigned long long *args)
+{
+ unsigned int dev = args[0];
+
+ trace_seq_printf(s, "%d:%d", MAJOR(dev), MINOR(dev));
+ return 0;
+}
+
+unsigned long long process_jiffies_to_msecs(struct trace_seq *s,
+ unsigned long long *args)
+{
+ unsigned long long jiffies = args[0];
+
+ trace_seq_printf(s, "%lld", jiffies);
+ return jiffies;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_print_function(pevent,
+ process_jbd2_dev_to_name,
+ PEVENT_FUNC_ARG_STRING,
+ "jbd2_dev_to_name",
+ PEVENT_FUNC_ARG_INT,
+ PEVENT_FUNC_ARG_VOID);
+
+ pevent_register_print_function(pevent,
+ process_jiffies_to_msecs,
+ PEVENT_FUNC_ARG_LONG,
+ "jiffies_to_msecs",
+ PEVENT_FUNC_ARG_LONG,
+ PEVENT_FUNC_ARG_VOID);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 07/29] tools lib traceevent: Add hrtimer plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (5 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 06/29] tools lib traceevent: Add jbd2 plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 08/29] tools lib traceevent: Add kmem plugin Jiri Olsa
` (21 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting hrtimer plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds function field resolving for following
tracepoint events:
timer:hrtimer_expire_entry
timer:hrtimer_start
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'timer:hrtimer*' -a')
--- script.hrtimer.old
+++ script.hrtimer.new
- swapper 0 [000] 27405.519092: timer:hrtimer_start: [FAILED TO PARSE] hrtimer=0xffff88021e20e800 function=0xffffffff810c0e10 expires=27398383000000 softexpires=27398383000000
+ swapper 0 [000] 27405.519103: timer:hrtimer_start: hrtimer=0xffff88021e20e800 function=tick_sched_timer expires=27398383000000 softexpires=27398383000000
- swapper 0 [001] 27405.519544: timer:hrtimer_expire_entry: [FAILED TO PARSE] hrtimer=0xffff880211334058 now=27398294182491 function=0xffffffff81086f20
+ swapper 0 [001] 27405.519544: timer:hrtimer_expire_entry: hrtimer=0xffff880211334058 now=27398294182491 function=posix_timer_fn/0x0
Check the 'function' field is translated into the function name.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 3 +-
tools/lib/traceevent/plugin_hrtimer.c | 93 +++++++++++++++++++++++++++++++++++
2 files changed, 95 insertions(+), 1 deletion(-)
create mode 100644 tools/lib/traceevent/plugin_hrtimer.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 474485a..23a0ff7 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -212,7 +212,8 @@ PEVENT_LIB_OBJS += parse-filter.o
PEVENT_LIB_OBJS += parse-utils.o
PEVENT_LIB_OBJS += kbuffer-parse.o
-PLUGIN_OBJS = plugin_jbd2.o
+PLUGIN_OBJS = plugin_jbd2.o
+PLUGIN_OBJS += plugin_hrtimer.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_hrtimer.c b/tools/lib/traceevent/plugin_hrtimer.c
new file mode 100644
index 0000000..e41d4cf
--- /dev/null
+++ b/tools/lib/traceevent/plugin_hrtimer.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ * Copyright (C) 2009 Johannes Berg <johannes@sipsolutions.net>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+static int timer_expire_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ trace_seq_printf(s, "hrtimer=");
+
+ if (pevent_print_num_field(s, "0x%llx", event, "timer",
+ record, 0) == -1)
+ pevent_print_num_field(s, "0x%llx", event, "hrtimer",
+ record, 1);
+
+ trace_seq_printf(s, " now=");
+
+ pevent_print_num_field(s, "%llu", event, "now", record, 1);
+
+ pevent_print_func_field(s, " function=%s", event, "function",
+ record, 0);
+ return 0;
+}
+
+static int timer_start_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ struct pevent *pevent = event->pevent;
+ struct format_field *fn = pevent_find_field(event, "function");
+ void *data = record->data;
+
+ trace_seq_printf(s, "hrtimer=");
+
+ if (pevent_print_num_field(s, "0x%llx", event, "timer",
+ record, 0) == -1)
+ pevent_print_num_field(s, "0x%llx", event, "hrtimer",
+ record, 1);
+
+ if (!fn) {
+ trace_seq_printf(s, " function=MISSING");
+ } else {
+ unsigned long long function;
+ const char *func;
+
+ if (pevent_read_number_field(fn, data, &function))
+ trace_seq_printf(s, " function=INVALID");
+
+ func = pevent_find_function(pevent, function);
+
+ trace_seq_printf(s, " function=%s", func);
+ }
+
+ trace_seq_printf(s, " expires=");
+ pevent_print_num_field(s, "%llu", event, "expires", record, 1);
+
+ trace_seq_printf(s, " softexpires=");
+ pevent_print_num_field(s, "%llu", event, "softexpires", record, 1);
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_event_handler(pevent, -1,
+ "timer", "hrtimer_expire_entry",
+ timer_expire_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "timer", "hrtimer_start",
+ timer_start_handler, NULL);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 08/29] tools lib traceevent: Add kmem plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (6 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 07/29] tools lib traceevent: Add hrtimer plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 09/29] tools lib traceevent: Add kvm plugin Jiri Olsa
` (20 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting kmem plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds call_site field resolving for following
tracepoint events:
kmem:kfree
kmem:kmalloc
kmem:kmalloc_node
kmem:kmem_cache_alloc
kmem:kmem_cache_alloc_node
kmem:kmem_cache_free
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'kmem:*' -a')
--- script.kmem.old
+++ script.kmem.new
- perf 27846 [001] 29643.403319: kmem:kfree: call_site=ffffffff810e64f6 ptr=(nil)
+ perf 27846 [001] 29643.403238: kmem:kfree: (__audit_syscall_exit+0x1f6) call_site=ffffffff810e64f6 ptr=(nil)
- perf 27846 [001] 29643.403337: kmem:kmem_cache_alloc: call_site=ffffffff812ff0c5 ptr=0xffff88020e155630 bytes_req=560 bytes_alloc=568 gfp_flags=GFP_KERNEL
+ perf 27846 [001] 29643.403337: kmem:kmem_cache_alloc: (radix_tree_preload+0x35) call_site=ffffffff812ff0c5 ptr=0xffff88020e155630 bytes_req=560 bytes_alloc=568 gfp_flags=GFP_KERNEL
- perf 27846 [001] 29643.403342: kmem:kmem_cache_free: call_site=ffffffff8126ec61 ptr=0xffff88020dffe750
+ perf 27846 [001] 29643.403342: kmem:kmem_cache_free: (jbd2_journal_stop+0x221) call_site=ffffffff8126ec61 ptr=0xffff88020dffe750
- firefox 954 [000] 29643.445477: kmem:kmem_cache_alloc_node: call_site=ffffffff8153c64e ptr=0xffff8801cecb4000 bytes_req=256 bytes_alloc=256 gfp_flags=GFP_KERNEL|GFP_REPEAT node=-1
+ firefox 954 [000] 29643.445477: kmem:kmem_cache_alloc_node: (__alloc_skb+0x4e) call_site=ffffffff8153c64e ptr=0xffff8801cecb4000 bytes_req=256 bytes_alloc=256 gfp_flags=GFP_KERNEL|GFP_REPEAT node=-1
- perf 27846 [001] 29643.445510: kmem:kmalloc: call_site=ffffffff81250642 ptr=0xffff88020fd6c300 bytes_req=96 bytes_alloc=96 gfp_flags=GFP_NOFS|GFP_ZERO
+ perf 27846 [001] 29643.445510: kmem:kmalloc: (ext4_ext_find_extent+0x362) call_site=ffffffff81250642 ptr=0xffff88020fd6c300 bytes_req=96 bytes_alloc=96 gfp_flags=GFP_NOFS|GFP_ZERO
- X 888 [002] 29643.445546: kmem:kmalloc_node: call_site=ffffffff8153c67e ptr=0xffff880103828e00 bytes_req=384 bytes_alloc=512 gfp_flags=GFP_KERNEL|GFP_NOWARN|GFP_REPEAT|GFP_NOMEMALLOC node=-1
+ X 888 [002] 29643.445546: kmem:kmalloc_node: (__alloc_skb+0x7e) call_site=ffffffff8153c67e ptr=0xffff880103828e00 bytes_req=384 bytes_alloc=512 gfp_flags=GFP_KERNEL|GFP_NOWARN|GFP_REPEAT|GFP_NOMEMALLOC node=-1
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_kmem.c | 72 ++++++++++++++++++++++++++++++++++++++
2 files changed, 73 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_kmem.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 23a0ff7..8e546e4 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -214,6 +214,7 @@ PEVENT_LIB_OBJS += kbuffer-parse.o
PLUGIN_OBJS = plugin_jbd2.o
PLUGIN_OBJS += plugin_hrtimer.o
+PLUGIN_OBJS += plugin_kmem.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_kmem.c b/tools/lib/traceevent/plugin_kmem.c
new file mode 100644
index 0000000..7115c80
--- /dev/null
+++ b/tools/lib/traceevent/plugin_kmem.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+static int call_site_handler(struct trace_seq *s, struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ struct format_field *field;
+ unsigned long long val, addr;
+ void *data = record->data;
+ const char *func;
+
+ field = pevent_find_field(event, "call_site");
+ if (!field)
+ return 1;
+
+ if (pevent_read_number_field(field, data, &val))
+ return 1;
+
+ func = pevent_find_function(event->pevent, val);
+ if (!func)
+ return 1;
+
+ addr = pevent_find_function_address(event->pevent, val);
+
+ trace_seq_printf(s, "(%s+0x%x) ", func, (int)(val - addr));
+ return 1;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_event_handler(pevent, -1, "kmem", "kfree",
+ call_site_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kmem", "kmalloc",
+ call_site_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kmem", "kmalloc_node",
+ call_site_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_alloc",
+ call_site_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kmem",
+ "kmem_cache_alloc_node",
+ call_site_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kmem", "kmem_cache_free",
+ call_site_handler, NULL);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 09/29] tools lib traceevent: Add kvm plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (7 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 08/29] tools lib traceevent: Add kmem plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 10/29] tools lib traceevent: Add mac80211 plugin Jiri Olsa
` (19 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting kvm plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds field resolving functions for following
tracepoint events:
kvm:kvm_exit
kvm:kvm_emulate_insn
kvm:kvm_nested_vmexit
kvm:kvm_nested_vmexit_inject
kvmmmu:kvm_mmu_get_page
kvmmmu:kvm_mmu_sync_page
kvmmmu:kvm_mmu_unsync_page
kvmmmu:kvm_mmu_zap_page
kvmmmu:kvm_mmu_prepare_zap_page
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'kvm:*,kvmmmu:*' -a')
--- script.kvm.old
+++ script.kvm.new
qemu-system-x86 17414 [000] 6868.995053: kvm:kvm_exit: reason EPT_VIOLATION rip 0xfff0 info 184 0
qemu-system-x86 17414 [000] 6868.995109: kvm:kvm_emulate_insn: f0000:c46b:e4 71 (real)
- qemu-system-x86 3006 [002] 10562.079422: kvmmmu:kvm_mmu_get_page: [FAILED TO PARSE] mmu_valid_gen=0x2 gfn=0 role=122884 root_count=0 unsync=0 created=1
+ qemu-system-x86 3006 [002] 10562.079422: kvmmmu:kvm_mmu_get_page: new sp gfn 0 0/4 q0 direct --- !pge !nxe root 0 sync
- qemu-system-x86 3006 [002] 10562.080502: kvmmmu:kvm_mmu_prepare_zap_page: [FAILED TO PARSE] mmu_valid_gen=0x2 gfn=0 role=122884 root_count=1 unsync=0
+ qemu-system-x86 3006 [002] 10562.080502: kvmmmu:kvm_mmu_prepare_zap_page: 0/4 q0 direct --- !pge !nxe root 1 sync
qemu-system-x86 3290 [002] 10708.755312: kvmmmu:fast_page_fault: [FAILED TO PARSE] vcpu_id=0 gva=4094486080 error_code=3 sptep=0xffff88019f1e3670 old_spte=336391285 new_spte=336391287 retry=1
- insmod 2576 [001] 781.731666: kvmmmu:kvm_mmu_sync_page: [FAILED TO PARSE] mmu_valid_gen=0x1 gfn=2 role=24624 root_count=10 unsync=1
+ insmod 2576 [001] 781.731666: kvmmmu:kvm_mmu_sync_page: 3/0 q0 --- !pge !nxe root 10 unsync
- insmod 2576 [001] 781.731668: kvmmmu:kvm_mmu_unsync_page: [FAILED TO PARSE] mmu_valid_gen=0x1 gfn=2 role=24624 root_count=10 unsync=1
+ insmod 2576 [001] 781.731668: kvmmmu:kvm_mmu_unsync_page: 3/0 q0 --- !pge !nxe root 10 unsync
Note:
- kvm_mmu_zap_page is replaced by kvm_mmu_prepare_zap_page
in current kernel, keeping it for backward compatibility
- some of the tracepoints keep the same output even with
the plugin handling: kvm:kvm_exit, kvm:kvm_emulate_insn
- the 'kvmmmu:fast_page_fault' is still broken because of
missing is_writable_pte function and is fixed in another patch
- ommited following tracepoints from backport because
the output was buggy
kvm:kvm_nested_vmexit
kvm:kvm_nested_vmexit_inject
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_kvm.c | 419 ++++++++++++++++++++++++++++++++++++++
2 files changed, 420 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_kvm.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 8e546e4..aa95783 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -215,6 +215,7 @@ PEVENT_LIB_OBJS += kbuffer-parse.o
PLUGIN_OBJS = plugin_jbd2.o
PLUGIN_OBJS += plugin_hrtimer.o
PLUGIN_OBJS += plugin_kmem.o
+PLUGIN_OBJS += plugin_kvm.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_kvm.c b/tools/lib/traceevent/plugin_kvm.c
new file mode 100644
index 0000000..be9d9c6
--- /dev/null
+++ b/tools/lib/traceevent/plugin_kvm.c
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "event-parse.h"
+
+#ifdef HAVE_UDIS86
+
+#include <udis86.h>
+
+static ud_t ud;
+
+static void init_disassembler(void)
+{
+ ud_init(&ud);
+ ud_set_syntax(&ud, UD_SYN_ATT);
+}
+
+static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
+ int cr0_pe, int eflags_vm,
+ int cs_d, int cs_l)
+{
+ int mode;
+
+ if (!cr0_pe)
+ mode = 16;
+ else if (eflags_vm)
+ mode = 16;
+ else if (cs_l)
+ mode = 64;
+ else if (cs_d)
+ mode = 32;
+ else
+ mode = 16;
+
+ ud_set_pc(&ud, rip);
+ ud_set_mode(&ud, mode);
+ ud_set_input_buffer(&ud, insn, len);
+ ud_disassemble(&ud);
+ return ud_insn_asm(&ud);
+}
+
+#else
+
+static void init_disassembler(void)
+{
+}
+
+static const char *disassemble(unsigned char *insn, int len, uint64_t rip,
+ int cr0_pe, int eflags_vm,
+ int cs_d, int cs_l)
+{
+ static char out[15*3+1];
+ int i;
+
+ for (i = 0; i < len; ++i)
+ sprintf(out + i * 3, "%02x ", insn[i]);
+ out[len*3-1] = '\0';
+ return out;
+}
+
+#endif
+
+
+#define VMX_EXIT_REASONS \
+ _ER(EXCEPTION_NMI, 0) \
+ _ER(EXTERNAL_INTERRUPT, 1) \
+ _ER(TRIPLE_FAULT, 2) \
+ _ER(PENDING_INTERRUPT, 7) \
+ _ER(NMI_WINDOW, 8) \
+ _ER(TASK_SWITCH, 9) \
+ _ER(CPUID, 10) \
+ _ER(HLT, 12) \
+ _ER(INVD, 13) \
+ _ER(INVLPG, 14) \
+ _ER(RDPMC, 15) \
+ _ER(RDTSC, 16) \
+ _ER(VMCALL, 18) \
+ _ER(VMCLEAR, 19) \
+ _ER(VMLAUNCH, 20) \
+ _ER(VMPTRLD, 21) \
+ _ER(VMPTRST, 22) \
+ _ER(VMREAD, 23) \
+ _ER(VMRESUME, 24) \
+ _ER(VMWRITE, 25) \
+ _ER(VMOFF, 26) \
+ _ER(VMON, 27) \
+ _ER(CR_ACCESS, 28) \
+ _ER(DR_ACCESS, 29) \
+ _ER(IO_INSTRUCTION, 30) \
+ _ER(MSR_READ, 31) \
+ _ER(MSR_WRITE, 32) \
+ _ER(MWAIT_INSTRUCTION, 36) \
+ _ER(MONITOR_INSTRUCTION, 39) \
+ _ER(PAUSE_INSTRUCTION, 40) \
+ _ER(MCE_DURING_VMENTRY, 41) \
+ _ER(TPR_BELOW_THRESHOLD, 43) \
+ _ER(APIC_ACCESS, 44) \
+ _ER(EOI_INDUCED, 45) \
+ _ER(EPT_VIOLATION, 48) \
+ _ER(EPT_MISCONFIG, 49) \
+ _ER(INVEPT, 50) \
+ _ER(PREEMPTION_TIMER, 52) \
+ _ER(WBINVD, 54) \
+ _ER(XSETBV, 55) \
+ _ER(APIC_WRITE, 56) \
+ _ER(INVPCID, 58)
+
+#define SVM_EXIT_REASONS \
+ _ER(EXIT_READ_CR0, 0x000) \
+ _ER(EXIT_READ_CR3, 0x003) \
+ _ER(EXIT_READ_CR4, 0x004) \
+ _ER(EXIT_READ_CR8, 0x008) \
+ _ER(EXIT_WRITE_CR0, 0x010) \
+ _ER(EXIT_WRITE_CR3, 0x013) \
+ _ER(EXIT_WRITE_CR4, 0x014) \
+ _ER(EXIT_WRITE_CR8, 0x018) \
+ _ER(EXIT_READ_DR0, 0x020) \
+ _ER(EXIT_READ_DR1, 0x021) \
+ _ER(EXIT_READ_DR2, 0x022) \
+ _ER(EXIT_READ_DR3, 0x023) \
+ _ER(EXIT_READ_DR4, 0x024) \
+ _ER(EXIT_READ_DR5, 0x025) \
+ _ER(EXIT_READ_DR6, 0x026) \
+ _ER(EXIT_READ_DR7, 0x027) \
+ _ER(EXIT_WRITE_DR0, 0x030) \
+ _ER(EXIT_WRITE_DR1, 0x031) \
+ _ER(EXIT_WRITE_DR2, 0x032) \
+ _ER(EXIT_WRITE_DR3, 0x033) \
+ _ER(EXIT_WRITE_DR4, 0x034) \
+ _ER(EXIT_WRITE_DR5, 0x035) \
+ _ER(EXIT_WRITE_DR6, 0x036) \
+ _ER(EXIT_WRITE_DR7, 0x037) \
+ _ER(EXIT_EXCP_BASE, 0x040) \
+ _ER(EXIT_INTR, 0x060) \
+ _ER(EXIT_NMI, 0x061) \
+ _ER(EXIT_SMI, 0x062) \
+ _ER(EXIT_INIT, 0x063) \
+ _ER(EXIT_VINTR, 0x064) \
+ _ER(EXIT_CR0_SEL_WRITE, 0x065) \
+ _ER(EXIT_IDTR_READ, 0x066) \
+ _ER(EXIT_GDTR_READ, 0x067) \
+ _ER(EXIT_LDTR_READ, 0x068) \
+ _ER(EXIT_TR_READ, 0x069) \
+ _ER(EXIT_IDTR_WRITE, 0x06a) \
+ _ER(EXIT_GDTR_WRITE, 0x06b) \
+ _ER(EXIT_LDTR_WRITE, 0x06c) \
+ _ER(EXIT_TR_WRITE, 0x06d) \
+ _ER(EXIT_RDTSC, 0x06e) \
+ _ER(EXIT_RDPMC, 0x06f) \
+ _ER(EXIT_PUSHF, 0x070) \
+ _ER(EXIT_POPF, 0x071) \
+ _ER(EXIT_CPUID, 0x072) \
+ _ER(EXIT_RSM, 0x073) \
+ _ER(EXIT_IRET, 0x074) \
+ _ER(EXIT_SWINT, 0x075) \
+ _ER(EXIT_INVD, 0x076) \
+ _ER(EXIT_PAUSE, 0x077) \
+ _ER(EXIT_HLT, 0x078) \
+ _ER(EXIT_INVLPG, 0x079) \
+ _ER(EXIT_INVLPGA, 0x07a) \
+ _ER(EXIT_IOIO, 0x07b) \
+ _ER(EXIT_MSR, 0x07c) \
+ _ER(EXIT_TASK_SWITCH, 0x07d) \
+ _ER(EXIT_FERR_FREEZE, 0x07e) \
+ _ER(EXIT_SHUTDOWN, 0x07f) \
+ _ER(EXIT_VMRUN, 0x080) \
+ _ER(EXIT_VMMCALL, 0x081) \
+ _ER(EXIT_VMLOAD, 0x082) \
+ _ER(EXIT_VMSAVE, 0x083) \
+ _ER(EXIT_STGI, 0x084) \
+ _ER(EXIT_CLGI, 0x085) \
+ _ER(EXIT_SKINIT, 0x086) \
+ _ER(EXIT_RDTSCP, 0x087) \
+ _ER(EXIT_ICEBP, 0x088) \
+ _ER(EXIT_WBINVD, 0x089) \
+ _ER(EXIT_MONITOR, 0x08a) \
+ _ER(EXIT_MWAIT, 0x08b) \
+ _ER(EXIT_MWAIT_COND, 0x08c) \
+ _ER(EXIT_NPF, 0x400) \
+ _ER(EXIT_ERR, -1)
+
+#define _ER(reason, val) { #reason, val },
+struct str_values {
+ const char *str;
+ int val;
+};
+
+static struct str_values vmx_exit_reasons[] = {
+ VMX_EXIT_REASONS
+ { NULL, -1}
+};
+
+static struct str_values svm_exit_reasons[] = {
+ SVM_EXIT_REASONS
+ { NULL, -1}
+};
+
+static struct isa_exit_reasons {
+ unsigned isa;
+ struct str_values *strings;
+} isa_exit_reasons[] = {
+ { .isa = 1, .strings = vmx_exit_reasons },
+ { .isa = 2, .strings = svm_exit_reasons },
+ { }
+};
+
+static const char *find_exit_reason(unsigned isa, int val)
+{
+ struct str_values *strings = NULL;
+ int i;
+
+ for (i = 0; isa_exit_reasons[i].strings; ++i)
+ if (isa_exit_reasons[i].isa == isa) {
+ strings = isa_exit_reasons[i].strings;
+ break;
+ }
+ if (!strings)
+ return "UNKNOWN-ISA";
+ for (i = 0; strings[i].val >= 0; i++)
+ if (strings[i].val == val)
+ break;
+ if (strings[i].str)
+ return strings[i].str;
+ return "UNKNOWN";
+}
+
+static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ unsigned long long isa;
+ unsigned long long val;
+ unsigned long long info1 = 0, info2 = 0;
+
+ if (pevent_get_field_val(s, event, "exit_reason", record, &val, 1) < 0)
+ return -1;
+
+ if (pevent_get_field_val(s, event, "isa", record, &isa, 0) < 0)
+ isa = 1;
+
+ trace_seq_printf(s, "reason %s", find_exit_reason(isa, val));
+
+ pevent_print_num_field(s, " rip 0x%lx", event, "guest_rip", record, 1);
+
+ if (pevent_get_field_val(s, event, "info1", record, &info1, 0) >= 0
+ && pevent_get_field_val(s, event, "info2", record, &info2, 0) >= 0)
+ trace_seq_printf(s, " info %llx %llx", info1, info2);
+
+ return 0;
+}
+
+#define KVM_EMUL_INSN_F_CR0_PE (1 << 0)
+#define KVM_EMUL_INSN_F_EFL_VM (1 << 1)
+#define KVM_EMUL_INSN_F_CS_D (1 << 2)
+#define KVM_EMUL_INSN_F_CS_L (1 << 3)
+
+static int kvm_emulate_insn_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ unsigned long long rip, csbase, len, flags, failed;
+ int llen;
+ uint8_t *insn;
+ const char *disasm;
+
+ if (pevent_get_field_val(s, event, "rip", record, &rip, 1) < 0)
+ return -1;
+
+ if (pevent_get_field_val(s, event, "csbase", record, &csbase, 1) < 0)
+ return -1;
+
+ if (pevent_get_field_val(s, event, "len", record, &len, 1) < 0)
+ return -1;
+
+ if (pevent_get_field_val(s, event, "flags", record, &flags, 1) < 0)
+ return -1;
+
+ if (pevent_get_field_val(s, event, "failed", record, &failed, 1) < 0)
+ return -1;
+
+ insn = pevent_get_field_raw(s, event, "insn", record, &llen, 1);
+ if (!insn)
+ return -1;
+
+ disasm = disassemble(insn, len, rip,
+ flags & KVM_EMUL_INSN_F_CR0_PE,
+ flags & KVM_EMUL_INSN_F_EFL_VM,
+ flags & KVM_EMUL_INSN_F_CS_D,
+ flags & KVM_EMUL_INSN_F_CS_L);
+
+ trace_seq_printf(s, "%llx:%llx: %s%s", csbase, rip, disasm,
+ failed ? " FAIL" : "");
+ return 0;
+}
+
+union kvm_mmu_page_role {
+ unsigned word;
+ struct {
+ unsigned glevels:4;
+ unsigned level:4;
+ unsigned quadrant:2;
+ unsigned pad_for_nice_hex_output:6;
+ unsigned direct:1;
+ unsigned access:3;
+ unsigned invalid:1;
+ unsigned cr4_pge:1;
+ unsigned nxe:1;
+ };
+};
+
+static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ unsigned long long val;
+ static const char *access_str[] = {
+ "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux"
+ };
+ union kvm_mmu_page_role role;
+
+ if (pevent_get_field_val(s, event, "role", record, &val, 1) < 0)
+ return -1;
+
+ role.word = (int)val;
+
+ /*
+ * We can only use the structure if file is of the same
+ * endianess.
+ */
+ if (pevent_is_file_bigendian(event->pevent) ==
+ pevent_is_host_bigendian(event->pevent)) {
+
+ trace_seq_printf(s, "%u/%u q%u%s %s%s %spge %snxe",
+ role.level,
+ role.glevels,
+ role.quadrant,
+ role.direct ? " direct" : "",
+ access_str[role.access],
+ role.invalid ? " invalid" : "",
+ role.cr4_pge ? "" : "!",
+ role.nxe ? "" : "!");
+ } else
+ trace_seq_printf(s, "WORD: %08x", role.word);
+
+ pevent_print_num_field(s, " root %u ", event,
+ "root_count", record, 1);
+
+ if (pevent_get_field_val(s, event, "unsync", record, &val, 1) < 0)
+ return -1;
+
+ trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0);
+ return 0;
+}
+
+static int kvm_mmu_get_page_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ unsigned long long val;
+
+ if (pevent_get_field_val(s, event, "created", record, &val, 1) < 0)
+ return -1;
+
+ trace_seq_printf(s, "%s ", val ? "new" : "existing");
+
+ if (pevent_get_field_val(s, event, "gfn", record, &val, 1) < 0)
+ return -1;
+
+ trace_seq_printf(s, "sp gfn %llx ", val);
+ return kvm_mmu_print_role(s, record, event, context);
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ init_disassembler();
+
+ pevent_register_event_handler(pevent, -1, "kvm", "kvm_exit",
+ kvm_exit_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kvm", "kvm_emulate_insn",
+ kvm_emulate_insn_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_get_page",
+ kvm_mmu_get_page_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_sync_page",
+ kvm_mmu_print_role, NULL);
+
+ pevent_register_event_handler(pevent, -1,
+ "kvmmmu", "kvm_mmu_unsync_page",
+ kvm_mmu_print_role, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_zap_page",
+ kvm_mmu_print_role, NULL);
+
+ pevent_register_event_handler(pevent, -1, "kvmmmu",
+ "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
+ NULL);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 10/29] tools lib traceevent: Add mac80211 plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (8 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 09/29] tools lib traceevent: Add kvm plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 11/29] tools lib traceevent: Add sched_switch plugin Jiri Olsa
` (18 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting mac80211 plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds changed field resolving for
mac80211:drv_bss_info_changed tracepoint event.
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'mac80211:drv_bss_info_changed' -a')
--- script.mac80211.old
+++ script.mac80211.new
- ifconfig 3711 [000] 1290.446492: mac80211:drv_bss_info_changed: phy0 vif:wlan0(2) changed:0x309f
+ ifconfig 3711 [000] 1290.446492: mac80211:drv_bss_info_changed: phy0 vif:wlan0(2)
+ assoc:0 aid:2 cts:0 shortpre:0 shortslot:0 dtimper:1
+ bcnint:102 assoc_cap:0x431 basic_rates:0xf enable_beacon:0
+ ht_operation_mode:0
Omitting the mac80211:drv_config tracepoint handling
because the kernel tracepoint changed its prototype
and the plugin handler is no longer working.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_mac80211.c | 95 ++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_mac80211.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index aa95783..2c7c5e6 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -216,6 +216,7 @@ PLUGIN_OBJS = plugin_jbd2.o
PLUGIN_OBJS += plugin_hrtimer.o
PLUGIN_OBJS += plugin_kmem.o
PLUGIN_OBJS += plugin_kvm.o
+PLUGIN_OBJS += plugin_mac80211.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_mac80211.c b/tools/lib/traceevent/plugin_mac80211.c
new file mode 100644
index 0000000..558a3b9
--- /dev/null
+++ b/tools/lib/traceevent/plugin_mac80211.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2009 Johannes Berg <johannes@sipsolutions.net>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+#define INDENT 65
+
+static void print_string(struct trace_seq *s, struct event_format *event,
+ const char *name, const void *data)
+{
+ struct format_field *f = pevent_find_field(event, name);
+ int offset;
+ int length;
+
+ if (!f) {
+ trace_seq_printf(s, "NOTFOUND:%s", name);
+ return;
+ }
+
+ offset = f->offset;
+ length = f->size;
+
+ if (!strncmp(f->type, "__data_loc", 10)) {
+ unsigned long long v;
+ if (pevent_read_number_field(f, data, &v)) {
+ trace_seq_printf(s, "invalid_data_loc");
+ return;
+ }
+ offset = v & 0xffff;
+ length = v >> 16;
+ }
+
+ trace_seq_printf(s, "%.*s", length, (char *)data + offset);
+}
+
+#define SF(fn) pevent_print_num_field(s, fn ":%d", event, fn, record, 0)
+#define SFX(fn) pevent_print_num_field(s, fn ":%#x", event, fn, record, 0)
+#define SP() trace_seq_putc(s, ' ')
+
+static int drv_bss_info_changed(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ void *data = record->data;
+
+ print_string(s, event, "wiphy_name", data);
+ trace_seq_printf(s, " vif:");
+ print_string(s, event, "vif_name", data);
+ pevent_print_num_field(s, "(%d)", event, "vif_type", record, 1);
+
+ trace_seq_printf(s, "\n%*s", INDENT, "");
+ SF("assoc"); SP();
+ SF("aid"); SP();
+ SF("cts"); SP();
+ SF("shortpre"); SP();
+ SF("shortslot"); SP();
+ SF("dtimper"); SP();
+ trace_seq_printf(s, "\n%*s", INDENT, "");
+ SF("bcnint"); SP();
+ SFX("assoc_cap"); SP();
+ SFX("basic_rates"); SP();
+ SF("enable_beacon");
+ trace_seq_printf(s, "\n%*s", INDENT, "");
+ SF("ht_operation_mode");
+
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_event_handler(pevent, -1, "mac80211",
+ "drv_bss_info_changed",
+ drv_bss_info_changed, NULL);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 11/29] tools lib traceevent: Add sched_switch plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (9 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 10/29] tools lib traceevent: Add mac80211 plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 12/29] tools lib traceevent: Add function plugin Jiri Olsa
` (17 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting sched_switch plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds fields resolving for
sched:sched_switch tracepoint event.
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e sched:sched_switch -a')
--- script.sched_switch.old
+++ script.sched_switch.new
- perf 577 [002] 30965.311852: sched:sched_switch: prev_comm=perf prev_pid=577 prev_prio=120 prev_state=S ==> next_comm=swapper/2 next_pid=0 next_prio=120
+ perf 577 [002] 30965.311852: sched:sched_switch: perf:577 [120] S ==> swapper/2:0 [120]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_sched_switch.c | 148 +++++++++++++++++++++++++++++
2 files changed, 149 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_sched_switch.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 2c7c5e6..726e9bb 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -217,6 +217,7 @@ PLUGIN_OBJS += plugin_hrtimer.o
PLUGIN_OBJS += plugin_kmem.o
PLUGIN_OBJS += plugin_kvm.o
PLUGIN_OBJS += plugin_mac80211.o
+PLUGIN_OBJS += plugin_sched_switch.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_sched_switch.c b/tools/lib/traceevent/plugin_sched_switch.c
new file mode 100644
index 0000000..fea3724
--- /dev/null
+++ b/tools/lib/traceevent/plugin_sched_switch.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+
+static void write_state(struct trace_seq *s, int val)
+{
+ const char states[] = "SDTtZXxW";
+ int found = 0;
+ int i;
+
+ for (i = 0; i < (sizeof(states) - 1); i++) {
+ if (!(val & (1 << i)))
+ continue;
+
+ if (found)
+ trace_seq_putc(s, '|');
+
+ found = 1;
+ trace_seq_putc(s, states[i]);
+ }
+
+ if (!found)
+ trace_seq_putc(s, 'R');
+}
+
+static void write_and_save_comm(struct format_field *field,
+ struct pevent_record *record,
+ struct trace_seq *s, int pid)
+{
+ const char *comm;
+ int len;
+
+ comm = (char *)(record->data + field->offset);
+ len = s->len;
+ trace_seq_printf(s, "%.*s",
+ field->size, comm);
+
+ /* make sure the comm has a \0 at the end. */
+ trace_seq_terminate(s);
+ comm = &s->buffer[len];
+
+ /* Help out the comm to ids. This will handle dups */
+ pevent_register_comm(field->event->pevent, comm, pid);
+}
+
+static int sched_wakeup_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ struct format_field *field;
+ unsigned long long val;
+
+ if (pevent_get_field_val(s, event, "pid", record, &val, 1))
+ return trace_seq_putc(s, '!');
+
+ field = pevent_find_any_field(event, "comm");
+ if (field) {
+ write_and_save_comm(field, record, s, val);
+ trace_seq_putc(s, ':');
+ }
+ trace_seq_printf(s, "%lld", val);
+
+ if (pevent_get_field_val(s, event, "prio", record, &val, 0) == 0)
+ trace_seq_printf(s, " [%lld]", val);
+
+ if (pevent_get_field_val(s, event, "success", record, &val, 1) == 0)
+ trace_seq_printf(s, " success=%lld", val);
+
+ if (pevent_get_field_val(s, event, "target_cpu", record, &val, 0) == 0)
+ trace_seq_printf(s, " CPU:%03llu", val);
+
+ return 0;
+}
+
+static int sched_switch_handler(struct trace_seq *s,
+ struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ struct format_field *field;
+ unsigned long long val;
+
+ if (pevent_get_field_val(s, event, "prev_pid", record, &val, 1))
+ return trace_seq_putc(s, '!');
+
+ field = pevent_find_any_field(event, "prev_comm");
+ if (field) {
+ write_and_save_comm(field, record, s, val);
+ trace_seq_putc(s, ':');
+ }
+ trace_seq_printf(s, "%lld ", val);
+
+ if (pevent_get_field_val(s, event, "prev_prio", record, &val, 0) == 0)
+ trace_seq_printf(s, "[%lld] ", val);
+
+ if (pevent_get_field_val(s, event, "prev_state", record, &val, 0) == 0)
+ write_state(s, val);
+
+ trace_seq_puts(s, " ==> ");
+
+ if (pevent_get_field_val(s, event, "next_pid", record, &val, 1))
+ return trace_seq_putc(s, '!');
+
+ field = pevent_find_any_field(event, "next_comm");
+ if (field) {
+ write_and_save_comm(field, record, s, val);
+ trace_seq_putc(s, ':');
+ }
+ trace_seq_printf(s, "%lld", val);
+
+ if (pevent_get_field_val(s, event, "next_prio", record, &val, 0) == 0)
+ trace_seq_printf(s, " [%lld]", val);
+
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_event_handler(pevent, -1, "sched", "sched_switch",
+ sched_switch_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "sched", "sched_wakeup",
+ sched_wakeup_handler, NULL);
+
+ pevent_register_event_handler(pevent, -1, "sched", "sched_wakeup_new",
+ sched_wakeup_handler, NULL);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 12/29] tools lib traceevent: Add function plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (10 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 11/29] tools lib traceevent: Add sched_switch plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 13/29] tools lib traceevent: Add xen plugin Jiri Olsa
` (16 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Backporting function plugin.
Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
This plugin adds function and parent function fields
resolving for ftrace:function tracepoint event.
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e ftrace:function ls')
--- script.function.old
+++ script.function.new
- ls 10781 [001] 32667.291379: ftrace:function: ffffffff811adb80 <-- ffffffff811afc48
- ls 10781 [001] 32667.291379: ftrace:function: ffffffff811b35d0 <-- ffffffff811adb9b
- ls 10781 [001] 32667.291380: ftrace:function: ffffffff811b3520 <-- ffffffff811b35e8
- ls 10781 [001] 32667.291380: ftrace:function: ffffffff811b2720 <-- ffffffff811b3549
- ls 10781 [001] 32667.291381: ftrace:function: ffffffff81297e10 <-- ffffffff811b356c
- ls 10781 [001] 32667.291381: ftrace:function: ffffffff81298f40 <-- ffffffff81297e2c
- ls 10781 [001] 32667.291382: ftrace:function: ffffffff81076160 <-- ffffffff811afbf0
- ls 10781 [001] 32667.291383: ftrace:function: ffffffff811c3eb0 <-- ffffffff811afbfc
- ls 10781 [001] 32667.291383: ftrace:function: ffffffff8164e100 <-- ffffffff811c3ed8
- ls 10781 [001] 32667.291384: ftrace:function: ffffffff811a5d10 <-- ffffffff811c3f53
- ls 10781 [001] 32667.291384: ftrace:function: ffffffff811e8e70 <-- ffffffff811a5d58
- ls 10781 [001] 32667.291385: ftrace:function: ffffffff811f38e0 <-- ffffffff811a5d63
- ls 10781 [001] 32667.291385: ftrace:function: ffffffff811a9ff0 <-- ffffffff811a5d6b
- ls 10781 [001] 32667.291386: ftrace:function: ffffffff811a9fa0 <-- ffffffff811aa015
- ls 10781 [001] 32667.291387: ftrace:function: ffffffff810851c0 <-- ffffffff811aa053
- ls 10781 [001] 32667.291387: ftrace:function: ffffffff81090e00 <-- ffffffff81085211
+ ls 10781 [001] 32667.291379: ftrace:function: would_dump <-- setup_new_exec
+ ls 10781 [001] 32667.291379: ftrace:function: inode_permission <-- would_dump
+ ls 10781 [001] 32667.291380: ftrace:function: __inode_permission <-- inode_permission
+ ls 10781 [001] 32667.291380: ftrace:function: generic_permission <-- __inode_permission
+ ls 10781 [001] 32667.291381: ftrace:function: security_inode_permission <-- __inode_permission
+ ls 10781 [001] 32667.291381: ftrace:function: cap_inode_permission <-- security_inode_permission
+ ls 10781 [001] 32667.291382: ftrace:function: flush_signal_handlers <-- setup_new_exec
+ ls 10781 [001] 32667.291383: ftrace:function: do_close_on_exec <-- setup_new_exec
+ ls 10781 [001] 32667.291383: ftrace:function: _raw_spin_lock <-- do_close_on_exec
+ ls 10781 [001] 32667.291384: ftrace:function: filp_close <-- do_close_on_exec
+ ls 10781 [001] 32667.291384: ftrace:function: dnotify_flush <-- filp_close
+ ls 10781 [001] 32667.291385: ftrace:function: locks_remove_posix <-- filp_close
+ ls 10781 [001] 32667.291385: ftrace:function: fput <-- filp_close
+ ls 10781 [001] 32667.291386: ftrace:function: file_sb_list_del <-- fput
+ ls 10781 [001] 32667.291387: ftrace:function: task_work_add <-- fput
+ ls 10781 [001] 32667.291387: ftrace:function: kick_process <-- task_work_add
Removing options support as it's not backported yet.
Currently this plugin supports 2 options:
'parent' to display parent function
'indent' to show function call indents
Enabling both of them by default.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_function.c | 151 +++++++++++++++++++++++++++++++++
2 files changed, 152 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_function.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 726e9bb..63ef6c8 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -218,6 +218,7 @@ PLUGIN_OBJS += plugin_kmem.o
PLUGIN_OBJS += plugin_kvm.o
PLUGIN_OBJS += plugin_mac80211.o
PLUGIN_OBJS += plugin_sched_switch.o
+PLUGIN_OBJS += plugin_function.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
new file mode 100644
index 0000000..8deb22e
--- /dev/null
+++ b/tools/lib/traceevent/plugin_function.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event-parse.h"
+#include "event-utils.h"
+
+static struct func_stack {
+ int index;
+ int size;
+ char **stack;
+} *fstack;
+
+static int cpus = -1;
+
+#define STK_BLK 10
+
+static void add_child(struct func_stack *stack, const char *child, int pos)
+{
+ int i;
+
+ if (!child)
+ return;
+
+ if (pos < stack->size)
+ free(stack->stack[pos]);
+ else {
+ if (!stack->stack)
+ stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
+ else
+ stack->stack = realloc(stack->stack, sizeof(char *) *
+ (stack->size + STK_BLK));
+ for (i = stack->size; i < stack->size + STK_BLK; i++)
+ stack->stack[i] = NULL;
+ stack->size += STK_BLK;
+ }
+
+ stack->stack[pos] = strdup(child);
+}
+
+static int get_index(const char *parent, const char *child, int cpu)
+{
+ int i;
+
+ if (cpu < 0)
+ return 0;
+
+ if (cpu > cpus) {
+ if (fstack)
+ fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
+ else
+ fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
+
+ /* Account for holes in the cpu count */
+ for (i = cpus + 1; i <= cpu; i++)
+ memset(&fstack[i], 0, sizeof(fstack[i]));
+ cpus = cpu;
+ }
+
+ for (i = 0; i < fstack[cpu].size && fstack[cpu].stack[i]; i++) {
+ if (strcmp(parent, fstack[cpu].stack[i]) == 0) {
+ add_child(&fstack[cpu], child, i+1);
+ return i;
+ }
+ }
+
+ /* Not found */
+ add_child(&fstack[cpu], parent, 0);
+ add_child(&fstack[cpu], child, 1);
+ return 0;
+}
+
+static int function_handler(struct trace_seq *s, struct pevent_record *record,
+ struct event_format *event, void *context)
+{
+ struct pevent *pevent = event->pevent;
+ unsigned long long function;
+ unsigned long long pfunction;
+ const char *func;
+ const char *parent;
+ int i, index;
+
+ if (pevent_get_field_val(s, event, "ip", record, &function, 1))
+ return trace_seq_putc(s, '!');
+
+ func = pevent_find_function(pevent, function);
+
+ if (pevent_get_field_val(s, event, "parent_ip", record, &pfunction, 1))
+ return trace_seq_putc(s, '!');
+
+ parent = pevent_find_function(pevent, pfunction);
+
+ index = get_index(parent, func, record->cpu);
+
+ for (i = 0; i < index; i++)
+ trace_seq_printf(s, " ");
+
+ if (func)
+ trace_seq_printf(s, "%s", func);
+ else
+ trace_seq_printf(s, "0x%llx", function);
+
+ trace_seq_printf(s, " <-- ");
+ if (parent)
+ trace_seq_printf(s, "%s", parent);
+ else
+ trace_seq_printf(s, "0x%llx", pfunction);
+
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_event_handler(pevent, -1, "ftrace", "function",
+ function_handler, NULL);
+ return 0;
+}
+
+void PEVENT_PLUGIN_UNLOADER(void)
+{
+ int i, x;
+
+ for (i = 0; i <= cpus; i++) {
+ for (x = 0; x < fstack[i].size && fstack[i].stack[x]; x++)
+ free(fstack[i].stack[x]);
+ free(fstack[i].stack);
+ }
+
+ free(fstack);
+ fstack = NULL;
+ cpus = -1;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 13/29] tools lib traceevent: Add xen plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (11 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 12/29] tools lib traceevent: Add function plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 14/29] tools lib traceevent: Add scsi plugin Jiri Olsa
` (15 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern,
Jeremy Fitzhardinge
Adding xen plugin.
This plugin adds fields resolving for
following tracepoint events:
xen:xen_mc_entry
xen:xen_mc_extend_args
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'xen:*' ls')
--- script.xen.old
+++ script.xen.new
- swapper 0 [002] 136.267492: xen:xen_mc_entry: [FAILED TO PARSE] op=3 nargs=2 args=ARRAY[18, 00, 00, 00, 00, 00, 00, 00, 00, e0, d4, 4b, 04, 88, ff, ff, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
+ swapper 0 [002] 136.267492: xen:xen_mc_entry: op 3(stack_switch) args [18, 0, 0, 0, 0, 0]
- perf 1970 [008] 136.273319: xen:xen_mc_extend_args: [FAILED TO PARSE] op=1 args=16 res=1
+ perf 1970 [008] 136.273319: xen:xen_mc_extend_args: extending op 1(mmu_update) by 16 bytes res ???
NOTE We still do not handle the 'sizeof' and fail
to parse following xen tracepoints:
xen:xen_mmu_set_pte
xen:xen_mmu_set_pte_atomic
xen:xen_mmu_set_domain_pte
xen:xen_mmu_set_pte_at
xen:xen_mmu_set_pmd
xen:xen_mmu_set_pud
xen:xen_mmu_set_pgd
xen:xen_mmu_ptep_modify_prot_start
xen:xen_mmu_ptep_modify_prot_commit
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_xen.c | 130 ++++++++++++++++++++++++++++++++++++++
2 files changed, 131 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_xen.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 63ef6c8..4356a6e 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -219,6 +219,7 @@ PLUGIN_OBJS += plugin_kvm.o
PLUGIN_OBJS += plugin_mac80211.o
PLUGIN_OBJS += plugin_sched_switch.o
PLUGIN_OBJS += plugin_function.o
+PLUGIN_OBJS += plugin_xen.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_xen.c b/tools/lib/traceevent/plugin_xen.c
new file mode 100644
index 0000000..e779429
--- /dev/null
+++ b/tools/lib/traceevent/plugin_xen.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "event-parse.h"
+
+#define __HYPERVISOR_set_trap_table 0
+#define __HYPERVISOR_mmu_update 1
+#define __HYPERVISOR_set_gdt 2
+#define __HYPERVISOR_stack_switch 3
+#define __HYPERVISOR_set_callbacks 4
+#define __HYPERVISOR_fpu_taskswitch 5
+#define __HYPERVISOR_sched_op_compat 6
+#define __HYPERVISOR_dom0_op 7
+#define __HYPERVISOR_set_debugreg 8
+#define __HYPERVISOR_get_debugreg 9
+#define __HYPERVISOR_update_descriptor 10
+#define __HYPERVISOR_memory_op 12
+#define __HYPERVISOR_multicall 13
+#define __HYPERVISOR_update_va_mapping 14
+#define __HYPERVISOR_set_timer_op 15
+#define __HYPERVISOR_event_channel_op_compat 16
+#define __HYPERVISOR_xen_version 17
+#define __HYPERVISOR_console_io 18
+#define __HYPERVISOR_physdev_op_compat 19
+#define __HYPERVISOR_grant_table_op 20
+#define __HYPERVISOR_vm_assist 21
+#define __HYPERVISOR_update_va_mapping_otherdomain 22
+#define __HYPERVISOR_iret 23 /* x86 only */
+#define __HYPERVISOR_vcpu_op 24
+#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
+#define __HYPERVISOR_mmuext_op 26
+#define __HYPERVISOR_acm_op 27
+#define __HYPERVISOR_nmi_op 28
+#define __HYPERVISOR_sched_op 29
+#define __HYPERVISOR_callback_op 30
+#define __HYPERVISOR_xenoprof_op 31
+#define __HYPERVISOR_event_channel_op 32
+#define __HYPERVISOR_physdev_op 33
+#define __HYPERVISOR_hvm_op 34
+#define __HYPERVISOR_tmem_op 38
+
+/* Architecture-specific hypercall definitions. */
+#define __HYPERVISOR_arch_0 48
+#define __HYPERVISOR_arch_1 49
+#define __HYPERVISOR_arch_2 50
+#define __HYPERVISOR_arch_3 51
+#define __HYPERVISOR_arch_4 52
+#define __HYPERVISOR_arch_5 53
+#define __HYPERVISOR_arch_6 54
+#define __HYPERVISOR_arch_7 55
+
+#define N(x) [__HYPERVISOR_##x] = "("#x")"
+static const char *xen_hypercall_names[] = {
+ N(set_trap_table),
+ N(mmu_update),
+ N(set_gdt),
+ N(stack_switch),
+ N(set_callbacks),
+ N(fpu_taskswitch),
+ N(sched_op_compat),
+ N(dom0_op),
+ N(set_debugreg),
+ N(get_debugreg),
+ N(update_descriptor),
+ N(memory_op),
+ N(multicall),
+ N(update_va_mapping),
+ N(set_timer_op),
+ N(event_channel_op_compat),
+ N(xen_version),
+ N(console_io),
+ N(physdev_op_compat),
+ N(grant_table_op),
+ N(vm_assist),
+ N(update_va_mapping_otherdomain),
+ N(iret),
+ N(vcpu_op),
+ N(set_segment_base),
+ N(mmuext_op),
+ N(acm_op),
+ N(nmi_op),
+ N(sched_op),
+ N(callback_op),
+ N(xenoprof_op),
+ N(event_channel_op),
+ N(physdev_op),
+ N(hvm_op),
+
+/* Architecture-specific hypercall definitions. */
+ N(arch_0),
+ N(arch_1),
+ N(arch_2),
+ N(arch_3),
+ N(arch_4),
+ N(arch_5),
+ N(arch_6),
+ N(arch_7),
+};
+#undef N
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+static const char *xen_hypercall_name(unsigned op)
+{
+ if (op < ARRAY_SIZE(xen_hypercall_names) &&
+ xen_hypercall_names[op] != NULL)
+ return xen_hypercall_names[op];
+
+ return "";
+}
+
+unsigned long long process_xen_hypercall_name(struct trace_seq *s,
+ unsigned long long *args)
+{
+ unsigned int op = args[0];
+
+ trace_seq_printf(s, "%s", xen_hypercall_name(op));
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_print_function(pevent,
+ process_xen_hypercall_name,
+ PEVENT_FUNC_ARG_STRING,
+ "xen_hypercall_name",
+ PEVENT_FUNC_ARG_INT,
+ PEVENT_FUNC_ARG_VOID);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 14/29] tools lib traceevent: Add scsi plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (12 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 13/29] tools lib traceevent: Add xen plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 15/29] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
` (14 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern,
Martin K. Petersen
Adding scsi plugin.
This plugin adds fields resolving functions for following
tracepoint events:
scsi:scsi_dispatch_cmd_start
scsi:scsi_dispatch_cmd_error
scsi:scsi_dispatch_cmd_done
scsi:scsi_dispatch_cmd_timeout
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'scsi:scsi_dispatch_cmd*' -a)
- swapper 0 [000] 6620.491019: scsi:scsi_dispatch_cmd_done: [FAILED TO PARSE] host_no=0 channel=0 id=0 lun=0 result=0 opcode=53 cmd_len=10 data_sglen=0 prot_sglen=0 prot_op=0 cmnd=5
+ swapper 0 [000] 6620.491019: scsi:scsi_dispatch_cmd_done: host_no=0 channel=0 id=0 lun=0 data_sgl=0 prot_sgl=0 prot_op=SCSI_PROT_NORMAL cmnd=(SYNCHRONIZE_CACHE - raw=35 00 00 00 00 00 00 00 00 00) result=(driver=DRIVER_OK host=DID_OK message=COMMAND_COMPLETE status=SAM_STAT_GOOD)
- kworker/0:0 21554 [000] 6620.491126: scsi:scsi_dispatch_cmd_start: [FAILED TO PARSE] host_no=0 channel=0 id=0 lun=0 opcode=42 cmd_len=10 data_sglen=1 prot_sglen=0 prot_op=0 cmnd=*
+ kworker/0:0 21554 [000] 6620.491126: scsi:scsi_dispatch_cmd_start: host_no=0 channel=0 id=0 lun=0 data_sgl=1 prot_sgl=0 prot_op=SCSI_PROT_NORMAL cmnd=(WRITE_10 lba=570899168 txlen=8 protect=0 raw=2a 00 22 07 3a e0 00 00 08 00)
- jbd2/dm-3-8 593 [002] 6621.607992: scsi:scsi_dispatch_cmd_error: [FAILED TO PARSE] host_no=0 channel=0 id=0 lun=0 rtn=4182 opcode=53 cmd_len=10 data_sglen=0 prot_sglen=0 prot_op=0 cmnd=5
+ jbd2/dm-3-8 593 [002] 6621.607992: scsi:scsi_dispatch_cmd_error: host_no=0 channel=0 id=0 lun=0 data_sgl=0 prot_sgl=0 prot_op=SCSI_PROT_NORMAL cmnd=(SYNCHRONIZE_CACHE - raw=35 00 00 00 00 00 00 00 00 00) rtn=4182
NOTE I couldn't generate scsi_dispatch_cmd_timeout tracepoint,
but it's similar to the rest, so I believe it's ok.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_scsi.c | 423 +++++++++++++++++++++++++++++++++++++
2 files changed, 424 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_scsi.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 4356a6e..5c178ea 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -220,6 +220,7 @@ PLUGIN_OBJS += plugin_mac80211.o
PLUGIN_OBJS += plugin_sched_switch.o
PLUGIN_OBJS += plugin_function.o
PLUGIN_OBJS += plugin_xen.o
+PLUGIN_OBJS += plugin_scsi.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_scsi.c b/tools/lib/traceevent/plugin_scsi.c
new file mode 100644
index 0000000..6fb8e3e
--- /dev/null
+++ b/tools/lib/traceevent/plugin_scsi.c
@@ -0,0 +1,423 @@
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include "event-parse.h"
+
+typedef unsigned long sector_t;
+typedef uint64_t u64;
+typedef unsigned int u32;
+
+/*
+ * SCSI opcodes
+ */
+#define TEST_UNIT_READY 0x00
+#define REZERO_UNIT 0x01
+#define REQUEST_SENSE 0x03
+#define FORMAT_UNIT 0x04
+#define READ_BLOCK_LIMITS 0x05
+#define REASSIGN_BLOCKS 0x07
+#define INITIALIZE_ELEMENT_STATUS 0x07
+#define READ_6 0x08
+#define WRITE_6 0x0a
+#define SEEK_6 0x0b
+#define READ_REVERSE 0x0f
+#define WRITE_FILEMARKS 0x10
+#define SPACE 0x11
+#define INQUIRY 0x12
+#define RECOVER_BUFFERED_DATA 0x14
+#define MODE_SELECT 0x15
+#define RESERVE 0x16
+#define RELEASE 0x17
+#define COPY 0x18
+#define ERASE 0x19
+#define MODE_SENSE 0x1a
+#define START_STOP 0x1b
+#define RECEIVE_DIAGNOSTIC 0x1c
+#define SEND_DIAGNOSTIC 0x1d
+#define ALLOW_MEDIUM_REMOVAL 0x1e
+
+#define READ_FORMAT_CAPACITIES 0x23
+#define SET_WINDOW 0x24
+#define READ_CAPACITY 0x25
+#define READ_10 0x28
+#define WRITE_10 0x2a
+#define SEEK_10 0x2b
+#define POSITION_TO_ELEMENT 0x2b
+#define WRITE_VERIFY 0x2e
+#define VERIFY 0x2f
+#define SEARCH_HIGH 0x30
+#define SEARCH_EQUAL 0x31
+#define SEARCH_LOW 0x32
+#define SET_LIMITS 0x33
+#define PRE_FETCH 0x34
+#define READ_POSITION 0x34
+#define SYNCHRONIZE_CACHE 0x35
+#define LOCK_UNLOCK_CACHE 0x36
+#define READ_DEFECT_DATA 0x37
+#define MEDIUM_SCAN 0x38
+#define COMPARE 0x39
+#define COPY_VERIFY 0x3a
+#define WRITE_BUFFER 0x3b
+#define READ_BUFFER 0x3c
+#define UPDATE_BLOCK 0x3d
+#define READ_LONG 0x3e
+#define WRITE_LONG 0x3f
+#define CHANGE_DEFINITION 0x40
+#define WRITE_SAME 0x41
+#define UNMAP 0x42
+#define READ_TOC 0x43
+#define READ_HEADER 0x44
+#define GET_EVENT_STATUS_NOTIFICATION 0x4a
+#define LOG_SELECT 0x4c
+#define LOG_SENSE 0x4d
+#define XDWRITEREAD_10 0x53
+#define MODE_SELECT_10 0x55
+#define RESERVE_10 0x56
+#define RELEASE_10 0x57
+#define MODE_SENSE_10 0x5a
+#define PERSISTENT_RESERVE_IN 0x5e
+#define PERSISTENT_RESERVE_OUT 0x5f
+#define VARIABLE_LENGTH_CMD 0x7f
+#define REPORT_LUNS 0xa0
+#define SECURITY_PROTOCOL_IN 0xa2
+#define MAINTENANCE_IN 0xa3
+#define MAINTENANCE_OUT 0xa4
+#define MOVE_MEDIUM 0xa5
+#define EXCHANGE_MEDIUM 0xa6
+#define READ_12 0xa8
+#define WRITE_12 0xaa
+#define READ_MEDIA_SERIAL_NUMBER 0xab
+#define WRITE_VERIFY_12 0xae
+#define VERIFY_12 0xaf
+#define SEARCH_HIGH_12 0xb0
+#define SEARCH_EQUAL_12 0xb1
+#define SEARCH_LOW_12 0xb2
+#define SECURITY_PROTOCOL_OUT 0xb5
+#define READ_ELEMENT_STATUS 0xb8
+#define SEND_VOLUME_TAG 0xb6
+#define WRITE_LONG_2 0xea
+#define EXTENDED_COPY 0x83
+#define RECEIVE_COPY_RESULTS 0x84
+#define ACCESS_CONTROL_IN 0x86
+#define ACCESS_CONTROL_OUT 0x87
+#define READ_16 0x88
+#define WRITE_16 0x8a
+#define READ_ATTRIBUTE 0x8c
+#define WRITE_ATTRIBUTE 0x8d
+#define VERIFY_16 0x8f
+#define SYNCHRONIZE_CACHE_16 0x91
+#define WRITE_SAME_16 0x93
+#define SERVICE_ACTION_IN 0x9e
+/* values for service action in */
+#define SAI_READ_CAPACITY_16 0x10
+#define SAI_GET_LBA_STATUS 0x12
+/* values for VARIABLE_LENGTH_CMD service action codes
+ * see spc4r17 Section D.3.5, table D.7 and D.8 */
+#define VLC_SA_RECEIVE_CREDENTIAL 0x1800
+/* values for maintenance in */
+#define MI_REPORT_IDENTIFYING_INFORMATION 0x05
+#define MI_REPORT_TARGET_PGS 0x0a
+#define MI_REPORT_ALIASES 0x0b
+#define MI_REPORT_SUPPORTED_OPERATION_CODES 0x0c
+#define MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS 0x0d
+#define MI_REPORT_PRIORITY 0x0e
+#define MI_REPORT_TIMESTAMP 0x0f
+#define MI_MANAGEMENT_PROTOCOL_IN 0x10
+/* value for MI_REPORT_TARGET_PGS ext header */
+#define MI_EXT_HDR_PARAM_FMT 0x20
+/* values for maintenance out */
+#define MO_SET_IDENTIFYING_INFORMATION 0x06
+#define MO_SET_TARGET_PGS 0x0a
+#define MO_CHANGE_ALIASES 0x0b
+#define MO_SET_PRIORITY 0x0e
+#define MO_SET_TIMESTAMP 0x0f
+#define MO_MANAGEMENT_PROTOCOL_OUT 0x10
+/* values for variable length command */
+#define XDREAD_32 0x03
+#define XDWRITE_32 0x04
+#define XPWRITE_32 0x06
+#define XDWRITEREAD_32 0x07
+#define READ_32 0x09
+#define VERIFY_32 0x0a
+#define WRITE_32 0x0b
+#define WRITE_SAME_32 0x0d
+
+#define SERVICE_ACTION16(cdb) (cdb[1] & 0x1f)
+#define SERVICE_ACTION32(cdb) ((cdb[8] << 8) | cdb[9])
+
+static const char *
+scsi_trace_misc(struct trace_seq *, unsigned char *, int);
+
+static const char *
+scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+ sector_t lba = 0, txlen = 0;
+
+ lba |= ((cdb[1] & 0x1F) << 16);
+ lba |= (cdb[2] << 8);
+ lba |= cdb[3];
+ txlen = cdb[4];
+
+ trace_seq_printf(p, "lba=%llu txlen=%llu",
+ (unsigned long long)lba, (unsigned long long)txlen);
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_rw10(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+ sector_t lba = 0, txlen = 0;
+
+ lba |= (cdb[2] << 24);
+ lba |= (cdb[3] << 16);
+ lba |= (cdb[4] << 8);
+ lba |= cdb[5];
+ txlen |= (cdb[7] << 8);
+ txlen |= cdb[8];
+
+ trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
+ (unsigned long long)lba, (unsigned long long)txlen,
+ cdb[1] >> 5);
+
+ if (cdb[0] == WRITE_SAME)
+ trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
+
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_rw12(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+ sector_t lba = 0, txlen = 0;
+
+ lba |= (cdb[2] << 24);
+ lba |= (cdb[3] << 16);
+ lba |= (cdb[4] << 8);
+ lba |= cdb[5];
+ txlen |= (cdb[6] << 24);
+ txlen |= (cdb[7] << 16);
+ txlen |= (cdb[8] << 8);
+ txlen |= cdb[9];
+
+ trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
+ (unsigned long long)lba, (unsigned long long)txlen,
+ cdb[1] >> 5);
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_rw16(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+ sector_t lba = 0, txlen = 0;
+
+ lba |= ((u64)cdb[2] << 56);
+ lba |= ((u64)cdb[3] << 48);
+ lba |= ((u64)cdb[4] << 40);
+ lba |= ((u64)cdb[5] << 32);
+ lba |= (cdb[6] << 24);
+ lba |= (cdb[7] << 16);
+ lba |= (cdb[8] << 8);
+ lba |= cdb[9];
+ txlen |= (cdb[10] << 24);
+ txlen |= (cdb[11] << 16);
+ txlen |= (cdb[12] << 8);
+ txlen |= cdb[13];
+
+ trace_seq_printf(p, "lba=%llu txlen=%llu protect=%u",
+ (unsigned long long)lba, (unsigned long long)txlen,
+ cdb[1] >> 5);
+
+ if (cdb[0] == WRITE_SAME_16)
+ trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
+
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_rw32(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len, *cmd;
+ sector_t lba = 0, txlen = 0;
+ u32 ei_lbrt = 0;
+
+ switch (SERVICE_ACTION32(cdb)) {
+ case READ_32:
+ cmd = "READ";
+ break;
+ case VERIFY_32:
+ cmd = "VERIFY";
+ break;
+ case WRITE_32:
+ cmd = "WRITE";
+ break;
+ case WRITE_SAME_32:
+ cmd = "WRITE_SAME";
+ break;
+ default:
+ trace_seq_printf(p, "UNKNOWN");
+ goto out;
+ }
+
+ lba |= ((u64)cdb[12] << 56);
+ lba |= ((u64)cdb[13] << 48);
+ lba |= ((u64)cdb[14] << 40);
+ lba |= ((u64)cdb[15] << 32);
+ lba |= (cdb[16] << 24);
+ lba |= (cdb[17] << 16);
+ lba |= (cdb[18] << 8);
+ lba |= cdb[19];
+ ei_lbrt |= (cdb[20] << 24);
+ ei_lbrt |= (cdb[21] << 16);
+ ei_lbrt |= (cdb[22] << 8);
+ ei_lbrt |= cdb[23];
+ txlen |= (cdb[28] << 24);
+ txlen |= (cdb[29] << 16);
+ txlen |= (cdb[30] << 8);
+ txlen |= cdb[31];
+
+ trace_seq_printf(p, "%s_32 lba=%llu txlen=%llu protect=%u ei_lbrt=%u",
+ cmd, (unsigned long long)lba,
+ (unsigned long long)txlen, cdb[10] >> 5, ei_lbrt);
+
+ if (SERVICE_ACTION32(cdb) == WRITE_SAME_32)
+ trace_seq_printf(p, " unmap=%u", cdb[10] >> 3 & 1);
+
+out:
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_unmap(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+ unsigned int regions = cdb[7] << 8 | cdb[8];
+
+ trace_seq_printf(p, "regions=%u", (regions - 8) / 16);
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_service_action_in(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len, *cmd;
+ sector_t lba = 0;
+ u32 alloc_len = 0;
+
+ switch (SERVICE_ACTION16(cdb)) {
+ case SAI_READ_CAPACITY_16:
+ cmd = "READ_CAPACITY_16";
+ break;
+ case SAI_GET_LBA_STATUS:
+ cmd = "GET_LBA_STATUS";
+ break;
+ default:
+ trace_seq_printf(p, "UNKNOWN");
+ goto out;
+ }
+
+ lba |= ((u64)cdb[2] << 56);
+ lba |= ((u64)cdb[3] << 48);
+ lba |= ((u64)cdb[4] << 40);
+ lba |= ((u64)cdb[5] << 32);
+ lba |= (cdb[6] << 24);
+ lba |= (cdb[7] << 16);
+ lba |= (cdb[8] << 8);
+ lba |= cdb[9];
+ alloc_len |= (cdb[10] << 24);
+ alloc_len |= (cdb[11] << 16);
+ alloc_len |= (cdb[12] << 8);
+ alloc_len |= cdb[13];
+
+ trace_seq_printf(p, "%s lba=%llu alloc_len=%u", cmd,
+ (unsigned long long)lba, alloc_len);
+
+out:
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+static const char *
+scsi_trace_varlen(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ switch (SERVICE_ACTION32(cdb)) {
+ case READ_32:
+ case VERIFY_32:
+ case WRITE_32:
+ case WRITE_SAME_32:
+ return scsi_trace_rw32(p, cdb, len);
+ default:
+ return scsi_trace_misc(p, cdb, len);
+ }
+}
+
+static const char *
+scsi_trace_misc(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ const char *ret = p->buffer + p->len;
+
+ trace_seq_printf(p, "-");
+ trace_seq_putc(p, 0);
+ return ret;
+}
+
+const char *
+scsi_trace_parse_cdb(struct trace_seq *p, unsigned char *cdb, int len)
+{
+ switch (cdb[0]) {
+ case READ_6:
+ case WRITE_6:
+ return scsi_trace_rw6(p, cdb, len);
+ case READ_10:
+ case VERIFY:
+ case WRITE_10:
+ case WRITE_SAME:
+ return scsi_trace_rw10(p, cdb, len);
+ case READ_12:
+ case VERIFY_12:
+ case WRITE_12:
+ return scsi_trace_rw12(p, cdb, len);
+ case READ_16:
+ case VERIFY_16:
+ case WRITE_16:
+ case WRITE_SAME_16:
+ return scsi_trace_rw16(p, cdb, len);
+ case UNMAP:
+ return scsi_trace_unmap(p, cdb, len);
+ case SERVICE_ACTION_IN:
+ return scsi_trace_service_action_in(p, cdb, len);
+ case VARIABLE_LENGTH_CMD:
+ return scsi_trace_varlen(p, cdb, len);
+ default:
+ return scsi_trace_misc(p, cdb, len);
+ }
+}
+
+unsigned long long process_scsi_trace_parse_cdb(struct trace_seq *s,
+ unsigned long long *args)
+{
+ scsi_trace_parse_cdb(s, (unsigned char *) args[1], args[2]);
+ return 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_print_function(pevent,
+ process_scsi_trace_parse_cdb,
+ PEVENT_FUNC_ARG_STRING,
+ "scsi_trace_parse_cdb",
+ PEVENT_FUNC_ARG_PTR,
+ PEVENT_FUNC_ARG_PTR,
+ PEVENT_FUNC_ARG_INT,
+ PEVENT_FUNC_ARG_VOID);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 15/29] tools lib traceevent: Add cfg80211 plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (13 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 14/29] tools lib traceevent: Add scsi plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 16/29] tools lib traceevent: Remove malloc_or_die from event-plugin.c Jiri Olsa
` (13 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding cfg80211 plugin.
This plugin adds handler for __le16_to_cpup function
t properly parse following tracepoint events:
cfg80211:cfg80211_tx_mlme_mgmt
cfg80211:cfg80211_rx_mlme_mgmt
cfg80211:cfg80211_rx_unprot_mlme_mgmt
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'cfg80211:*' -a')
--- script.cfg80211.old
+++ script.cfg80211.new
- ifconfig 2705 [003] 662.896560: cfg80211:cfg80211_tx_mlme_mgmt: [FAILED TO PARSE] name=wlan0 ifindex=3 frame=ARRAY[c0, 00, 00, 00, 00, 3a, 98, a0, 30, 51, 10, 0b, a9, c6, f4, 74, 00, 3a, 98, a0, 30, 51, 00, 00, 03, 00]
+ ifconfig 2705 [003] 662.896560: cfg80211:cfg80211_tx_mlme_mgmt: netdev:wlan0(3), ftype:0xc0
- kworker/u16:0 1697 [002] 664.808210: cfg80211:cfg80211_rx_mlme_mgmt: [FAILED TO PARSE] name=wlan0 ifindex=3 frame=ARRAY[b0, 00, da, 00, 10, 0b, a9, c6, f4, 74, d8, 24, bd, a1, 26, 31, d8, 24, bd, a1, 26, 31, 10, b7, 00, 00, 02, 00, 00, 00]
+ kworker/u16:0 1697 [002] 664.808210: cfg80211:cfg80211_rx_mlme_mgmt: netdev:wlan0(3), ftype:0xb0
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 1 +
tools/lib/traceevent/plugin_cfg80211.c | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+)
create mode 100644 tools/lib/traceevent/plugin_cfg80211.c
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 5c178ea..19afd03 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -221,6 +221,7 @@ PLUGIN_OBJS += plugin_sched_switch.o
PLUGIN_OBJS += plugin_function.o
PLUGIN_OBJS += plugin_xen.o
PLUGIN_OBJS += plugin_scsi.o
+PLUGIN_OBJS += plugin_cfg80211.o
PLUGINS := $(PLUGIN_OBJS:.o=.so)
diff --git a/tools/lib/traceevent/plugin_cfg80211.c b/tools/lib/traceevent/plugin_cfg80211.c
new file mode 100644
index 0000000..dcab8e8
--- /dev/null
+++ b/tools/lib/traceevent/plugin_cfg80211.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <endian.h>
+#include "event-parse.h"
+
+static unsigned long long
+process___le16_to_cpup(struct trace_seq *s,
+ unsigned long long *args)
+{
+ uint16_t *val = (uint16_t *) args[0];
+ return val ? (long long) le16toh(*val) : 0;
+}
+
+int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
+{
+ pevent_register_print_function(pevent,
+ process___le16_to_cpup,
+ PEVENT_FUNC_ARG_INT,
+ "__le16_to_cpup",
+ PEVENT_FUNC_ARG_PTR,
+ PEVENT_FUNC_ARG_VOID);
+ return 0;
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 16/29] tools lib traceevent: Remove malloc_or_die from event-plugin.c
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (14 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 15/29] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 17/29] tools lib traceevent: Use static functions in jbd2 plugin Jiri Olsa
` (12 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Removing malloc_or_die calls from event-plugin.c,
replacing them with standard malloc and error path.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/event-plugin.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c
index d272d87..125f567 100644
--- a/tools/lib/traceevent/event-plugin.c
+++ b/tools/lib/traceevent/event-plugin.c
@@ -47,7 +47,11 @@ load_plugin(struct pevent *pevent, const char *path,
char *plugin;
void *handle;
- plugin = malloc_or_die(strlen(path) + strlen(file) + 2);
+ plugin = malloc(strlen(path) + strlen(file) + 2);
+ if (!plugin) {
+ warning("could not allocate plugin memory\n");
+ return;
+ }
strcpy(plugin, path);
strcat(plugin, "/");
@@ -71,7 +75,12 @@ load_plugin(struct pevent *pevent, const char *path,
goto out_free;
}
- list = malloc_or_die(sizeof(*list));
+ list = malloc(sizeof(*list));
+ if (!list) {
+ warning("could not allocate plugin memory\n");
+ goto out_free;
+ }
+
list->next = *plugin_list;
list->handle = handle;
list->name = plugin;
@@ -163,7 +172,11 @@ load_plugins(struct pevent *pevent, const char *suffix,
if (!home)
return;
- path = malloc_or_die(strlen(home) + strlen(LOCAL_PLUGIN_DIR) + 2);
+ path = malloc(strlen(home) + strlen(LOCAL_PLUGIN_DIR) + 2);
+ if (!path) {
+ warning("could not allocate plugin memory\n");
+ return;
+ }
strcpy(path, home);
strcat(path, "/");
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 17/29] tools lib traceevent: Use static functions in jbd2 plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (15 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 16/29] tools lib traceevent: Remove malloc_or_die from event-plugin.c Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 18/29] tools lib traceevent: Use pevent_print_func_field in hrtimer_start handler Jiri Olsa
` (11 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
There's no need for following functions to be global:
process_jbd2_dev_to_name
process_jiffies_to_msecs
Making them static.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_jbd2.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/tools/lib/traceevent/plugin_jbd2.c b/tools/lib/traceevent/plugin_jbd2.c
index 5d85de7..2f93f81 100644
--- a/tools/lib/traceevent/plugin_jbd2.c
+++ b/tools/lib/traceevent/plugin_jbd2.c
@@ -29,8 +29,9 @@
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
-unsigned long long process_jbd2_dev_to_name(struct trace_seq *s,
- unsigned long long *args)
+static unsigned long long
+process_jbd2_dev_to_name(struct trace_seq *s,
+ unsigned long long *args)
{
unsigned int dev = args[0];
@@ -38,8 +39,9 @@ unsigned long long process_jbd2_dev_to_name(struct trace_seq *s,
return 0;
}
-unsigned long long process_jiffies_to_msecs(struct trace_seq *s,
- unsigned long long *args)
+static unsigned long long
+process_jiffies_to_msecs(struct trace_seq *s,
+ unsigned long long *args)
{
unsigned long long jiffies = args[0];
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 18/29] tools lib traceevent: Use pevent_print_func_field in hrtimer_start handler
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (16 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 17/29] tools lib traceevent: Use static functions in jbd2 plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 19/29] tools lib traceevent: Several cleanups for function plugin Jiri Olsa
` (10 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
The pevent_print_func_field function encompasses all the
functionality used in the hrtimer_start handler. Changing
the handler to use this function.
This also unifies the function field output with the
hrtimer_expire_entry handler.
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_hrtimer.c | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/tools/lib/traceevent/plugin_hrtimer.c b/tools/lib/traceevent/plugin_hrtimer.c
index e41d4cf..0b0ebf3 100644
--- a/tools/lib/traceevent/plugin_hrtimer.c
+++ b/tools/lib/traceevent/plugin_hrtimer.c
@@ -48,10 +48,6 @@ static int timer_start_handler(struct trace_seq *s,
struct pevent_record *record,
struct event_format *event, void *context)
{
- struct pevent *pevent = event->pevent;
- struct format_field *fn = pevent_find_field(event, "function");
- void *data = record->data;
-
trace_seq_printf(s, "hrtimer=");
if (pevent_print_num_field(s, "0x%llx", event, "timer",
@@ -59,19 +55,8 @@ static int timer_start_handler(struct trace_seq *s,
pevent_print_num_field(s, "0x%llx", event, "hrtimer",
record, 1);
- if (!fn) {
- trace_seq_printf(s, " function=MISSING");
- } else {
- unsigned long long function;
- const char *func;
-
- if (pevent_read_number_field(fn, data, &function))
- trace_seq_printf(s, " function=INVALID");
-
- func = pevent_find_function(pevent, function);
-
- trace_seq_printf(s, " function=%s", func);
- }
+ pevent_print_func_field(s, " function=%s", event, "function",
+ record, 0);
trace_seq_printf(s, " expires=");
pevent_print_num_field(s, "%llu", event, "expires", record, 1);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 19/29] tools lib traceevent: Several cleanups for function plugin
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (17 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 18/29] tools lib traceevent: Use pevent_print_func_field in hrtimer_start handler Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c Jiri Olsa
` (9 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Several cleanups suggested by Namhyung:
* removing index field from struct func_stack as
it's not needed
* renaming get_index into add_and_get_index
* using '%*X' format string capability instead of
the loop
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_function.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
index 8deb22e..87acf9c 100644
--- a/tools/lib/traceevent/plugin_function.c
+++ b/tools/lib/traceevent/plugin_function.c
@@ -25,7 +25,6 @@
#include "event-utils.h"
static struct func_stack {
- int index;
int size;
char **stack;
} *fstack;
@@ -57,7 +56,7 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
stack->stack[pos] = strdup(child);
}
-static int get_index(const char *parent, const char *child, int cpu)
+static int add_and_get_index(const char *parent, const char *child, int cpu)
{
int i;
@@ -97,7 +96,7 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record,
unsigned long long pfunction;
const char *func;
const char *parent;
- int i, index;
+ int index;
if (pevent_get_field_val(s, event, "ip", record, &function, 1))
return trace_seq_putc(s, '!');
@@ -109,10 +108,9 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record,
parent = pevent_find_function(pevent, pfunction);
- index = get_index(parent, func, record->cpu);
+ index = add_and_get_index(parent, func, record->cpu);
- for (i = 0; i < index; i++)
- trace_seq_printf(s, " ");
+ trace_seq_printf(s, "%*s", index*3, "");
if (func)
trace_seq_printf(s, "%s", func);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (18 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 19/29] tools lib traceevent: Several cleanups for function plugin Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-29 6:41 ` Namhyung Kim
2013-11-28 11:33 ` [PATCH 21/29] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
` (8 subsequent siblings)
28 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Removing malloc_or_die calls from plugin_function.c,
replacing them with standard malloc and error path.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_function.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
index 87acf9c..328d17d 100644
--- a/tools/lib/traceevent/plugin_function.c
+++ b/tools/lib/traceevent/plugin_function.c
@@ -44,10 +44,16 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
free(stack->stack[pos]);
else {
if (!stack->stack)
- stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
+ stack->stack = malloc(sizeof(char *) * STK_BLK);
else
stack->stack = realloc(stack->stack, sizeof(char *) *
(stack->size + STK_BLK));
+
+ if (!stack->stack) {
+ warning("could not allocate plugin memory\n");
+ return;
+ }
+
for (i = stack->size; i < stack->size + STK_BLK; i++)
stack->stack[i] = NULL;
stack->size += STK_BLK;
@@ -67,7 +73,12 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
if (fstack)
fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
else
- fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
+ fstack = malloc(sizeof(*fstack) * (cpu + 1));
+
+ if (!fstack) {
+ warning("could not allocate plugin memory\n");
+ return 0;
+ }
/* Account for holes in the cpu count */
for (i = cpus + 1; i <= cpu; i++)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 21/29] tools lib traceevent: Update kvm plugin with is_writable_pte helper
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (19 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 22/29] tools lib traceevent: Change pevent_parse_format to include pevent handle Jiri Olsa
` (7 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding is_writable_pte print helper function, so the
kvmmmu:fast_page_fault print format gets resolved properly.
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e 'kvm:*,kvmmmu:*' -a')
--- script.kvm.old
+++ script.kvm.new
- qemu-system-x86 3290 [002] 10708.755312: kvmmmu:fast_page_fault: [FAILED TO PARSE] vcpu_id=0 gva=4094486080 error_code=3 sptep=0xffff88019f1e3670 old_spte=336391285 new_spte=336391287 retry=1
+ qemu-system-x86 3290 [002] 10708.755312: kvmmmu:fast_page_fault: vcpu 0 gva f40ce640 error_code P|W sptep 0xffff88019f1e3670 old 0x140cec75 new 140cec77 spurious 0 fixed 1
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_kvm.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tools/lib/traceevent/plugin_kvm.c b/tools/lib/traceevent/plugin_kvm.c
index be9d9c6..a0e282c 100644
--- a/tools/lib/traceevent/plugin_kvm.c
+++ b/tools/lib/traceevent/plugin_kvm.c
@@ -389,6 +389,16 @@ static int kvm_mmu_get_page_handler(struct trace_seq *s,
return kvm_mmu_print_role(s, record, event, context);
}
+#define PT_WRITABLE_SHIFT 1
+#define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
+
+static unsigned long long
+process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
+{
+ unsigned long pte = args[0];
+ return pte & PT_WRITABLE_MASK;
+}
+
int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
{
init_disassembler();
@@ -415,5 +425,12 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
NULL);
+
+ pevent_register_print_function(pevent,
+ process_is_writable_pte,
+ PEVENT_FUNC_ARG_INT,
+ "is_writable_pte",
+ PEVENT_FUNC_ARG_LONG,
+ PEVENT_FUNC_ARG_VOID);
return 0;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 22/29] tools lib traceevent: Change pevent_parse_format to include pevent handle
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (20 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 21/29] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 23/29] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
` (6 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Changing the pevent_parse_format interface to include the
pevent handle.
The goal is to always use pevent object when dealing with
traceevent library. The reason is that we might need additional
processing (like plugins), which is not possible otherwise.
Patches follow to make this happen completely.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/event-parse.c | 56 ++++++++++++++++++++++++--------------
tools/lib/traceevent/event-parse.h | 4 ++-
tools/perf/util/evsel.c | 2 +-
3 files changed, 39 insertions(+), 23 deletions(-)
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 74007ab..22566c2 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -5129,8 +5129,38 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
return ret;
}
+static enum pevent_errno
+__pevent_parse_event(struct pevent *pevent,
+ struct event_format **eventp,
+ const char *buf, unsigned long size,
+ const char *sys)
+{
+ int ret = __pevent_parse_format(eventp, pevent, buf, size, sys);
+ struct event_format *event = *eventp;
+
+ if (event == NULL)
+ return ret;
+
+ if (pevent && add_event(pevent, event)) {
+ ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
+ goto event_add_failed;
+ }
+
+#define PRINT_ARGS 0
+ if (PRINT_ARGS && event->print_fmt.args)
+ print_args(event->print_fmt.args);
+
+ return 0;
+
+event_add_failed:
+ pevent_free_format(event);
+ return ret;
+}
+
/**
* pevent_parse_format - parse the event format
+ * @pevent: the handle to the pevent
+ * @eventp: returned format
* @buf: the buffer storing the event format string
* @size: the size of @buf
* @sys: the system the event belongs to
@@ -5142,10 +5172,12 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
*
* /sys/kernel/debug/tracing/events/.../.../format
*/
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
+enum pevent_errno pevent_parse_format(struct pevent *pevent,
+ struct event_format **eventp,
+ const char *buf,
unsigned long size, const char *sys)
{
- return __pevent_parse_format(eventp, NULL, buf, size, sys);
+ return __pevent_parse_event(pevent, eventp, buf, size, sys);
}
/**
@@ -5166,25 +5198,7 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
unsigned long size, const char *sys)
{
struct event_format *event = NULL;
- int ret = __pevent_parse_format(&event, pevent, buf, size, sys);
-
- if (event == NULL)
- return ret;
-
- if (add_event(pevent, event)) {
- ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
- goto event_add_failed;
- }
-
-#define PRINT_ARGS 0
- if (PRINT_ARGS && event->print_fmt.args)
- print_args(event->print_fmt.args);
-
- return 0;
-
-event_add_failed:
- pevent_free_format(event);
- return ret;
+ return __pevent_parse_event(pevent, &event, buf, size, sys);
}
#undef _PE
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index 54273c0..620c27a 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -562,7 +562,9 @@ int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long siz
enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
unsigned long size, const char *sys);
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
+enum pevent_errno pevent_parse_format(struct pevent *pevent,
+ struct event_format **eventp,
+ const char *buf,
unsigned long size, const char *sys);
void pevent_free_format(struct event_format *event);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index b5fe7f9..6a046ed 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -210,7 +210,7 @@ struct event_format *event_format__new(const char *sys, const char *name)
size += n;
} while (n > 0);
- pevent_parse_format(&format, bf, size, sys);
+ pevent_parse_format(NULL, &format, bf, size, sys);
out_free_bf:
free(bf);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 23/29] tools lib traceevent: Harmonize the install messages in lib-traceevent
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (21 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 22/29] tools lib traceevent: Change pevent_parse_format to include pevent handle Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 24/29] perf tools: Add build and install plugins targets Jiri Olsa
` (5 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Removing the 'to ...' part out of the install message,
because it does not fit to the rest of the build
messages we use.
Before:
INSTALL plugin_hrtimer.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_jbd2.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_kmem.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_kvm.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_mac80211.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_sched_switch.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_function.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_xen.so to /home/jolsa/libexec/perf-core/traceevent/plugins
INSTALL plugin_scsi.so to /home/jolsa/libexec/perf-core/traceevent/plugins
Now:
INSTALL plugin_jbd2.so
INSTALL plugin_hrtimer.so
INSTALL plugin_kmem.so
INSTALL plugin_kvm.so
INSTALL plugin_mac80211.so
INSTALL plugin_sched_switch.so
INSTALL plugin_function.so
INSTALL plugin_xen.so
INSTALL plugin_scsi.so
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 19afd03..0d9cbb4 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -166,7 +166,7 @@ else
print_plugin_obj_compile = echo ' CC FPIC '$(OBJ);
print_plugin_build = echo ' BUILD PLUGIN '$(OBJ);
print_static_lib_build = echo ' BUILD STATIC LIB '$(OBJ);
- print_install = echo ' INSTALL '$1' to $(DESTDIR_SQ)$2';
+ print_install = echo ' INSTALL '$1;
endif
do_fpic_compile = \
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 24/29] perf tools: Add build and install plugins targets
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (22 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 23/29] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 25/29] perf tools: Add udis86 disassembler feature check Jiri Olsa
` (4 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding 'plugins' target along with the libtraceevent.a,
so plugins are built together with traceevent library.
Adding 'install-traceevent-plugins' Makefile install target,
instructing perf to install plugins into:
$(HOME)/.traceevent/plugins
- if installed localy under $HOME
$(DESTDIR)/$(prefix)/$(libdir)/traceevent/plugins
- if installed globally
Examples:
$ make install
...
$ find ~/.traceevent/plugins/
/home/jolsa/.traceevent/plugins/
/home/jolsa/.traceevent/plugins/plugin_mac80211.so
/home/jolsa/.traceevent/plugins/plugin_kvm.so
/home/jolsa/.traceevent/plugins/plugin_scsi.so
/home/jolsa/.traceevent/plugins/plugin_sched_switch.so
/home/jolsa/.traceevent/plugins/plugin_xen.so
/home/jolsa/.traceevent/plugins/plugin_cfg80211.so
/home/jolsa/.traceevent/plugins/plugin_function.so
/home/jolsa/.traceevent/plugins/plugin_kmem.so
/home/jolsa/.traceevent/plugins/plugin_hrtimer.so
/home/jolsa/.traceevent/plugins/plugin_jbd2.so
$ sudo make install DESTDIR=/opt/perf/
...
$ find /opt/perf/lib64/traceevent/plugins/
/opt/perf/lib64/traceevent/plugins/
/opt/perf/lib64/traceevent/plugins/plugin_kvm.so
/opt/perf/lib64/traceevent/plugins/plugin_scsi.so
/opt/perf/lib64/traceevent/plugins/plugin_mac80211.so
/opt/perf/lib64/traceevent/plugins/plugin_hrtimer.so
/opt/perf/lib64/traceevent/plugins/plugin_kmem.so
/opt/perf/lib64/traceevent/plugins/plugin_jbd2.so
/opt/perf/lib64/traceevent/plugins/plugin_sched_switch.so
/opt/perf/lib64/traceevent/plugins/plugin_function.so
/opt/perf/lib64/traceevent/plugins/plugin_cfg80211.so
/opt/perf/lib64/traceevent/plugins/plugin_xen.so
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/Makefile.perf | 17 ++++++++++++-----
tools/perf/config/Makefile | 8 ++++++++
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index e416ccc..abc7ac3 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -105,7 +105,7 @@ ifeq ($(config),1)
include config/Makefile
endif
-export prefix bindir sharedir sysconfdir
+export prefix bindir sharedir sysconfdir DESTDIR
# sparse is architecture-neutral, which means that we need to tell it
# explicitly what architecture to check for. Fix this up for yours..
@@ -710,13 +710,20 @@ $(LIB_FILE): $(LIB_OBJS)
# libtraceevent.a
TE_SOURCES = $(wildcard $(TRACE_EVENT_DIR)*.[ch])
-$(LIBTRACEEVENT): $(TE_SOURCES)
- $(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS)" libtraceevent.a
+LIBTRACEEVENT_FLAGS = $(QUIET_SUBDIR1) O=$(OUTPUT)
+LIBTRACEEVENT_FLAGS += CFLAGS="-g -Wall $(EXTRA_CFLAGS)"
+LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
+
+$(LIBTRACEEVENT): $(TE_SOURCES) $(OUTPUT)PERF-CFLAGS
+ $(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) libtraceevent.a plugins
$(LIBTRACEEVENT)-clean:
$(call QUIET_CLEAN, libtraceevent)
@$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null
+install-traceevent-plugins:
+ $(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) install_plugins
+
LIBLK_SOURCES = $(wildcard $(LK_PATH)*.[ch])
# if subdir is set, we've been called from above so target has been built
@@ -785,7 +792,7 @@ cscope:
### Detect prefix changes
TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):\
- $(bindir_SQ):$(perfexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
+ $(bindir_SQ):$(perfexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):$(plugindir_SQ)
$(OUTPUT)PERF-CFLAGS: .FORCE-PERF-CFLAGS
@FLAGS='$(TRACK_CFLAGS)'; \
@@ -849,7 +856,7 @@ endif
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'
-install: install-bin try-install-man
+install: install-bin try-install-man install-traceevent-plugins
install-python_ext:
$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 38f388c2..b7756f0 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -597,3 +597,11 @@ else
perfexec_instdir = $(prefix)/$(perfexecdir)
endif
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
+
+# If we install to $(HOME) we keep the traceevent default:
+# $(HOME)/.traceevent/plugins
+# Otherwise we install plugins into the global $(libdir).
+ifdef DESTDIR
+plugindir=$(libdir)/traceevent/plugins
+plugindir_SQ= $(subst ','\'',$(prefix)/$(plugindir))
+endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 25/29] perf tools: Add udis86 disassembler feature check
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (23 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 24/29] perf tools: Add build and install plugins targets Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 26/29] perf tools: Add filename__read_str util function Jiri Olsa
` (3 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding udis86 disassembler feature check which support
is needed for kvm:kvm_emulate_insn tracepoint.
The diff of 'perf script' output generated by old and new code:
(data was generated by 'perf record -e kvm:kvm_emulate_insn -a')
--- script.kvm.old
+++ script.kvm.new
- qemu-system-x86 15519 [003] 5332.470049: kvm:kvm_emulate_insn: 0:ffffffff8103c596:89 b7 00 80 5f ff (prot64)
+ qemu-system-x86 15519 [003] 5332.470049: kvm:kvm_emulate_insn: 0:ffffffff8103c596: mov %esi, -0xa08000(%rdi)
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/Makefile.perf | 2 +-
tools/perf/config/Makefile | 8 ++++++++
tools/perf/config/feature-checks/Makefile | 6 +++++-
tools/perf/config/feature-checks/test-all.c | 5 +++++
tools/perf/config/feature-checks/test-udis86.c | 11 +++++++++++
5 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 tools/perf/config/feature-checks/test-udis86.c
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index abc7ac3..4c894f4d 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -711,7 +711,7 @@ $(LIB_FILE): $(LIB_OBJS)
TE_SOURCES = $(wildcard $(TRACE_EVENT_DIR)*.[ch])
LIBTRACEEVENT_FLAGS = $(QUIET_SUBDIR1) O=$(OUTPUT)
-LIBTRACEEVENT_FLAGS += CFLAGS="-g -Wall $(EXTRA_CFLAGS)"
+LIBTRACEEVENT_FLAGS += CFLAGS="-g -Wall $(EXTRA_CFLAGS) $(LIBTRACEEVENT_CFLAGS)"
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
$(LIBTRACEEVENT): $(TE_SOURCES) $(OUTPUT)PERF-CFLAGS
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index b7756f0..021c438 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -417,6 +417,14 @@ else
msg := $(warning No timerfd support. Disables 'perf kvm stat live');
endif
+$(call feature_check,udis86)
+ifeq ($(feature-udis86), 1)
+ LIBTRACEEVENT_CFLAGS += -DHAVE_UDIS86
+ EXTLIBS += -ludis86
+else
+ msg := $(warning No udis86 support.);
+endif
+
disable-python = $(eval $(disable-python_code))
define disable-python_code
CFLAGS += -DNO_LIBPYTHON
diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile
index fc78699..ed68814 100644
--- a/tools/perf/config/feature-checks/Makefile
+++ b/tools/perf/config/feature-checks/Makefile
@@ -26,7 +26,8 @@ FILES= \
test-libunwind-debug-frame \
test-on-exit \
test-stackprotector-all \
- test-timerfd
+ test-timerfd \
+ test-udis86
CC := $(CC) -MD
@@ -140,6 +141,9 @@ test-backtrace:
test-timerfd:
$(BUILD)
+test-udis86:
+ $(BUILD) -DHAVE_UDIS86 -ludis86
+
-include *.d
###############################
diff --git a/tools/perf/config/feature-checks/test-all.c b/tools/perf/config/feature-checks/test-all.c
index 9b8a544..df087a5 100644
--- a/tools/perf/config/feature-checks/test-all.c
+++ b/tools/perf/config/feature-checks/test-all.c
@@ -89,6 +89,10 @@
# include "test-stackprotector-all.c"
#undef main
+#define main main_test_udis86
+# include "test-udis86.c"
+#undef main
+
int main(int argc, char *argv[])
{
main_test_libpython();
@@ -111,6 +115,7 @@ int main(int argc, char *argv[])
main_test_libnuma();
main_test_timerfd();
main_test_stackprotector_all();
+ main_test_udis86();
return 0;
}
diff --git a/tools/perf/config/feature-checks/test-udis86.c b/tools/perf/config/feature-checks/test-udis86.c
new file mode 100644
index 0000000..dbc2c26
--- /dev/null
+++ b/tools/perf/config/feature-checks/test-udis86.c
@@ -0,0 +1,11 @@
+
+/*
+ * test for udis86 functions used by plugin_kvm.c
+ */
+
+#include <udis86.h>
+
+int main(void)
+{
+ return puts("hi");
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 26/29] perf tools: Add filename__read_str util function
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (24 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 25/29] perf tools: Add udis86 disassembler feature check Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 27/29] perf tools: Add trace-event object Jiri Olsa
` (2 subsequent siblings)
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Adding filename__read_str util function to read
text file and return it in the char array.
The interface is:
int filename__read_str(const char *filename, char **buf, size_t *sizep)
Returns 0/-1 if the read suceeded/fail respectively.
buf - place to store the data pointer
size - place to store data size
v2 change:
- better error handling suggested by Namhyung Kim.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/util/util.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/util.h | 1 +
2 files changed, 51 insertions(+)
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 28a0a89..861231c 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -6,6 +6,9 @@
#endif
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <linux/kernel.h>
/*
* XXX We need to find a better place for these things...
@@ -413,3 +416,50 @@ int filename__read_int(const char *filename, int *value)
close(fd);
return err;
}
+
+int filename__read_str(const char *filename, char **buf, size_t *sizep)
+{
+ size_t size = 0, alloc_size = 0;
+ void *bf = NULL, *nbf;
+ int fd, n, err = 0;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0)
+ return -errno;
+
+ do {
+ if (size == alloc_size) {
+ alloc_size += BUFSIZ;
+ nbf = realloc(bf, alloc_size);
+ if (!nbf) {
+ err = -ENOMEM;
+ break;
+ }
+
+ bf = nbf;
+ }
+
+ n = read(fd, bf + size, alloc_size - size);
+ if (n < 0) {
+ if (size) {
+ pr_warning("read failed %d: %s\n",
+ errno, strerror(errno));
+ err = 0;
+ } else
+ err = -errno;
+
+ break;
+ }
+
+ size += n;
+ } while (n > 0);
+
+ if (!err) {
+ *sizep = size;
+ *buf = bf;
+ } else
+ free(bf);
+
+ close(fd);
+ return err;
+}
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index c8f362d..e54bb10 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -307,4 +307,5 @@ char *get_srcline(struct dso *dso, unsigned long addr);
void free_srcline(char *srcline);
int filename__read_int(const char *filename, int *value);
+int filename__read_str(const char *filename, char **buf, size_t *sizep);
#endif /* GIT_COMPAT_UTIL_H */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 27/29] perf tools: Add trace-event object
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (25 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 26/29] perf tools: Add filename__read_str util function Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 28/29] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
2013-11-28 11:33 ` [PATCH 29/29] perf tools: Overload pr_stat traceevent print function Jiri Olsa
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
Add trace-event object to keep together 'struct pevent'
object with its loaded plugins with following interface:
int trace_event__init(struct trace_event *t);
- initalizes 'struct pevent' object and loads plugins for it
void trace_event__cleanup(struct trace_event *t);
- cleanups both 'struct pevent' and plugins
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/Makefile.perf | 1 +
tools/perf/builtin-script.c | 2 +-
| 8 ++++----
tools/perf/util/python-ext-sources | 1 +
tools/perf/util/session.h | 3 ++-
tools/perf/util/trace-event-parse.c | 13 -------------
tools/perf/util/trace-event-read.c | 20 +++++++++++---------
tools/perf/util/trace-event.c | 21 +++++++++++++++++++++
tools/perf/util/trace-event.h | 13 ++++++++++---
9 files changed, 51 insertions(+), 31 deletions(-)
create mode 100644 tools/perf/util/trace-event.c
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 4c894f4d..be336f8 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -353,6 +353,7 @@ LIB_OBJS += $(OUTPUT)util/pmu-bison.o
LIB_OBJS += $(OUTPUT)util/trace-event-read.o
LIB_OBJS += $(OUTPUT)util/trace-event-info.o
LIB_OBJS += $(OUTPUT)util/trace-event-scripting.o
+LIB_OBJS += $(OUTPUT)util/trace-event.o
LIB_OBJS += $(OUTPUT)util/svghelper.o
LIB_OBJS += $(OUTPUT)util/sort.o
LIB_OBJS += $(OUTPUT)util/hist.o
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 952dce9..715766d 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1785,7 +1785,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
return -1;
}
- err = scripting_ops->generate_script(session->pevent,
+ err = scripting_ops->generate_script(session->tevent.pevent,
"perf-script");
goto out;
}
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 1cd0357..0af4470 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2834,11 +2834,11 @@ int perf_session__read_header(struct perf_session *session)
symbol_conf.nr_events = nr_attrs;
- perf_header__process_sections(header, fd, &session->pevent,
+ perf_header__process_sections(header, fd, &session->tevent,
perf_file_section__process);
if (perf_evlist__prepare_tracepoint_events(session->evlist,
- session->pevent))
+ session->tevent.pevent))
goto out_delete_evlist;
return 0;
@@ -3003,7 +3003,7 @@ int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused,
lseek(fd, offset + sizeof(struct tracing_data_event),
SEEK_SET);
- size_read = trace_report(fd, &session->pevent,
+ size_read = trace_report(fd, &session->tevent,
session->repipe);
padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
@@ -3025,7 +3025,7 @@ int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused,
}
perf_evlist__prepare_tracepoint_events(session->evlist,
- session->pevent);
+ session->tevent.pevent);
return size_read + padding;
}
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
index 239036f..595bfc7 100644
--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -18,4 +18,5 @@ util/cgroup.c
util/rblist.c
util/strlist.c
util/fs.c
+util/trace-event.c
../../lib/rbtree.c
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 50f6409..83cba9b 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -1,6 +1,7 @@
#ifndef __PERF_SESSION_H
#define __PERF_SESSION_H
+#include "trace-event.h"
#include "hist.h"
#include "event.h"
#include "header.h"
@@ -32,7 +33,7 @@ struct perf_session {
struct perf_header header;
struct machines machines;
struct perf_evlist *evlist;
- struct pevent *pevent;
+ struct trace_event tevent;
struct events_stats stats;
bool repipe;
struct ordered_samples ordered_samples;
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index 6681f71..e0d6d07f 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -28,19 +28,6 @@
#include "util.h"
#include "trace-event.h"
-struct pevent *read_trace_init(int file_bigendian, int host_bigendian)
-{
- struct pevent *pevent = pevent_alloc();
-
- if (pevent != NULL) {
- pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
- pevent_set_file_bigendian(pevent, file_bigendian);
- pevent_set_host_bigendian(pevent, host_bigendian);
- }
-
- return pevent;
-}
-
static int get_common_field(struct scripting_context *context,
int *offset, int *size, const char *type)
{
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index f211227..e113e18 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -343,7 +343,7 @@ static int read_event_files(struct pevent *pevent)
return 0;
}
-ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
+ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
{
char buf[BUFSIZ];
char test[] = { 23, 8, 68 };
@@ -356,11 +356,9 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
int host_bigendian;
int file_long_size;
int file_page_size;
- struct pevent *pevent;
+ struct pevent *pevent = NULL;
int err;
- *ppevent = NULL;
-
repipe = __repipe;
input_fd = fd;
@@ -390,12 +388,17 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
file_bigendian = buf[0];
host_bigendian = bigendian();
- pevent = read_trace_init(file_bigendian, host_bigendian);
- if (pevent == NULL) {
- pr_debug("read_trace_init failed");
+ if (trace_event__init(tevent)) {
+ pr_debug("trace_event__init failed");
goto out;
}
+ pevent = tevent->pevent;
+
+ pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
+ pevent_set_file_bigendian(pevent, file_bigendian);
+ pevent_set_host_bigendian(pevent, host_bigendian);
+
if (do_read(buf, 1) < 0)
goto out;
file_long_size = buf[0];
@@ -432,11 +435,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
pevent_print_printk(pevent);
}
- *ppevent = pevent;
pevent = NULL;
out:
if (pevent)
- pevent_free(pevent);
+ trace_event__cleanup(tevent);
return size;
}
diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
new file mode 100644
index 0000000..a155a77
--- /dev/null
+++ b/tools/perf/util/trace-event.c
@@ -0,0 +1,21 @@
+
+#include <traceevent/event-parse.h>
+#include "trace-event.h"
+
+int trace_event__init(struct trace_event *t)
+{
+ struct pevent *pevent = pevent_alloc();
+
+ if (pevent) {
+ t->plugin_list = traceevent_load_plugins(pevent);
+ t->pevent = pevent;
+ }
+
+ return pevent ? 0 : -1;
+}
+
+void trace_event__cleanup(struct trace_event *t)
+{
+ pevent_free(t->pevent);
+ traceevent_unload_plugins(t->plugin_list);
+}
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 04df631..75dded3 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -3,17 +3,24 @@
#include <traceevent/event-parse.h>
#include "parse-events.h"
-#include "session.h"
struct machine;
struct perf_sample;
union perf_event;
struct perf_tool;
struct thread;
+struct plugin_list;
+
+struct trace_event {
+ struct pevent *pevent;
+ struct plugin_list *plugin_list;
+};
+
+int trace_event__init(struct trace_event *t);
+void trace_event__cleanup(struct trace_event *t);
int bigendian(void);
-struct pevent *read_trace_init(int file_bigendian, int host_bigendian);
void event_format__print(struct event_format *event,
int cpu, void *data, int size);
@@ -27,7 +34,7 @@ raw_field_value(struct event_format *event, const char *name, void *data);
void parse_proc_kallsyms(struct pevent *pevent, char *file, unsigned int size);
void parse_ftrace_printk(struct pevent *pevent, char *file, unsigned int size);
-ssize_t trace_report(int fd, struct pevent **pevent, bool repipe);
+ssize_t trace_report(int fd, struct trace_event *tevent, bool repipe);
struct event_format *trace_find_next_event(struct pevent *pevent,
struct event_format *event);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 28/29] perf tools: Add trace-event global object for tracepoint interface
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (26 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 27/29] perf tools: Add trace-event object Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 29/29] perf tools: Overload pr_stat traceevent print function Jiri Olsa
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
In order to get the proper plugins processing we need to
use full trace-event interface when creating tracepoint
events. So far we were using shortcut to get the parsed
format.
Moving current 'event_format__new' function into trace-event
object as 'trace_event__tp_format'.
This function uses properly initialized global trace-event
object, ensuring proper plugins processing.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/builtin-trace.c | 5 ++--
tools/perf/util/evsel.c | 44 ++-----------------------------
tools/perf/util/trace-event.c | 61 +++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/trace-event.h | 2 ++
4 files changed, 68 insertions(+), 44 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index e9f345e2..47bf590 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -11,6 +11,7 @@
#include "util/intlist.h"
#include "util/thread_map.h"
#include "util/stat.h"
+#include "trace-event.h"
#include <libaudit.h>
#include <stdlib.h>
@@ -1430,11 +1431,11 @@ static int trace__read_syscall_info(struct trace *trace, int id)
sc->fmt = syscall_fmt__find(sc->name);
snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->name);
- sc->tp_format = event_format__new("syscalls", tp_name);
+ sc->tp_format = trace_event__tp_format("syscalls", tp_name);
if (sc->tp_format == NULL && sc->fmt && sc->fmt->alias) {
snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->fmt->alias);
- sc->tp_format = event_format__new("syscalls", tp_name);
+ sc->tp_format = trace_event__tp_format("syscalls", tp_name);
}
if (sc->tp_format == NULL)
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 6a046ed..7b510fd 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -23,6 +23,7 @@
#include "target.h"
#include "perf_regs.h"
#include "debug.h"
+#include "trace-event.h"
static struct {
bool sample_id_all;
@@ -180,47 +181,6 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
return evsel;
}
-struct event_format *event_format__new(const char *sys, const char *name)
-{
- int fd, n;
- char *filename;
- void *bf = NULL, *nbf;
- size_t size = 0, alloc_size = 0;
- struct event_format *format = NULL;
-
- if (asprintf(&filename, "%s/%s/%s/format", tracing_events_path, sys, name) < 0)
- goto out;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0)
- goto out_free_filename;
-
- do {
- if (size == alloc_size) {
- alloc_size += BUFSIZ;
- nbf = realloc(bf, alloc_size);
- if (nbf == NULL)
- goto out_free_bf;
- bf = nbf;
- }
-
- n = read(fd, bf + size, alloc_size - size);
- if (n < 0)
- goto out_free_bf;
- size += n;
- } while (n > 0);
-
- pevent_parse_format(NULL, &format, bf, size, sys);
-
-out_free_bf:
- free(bf);
- close(fd);
-out_free_filename:
- free(filename);
-out:
- return format;
-}
-
struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx)
{
struct perf_evsel *evsel = zalloc(sizeof(*evsel));
@@ -235,7 +195,7 @@ struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int
if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
goto out_free;
- evsel->tp_format = event_format__new(sys, name);
+ evsel->tp_format = trace_event__tp_format(sys, name);
if (evsel->tp_format == NULL)
goto out_free;
diff --git a/tools/perf/util/trace-event.c b/tools/perf/util/trace-event.c
index a155a77..d9f5f61 100644
--- a/tools/perf/util/trace-event.c
+++ b/tools/perf/util/trace-event.c
@@ -1,6 +1,24 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <linux/kernel.h>
#include <traceevent/event-parse.h>
#include "trace-event.h"
+#include "util.h"
+
+/*
+ * global trace_event object used by trace_event__tp_format
+ *
+ * TODO There's no cleanup call for this. Add some sort of
+ * __exit function support and call trace_event__cleanup
+ * there.
+ */
+static struct trace_event tevent;
int trace_event__init(struct trace_event *t)
{
@@ -19,3 +37,46 @@ void trace_event__cleanup(struct trace_event *t)
pevent_free(t->pevent);
traceevent_unload_plugins(t->plugin_list);
}
+
+static struct event_format*
+tp_format(const char *sys, const char *name)
+{
+ struct pevent *pevent = tevent.pevent;
+ struct event_format *event = NULL;
+ char path[PATH_MAX];
+ size_t size;
+ char *data;
+
+ scnprintf(path, PATH_MAX, "%s/%s/%s/format",
+ tracing_events_path, sys, name);
+
+ if (filename__read_str(path, &data, &size))
+ return NULL;
+
+ pevent_parse_format(pevent, &event, data, size, sys);
+
+ free(data);
+ return event;
+}
+
+struct event_format*
+trace_event__tp_format(const char *sys, const char *name)
+{
+ static bool initialized;
+
+ if (!initialized) {
+ int be = traceevent_host_bigendian();
+ struct pevent *pevent;
+
+ if (trace_event__init(&tevent))
+ return NULL;
+
+ pevent = tevent.pevent;
+ pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
+ pevent_set_file_bigendian(pevent, be);
+ pevent_set_host_bigendian(pevent, be);
+ initialized = true;
+ }
+
+ return tp_format(sys, name);
+}
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 75dded3..3a01618 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -18,6 +18,8 @@ struct trace_event {
int trace_event__init(struct trace_event *t);
void trace_event__cleanup(struct trace_event *t);
+struct event_format*
+trace_event__tp_format(const char *sys, const char *name);
int bigendian(void);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* [PATCH 29/29] perf tools: Overload pr_stat traceevent print function
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
` (27 preceding siblings ...)
2013-11-28 11:33 ` [PATCH 28/29] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
@ 2013-11-28 11:33 ` Jiri Olsa
28 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-28 11:33 UTC (permalink / raw)
To: linux-kernel
Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra,
Arnaldo Carvalho de Melo, Steven Rostedt, David Ahern
The traceevent lib uses pr_stat to display all standard
info. It's defined as __weak. Overloading it with perf
version plugged into perf output system logic.
Displaying the pr_stat stuff under '-v' option.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/util/debug.c | 30 +++++++++++++++++++++++++++---
tools/perf/util/debug.h | 2 ++
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index 399e74c..8640a91 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -16,13 +16,11 @@
int verbose;
bool dump_trace = false, quiet = false;
-int eprintf(int level, const char *fmt, ...)
+static int _eprintf(int level, const char *fmt, va_list args)
{
- va_list args;
int ret = 0;
if (verbose >= level) {
- va_start(args, fmt);
if (use_browser >= 1)
ui_helpline__vshow(fmt, args);
else
@@ -33,6 +31,32 @@ int eprintf(int level, const char *fmt, ...)
return ret;
}
+int eprintf(int level, const char *fmt, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
+ ret = _eprintf(level, fmt, args);
+ va_end(args);
+
+ return ret;
+}
+
+/*
+ * Overloading libtraceevent standard info print
+ * function, display with -v in perf.
+ */
+void pr_stat(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ _eprintf(1, fmt, args);
+ va_end(args);
+ eprintf(1, "\n");
+}
+
int dump_printf(const char *fmt, ...)
{
va_list args;
diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h
index efbd988..443694c 100644
--- a/tools/perf/util/debug.h
+++ b/tools/perf/util/debug.h
@@ -17,4 +17,6 @@ void trace_event(union perf_event *event);
int ui__error(const char *format, ...) __attribute__((format(printf, 1, 2)));
int ui__warning(const char *format, ...) __attribute__((format(printf, 1, 2)));
+void pr_stat(const char *fmt, ...);
+
#endif /* __PERF_DEBUG_H */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-28 11:33 ` [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c Jiri Olsa
@ 2013-11-29 6:41 ` Namhyung Kim
2013-11-29 10:37 ` [PATCHv3 " Jiri Olsa
0 siblings, 1 reply; 45+ messages in thread
From: Namhyung Kim @ 2013-11-29 6:41 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo,
Steven Rostedt, David Ahern
Hi Jiri,
On Thu, 28 Nov 2013 12:33:19 +0100, Jiri Olsa wrote:
> Removing malloc_or_die calls from plugin_function.c,
> replacing them with standard malloc and error path.
>
> Suggested-by: Namhyung Kim <namhyung@kernel.org>
> Signed-off-by: Jiri Olsa <jolsa@redhat.com>
> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: David Ahern <dsahern@gmail.com>
> ---
> tools/lib/traceevent/plugin_function.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
> index 87acf9c..328d17d 100644
> --- a/tools/lib/traceevent/plugin_function.c
> +++ b/tools/lib/traceevent/plugin_function.c
> @@ -44,10 +44,16 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
> free(stack->stack[pos]);
> else {
> if (!stack->stack)
> - stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
> + stack->stack = malloc(sizeof(char *) * STK_BLK);
> else
> stack->stack = realloc(stack->stack, sizeof(char *) *
> (stack->size + STK_BLK));
I think single realloc() can handle both cases. And this code has a
problem that it overwrites stack->stack to NULL in case of error so that
we cannot point original region anymore. You'd better to use a temp
variable IMHO.
> +
> + if (!stack->stack) {
> + warning("could not allocate plugin memory\n");
> + return;
> + }
> +
> for (i = stack->size; i < stack->size + STK_BLK; i++)
> stack->stack[i] = NULL;
> stack->size += STK_BLK;
> @@ -67,7 +73,12 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
> if (fstack)
> fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
> else
> - fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
> + fstack = malloc(sizeof(*fstack) * (cpu + 1));
Ditto.
Thanks,
Namhyung
> +
> + if (!fstack) {
> + warning("could not allocate plugin memory\n");
> + return 0;
> + }
>
> /* Account for holes in the cpu count */
> for (i = cpus + 1; i <= cpu; i++)
^ permalink raw reply [flat|nested] 45+ messages in thread
* [PATCHv3 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-29 6:41 ` Namhyung Kim
@ 2013-11-29 10:37 ` Jiri Olsa
2013-11-29 10:54 ` Namhyung Kim
0 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-29 10:37 UTC (permalink / raw)
To: Namhyung Kim
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo,
Steven Rostedt, David Ahern
On Fri, Nov 29, 2013 at 03:41:10PM +0900, Namhyung Kim wrote:
> Hi Jiri,
>
> On Thu, 28 Nov 2013 12:33:19 +0100, Jiri Olsa wrote:
> > Removing malloc_or_die calls from plugin_function.c,
> > replacing them with standard malloc and error path.
> >
> > Suggested-by: Namhyung Kim <namhyung@kernel.org>
> > Signed-off-by: Jiri Olsa <jolsa@redhat.com>
> > Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
> > Cc: Frederic Weisbecker <fweisbec@gmail.com>
> > Cc: Ingo Molnar <mingo@elte.hu>
> > Cc: Namhyung Kim <namhyung@kernel.org>
> > Cc: Paul Mackerras <paulus@samba.org>
> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> > Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: David Ahern <dsahern@gmail.com>
> > ---
> > tools/lib/traceevent/plugin_function.c | 15 +++++++++++++--
> > 1 file changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
> > index 87acf9c..328d17d 100644
> > --- a/tools/lib/traceevent/plugin_function.c
> > +++ b/tools/lib/traceevent/plugin_function.c
> > @@ -44,10 +44,16 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
> > free(stack->stack[pos]);
> > else {
> > if (!stack->stack)
> > - stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
> > + stack->stack = malloc(sizeof(char *) * STK_BLK);
> > else
> > stack->stack = realloc(stack->stack, sizeof(char *) *
> > (stack->size + STK_BLK));
>
> I think single realloc() can handle both cases. And this code has a
> problem that it overwrites stack->stack to NULL in case of error so that
> we cannot point original region anymore. You'd better to use a temp
> variable IMHO.
right you are, please check v3 attached..
thanks,
jirka
---
Removing malloc_or_die calls from plugin_function.c,
replacing them and factoring the code with standard
realloc and error path.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_function.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
index 87acf9c..b43cade 100644
--- a/tools/lib/traceevent/plugin_function.c
+++ b/tools/lib/traceevent/plugin_function.c
@@ -43,11 +43,17 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
if (pos < stack->size)
free(stack->stack[pos]);
else {
- if (!stack->stack)
- stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
- else
- stack->stack = realloc(stack->stack, sizeof(char *) *
- (stack->size + STK_BLK));
+ char **ptr;
+
+ ptr = realloc(stack->stack, sizeof(char *) *
+ (stack->size + STK_BLK));
+ if (!ptr) {
+ warning("could not allocate plugin memory\n");
+ return;
+ }
+
+ stack->stack = ptr;
+
for (i = stack->size; i < stack->size + STK_BLK; i++)
stack->stack[i] = NULL;
stack->size += STK_BLK;
@@ -64,10 +70,11 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
return 0;
if (cpu > cpus) {
- if (fstack)
- fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
- else
- fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
+ fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
+ if (!fstack) {
+ warning("could not allocate plugin memory\n");
+ return 0;
+ }
/* Account for holes in the cpu count */
for (i = cpus + 1; i <= cpu; i++)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: [PATCHv3 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-29 10:37 ` [PATCHv3 " Jiri Olsa
@ 2013-11-29 10:54 ` Namhyung Kim
2013-11-29 12:42 ` Jiri Olsa
0 siblings, 1 reply; 45+ messages in thread
From: Namhyung Kim @ 2013-11-29 10:54 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo,
Steven Rostedt, David Ahern
> Removing malloc_or_die calls from plugin_function.c,
> replacing them and factoring the code with standard
> realloc and error path.
[SNIP]
>
> if (cpu > cpus) {
> - if (fstack)
> - fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
> - else
> - fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
> + fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
This code also has same problem..
Thanks,
Namhyung
> + if (!fstack) {
> + warning("could not allocate plugin memory\n");
> + return 0;
> + }
>
> /* Account for holes in the cpu count */
> for (i = cpus + 1; i <= cpu; i++)
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 45+ messages in thread
* [PATCHv3 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-29 10:54 ` Namhyung Kim
@ 2013-11-29 12:42 ` Jiri Olsa
2013-12-02 8:29 ` Namhyung Kim
0 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-29 12:42 UTC (permalink / raw)
To: Namhyung Kim
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo,
Steven Rostedt, David Ahern
On Fri, Nov 29, 2013 at 10:54:21AM +0000, Namhyung Kim wrote:
> > Removing malloc_or_die calls from plugin_function.c,
> > replacing them and factoring the code with standard
> > realloc and error path.
>
> [SNIP]
> >
> > if (cpu > cpus) {
> > - if (fstack)
> > - fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
> > - else
> > - fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
> > + fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
>
> This code also has same problem..
>
and v3.1 ;-) thanks
jirka
---
Removing malloc_or_die calls from plugin_function.c,
replacing them and factoring the code with standard
realloc and error path.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/lib/traceevent/plugin_function.c | 29 ++++++++++++++++++++---------
1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c
index 87acf9c..aad92ad 100644
--- a/tools/lib/traceevent/plugin_function.c
+++ b/tools/lib/traceevent/plugin_function.c
@@ -43,11 +43,17 @@ static void add_child(struct func_stack *stack, const char *child, int pos)
if (pos < stack->size)
free(stack->stack[pos]);
else {
- if (!stack->stack)
- stack->stack = malloc_or_die(sizeof(char *) * STK_BLK);
- else
- stack->stack = realloc(stack->stack, sizeof(char *) *
- (stack->size + STK_BLK));
+ char **ptr;
+
+ ptr = realloc(stack->stack, sizeof(char *) *
+ (stack->size + STK_BLK));
+ if (!ptr) {
+ warning("could not allocate plugin memory\n");
+ return;
+ }
+
+ stack->stack = ptr;
+
for (i = stack->size; i < stack->size + STK_BLK; i++)
stack->stack[i] = NULL;
stack->size += STK_BLK;
@@ -64,10 +70,15 @@ static int add_and_get_index(const char *parent, const char *child, int cpu)
return 0;
if (cpu > cpus) {
- if (fstack)
- fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
- else
- fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
+ struct func_stack *ptr;
+
+ ptr = realloc(fstack, sizeof(*fstack) * (cpu + 1));
+ if (!ptr) {
+ warning("could not allocate plugin memory\n");
+ return 0;
+ }
+
+ fstack = ptr;
/* Account for holes in the cpu count */
for (i = cpus + 1; i <= cpu; i++)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: [PATCH 01/29] perf tools: Remove stackprotector feature check
2013-11-28 11:33 ` [PATCH 01/29] perf tools: Remove stackprotector feature check Jiri Olsa
@ 2013-11-29 18:34 ` Arnaldo Carvalho de Melo
2013-11-30 16:46 ` [PATCHv3 " Jiri Olsa
0 siblings, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-11-29 18:34 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
Em Thu, Nov 28, 2013 at 12:33:00PM +0100, Jiri Olsa escreveu:
> We use -fstack-protector-all option to enable stack protecting
> for all available functions. There's no reason for enabling
> -Wstack-protector to get warning for unprotected functions.
>
> Removing stackprotector feature check which was used to
> enable the -Wstack-protector option.
Doesn't applies to my perf/core branch.
- Arnaldo
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-28 11:33 ` [PATCH 06/29] tools lib traceevent: Add jbd2 plugin Jiri Olsa
@ 2013-11-29 18:42 ` Arnaldo Carvalho de Melo
2013-11-29 19:31 ` Arnaldo Carvalho de Melo
2013-11-30 16:46 ` Jiri Olsa
0 siblings, 2 replies; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-11-29 18:42 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
Em Thu, Nov 28, 2013 at 12:33:05PM +0100, Jiri Olsa escreveu:
> Backporting jbd2 plugin.
>
> Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
> git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
>
> This plugin adds field resolving functions for following
> tracepoint events:
> jbd2:jbd2_checkpoint_stats
> jbd2:jbd2_run_stats
>
> The diff of 'perf script' output generated by old and new code:
> (data was generated by 'perf record -e 'jbd2:jbd2_run_stats,jbd2:jbd2_checkpoint_stats' -a')
The lines after one that starts with
---
are ignored by 'git am', please ident them with at least one space,
I'm doing that this time.
> --- script.jbd2.old
> +++ script.jbd2.new
> - jbd2/dm-3-8 576 [000] 2983.748423: jbd2:jbd2_checkpoint_stats: [FAILED TO PARSE] dev=265289731 tid=0x3f2bbb chp_time=0x0 forced_to_close=0 written=0 dropped=2
> + jbd2/dm-3-8 576 [000] 2983.748423: jbd2:jbd2_checkpoint_stats: dev 253,3 tid 4139963 chp_time 0 forced_to_close 0 written 0 dropped 2
> - jbd2/dm-3-8 576 [000] 2983.852789: jbd2:jbd2_run_stats: [FAILED TO PARSE] dev=265289731 tid=0x3f2bc0 wait=0x0 request_delay=0x0 running=0x138d locked=0x0 flushing=0x0 logging=0x68 handle_count=2995 blocks=17 blocks_logged=18
> + jbd2/dm-3-8 576 [000] 2983.852789: jbd2:jbd2_run_stats: dev 253,3 tid 4139968 wait 0 request_delay 0 running 5005 locked 0 flushing 0 logging 104 handle_count 2995 blocks 17 blocks_logged 18
>
> This plugin also adds jbd2_dev_to_name function, which
> was removed from jdb2 tracepoints recently. Keeping it
> in for backward compatibility reasons.
>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> Signed-off-by: Jiri Olsa <jolsa@redhat.com>
> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: David Ahern <dsahern@gmail.com>
> ---
> tools/lib/traceevent/Makefile | 2 ++
> tools/lib/traceevent/plugin_jbd2.c | 66 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 68 insertions(+)
> create mode 100644 tools/lib/traceevent/plugin_jbd2.c
>
> diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
> index 1526798..474485a 100644
> --- a/tools/lib/traceevent/Makefile
> +++ b/tools/lib/traceevent/Makefile
> @@ -212,6 +212,8 @@ PEVENT_LIB_OBJS += parse-filter.o
> PEVENT_LIB_OBJS += parse-utils.o
> PEVENT_LIB_OBJS += kbuffer-parse.o
>
> +PLUGIN_OBJS = plugin_jbd2.o
> +
> PLUGINS := $(PLUGIN_OBJS:.o=.so)
>
> ALL_OBJS = $(PEVENT_LIB_OBJS) $(PLUGIN_OBJS)
> diff --git a/tools/lib/traceevent/plugin_jbd2.c b/tools/lib/traceevent/plugin_jbd2.c
> new file mode 100644
> index 0000000..5d85de7
> --- /dev/null
> +++ b/tools/lib/traceevent/plugin_jbd2.c
> @@ -0,0 +1,66 @@
> +/*
> + * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
> + *
> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation;
> + * version 2.1 of the License (not later!)
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this program; if not, see <http://www.gnu.org/licenses>
> + *
> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
> +#include "event-parse.h"
> +
> +#define MINORBITS 20
> +#define MINORMASK ((1U << MINORBITS) - 1)
> +
> +#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
> +#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
> +
> +unsigned long long process_jbd2_dev_to_name(struct trace_seq *s,
> + unsigned long long *args)
> +{
> + unsigned int dev = args[0];
> +
> + trace_seq_printf(s, "%d:%d", MAJOR(dev), MINOR(dev));
> + return 0;
> +}
> +
> +unsigned long long process_jiffies_to_msecs(struct trace_seq *s,
> + unsigned long long *args)
> +{
> + unsigned long long jiffies = args[0];
> +
> + trace_seq_printf(s, "%lld", jiffies);
> + return jiffies;
> +}
> +
> +int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
> +{
> + pevent_register_print_function(pevent,
> + process_jbd2_dev_to_name,
> + PEVENT_FUNC_ARG_STRING,
> + "jbd2_dev_to_name",
> + PEVENT_FUNC_ARG_INT,
> + PEVENT_FUNC_ARG_VOID);
> +
> + pevent_register_print_function(pevent,
> + process_jiffies_to_msecs,
> + PEVENT_FUNC_ARG_LONG,
> + "jiffies_to_msecs",
> + PEVENT_FUNC_ARG_LONG,
> + PEVENT_FUNC_ARG_VOID);
> + return 0;
> +}
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-29 18:42 ` Arnaldo Carvalho de Melo
@ 2013-11-29 19:31 ` Arnaldo Carvalho de Melo
2013-11-30 16:49 ` Jiri Olsa
2013-11-30 16:46 ` Jiri Olsa
1 sibling, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-11-29 19:31 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
Em Fri, Nov 29, 2013 at 03:42:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Thu, Nov 28, 2013 at 12:33:05PM +0100, Jiri Olsa escreveu:
> > This plugin adds field resolving functions for following tracepoint events:
> > jbd2:jbd2_checkpoint_stats
> > jbd2:jbd2_run_stats
> > The diff of 'perf script' output generated by old and new code:
> > (data was generated by 'perf record -e 'jbd2:jbd2_run_stats,jbd2:jbd2_checkpoint_stats' -a')
> The lines after one that starts with
> ---
> are ignored by 'git am', please ident them with at least one space,
> I'm doing that this time.
>
> > --- script.jbd2.old
> > +++ script.jbd2.new
Also I just tried:
[acme@ssdandy linux]$ git log --oneline | head -7
b0496b02fcea tools lib traceevent: Add hrtimer plugin
1ec7a71e0b2c tools lib traceevent: Add jbd2 plugin
c63100c95c6e tools lib traceevent: Add traceevent_host_bigendian function
d54b335656b7 tools lib traceevent: Add plugin build support
e796a0d73bcc tools lib traceevent: Add plugin support
28c803842250 perf tools: Include test-stackprotector-all.c in test-all
1a69f6ce513d perf timechart: Move wake_events list to 'struct timechart'
[acme@ssdandy linux]$
[acme@ssdandy linux]$ time make O=/tmp/build/perf -C tools/perf/ install
<SNIP successful build>
[acme@ssdandy linux]$ ls -la ~/.traceevent
ls: cannot access /home/acme/.traceevent: No such file or directory
[acme@ssdandy linux]$
Where did the plugins go? At least two should be there by now, no?
- Arnaldo
^ permalink raw reply [flat|nested] 45+ messages in thread
* [PATCHv3 01/29] perf tools: Remove stackprotector feature check
2013-11-29 18:34 ` Arnaldo Carvalho de Melo
@ 2013-11-30 16:46 ` Jiri Olsa
2013-12-01 12:21 ` Ingo Molnar
0 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-30 16:46 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
On Fri, Nov 29, 2013 at 03:34:39PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Thu, Nov 28, 2013 at 12:33:00PM +0100, Jiri Olsa escreveu:
> > We use -fstack-protector-all option to enable stack protecting
> > for all available functions. There's no reason for enabling
> > -Wstack-protector to get warning for unprotected functions.
> >
> > Removing stackprotector feature check which was used to
> > enable the -Wstack-protector option.
>
> Doesn't applies to my perf/core branch.
yep, that's that libunwind stuff messing up ;-)
attaching v3, I could resend whole rebased patchset if
needed.. I also updated my perf/core_plugins branch
thanks,
jirka
---
We use -fstack-protector-all option to enable stack protecting
for all available functions. There's no reason for enabling
-Wstack-protector to get warning for unprotected functions.
Removing stackprotector feature check which was used to
enable the -Wstack-protector option.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/config/Makefile | 5 -----
tools/perf/config/feature-checks/Makefile | 6 +-----
tools/perf/config/feature-checks/test-stackprotector.c | 6 ------
3 files changed, 1 insertion(+), 16 deletions(-)
delete mode 100644 tools/perf/config/feature-checks/test-stackprotector.c
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 80ea6d8..38f388c2 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -161,7 +161,6 @@ CORE_FEATURE_TESTS = \
libslang \
libunwind \
on-exit \
- stackprotector \
stackprotector-all \
timerfd
@@ -229,10 +228,6 @@ ifeq ($(feature-stackprotector-all), 1)
CFLAGS += -fstack-protector-all
endif
-ifeq ($(feature-stackprotector), 1)
- CFLAGS += -Wstack-protector
-endif
-
ifeq ($(DEBUG),0)
ifeq ($(feature-fortify-source), 1)
CFLAGS += -D_FORTIFY_SOURCE=2
diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile
index 8dffb62..fc78699 100644
--- a/tools/perf/config/feature-checks/Makefile
+++ b/tools/perf/config/feature-checks/Makefile
@@ -26,7 +26,6 @@ FILES= \
test-libunwind-debug-frame \
test-on-exit \
test-stackprotector-all \
- test-stackprotector \
test-timerfd
CC := $(CC) -MD
@@ -38,7 +37,7 @@ BUILD = $(CC) $(CFLAGS) $(LDFLAGS) -o $(OUTPUT)$@ $@.c
###############################
test-all:
- $(BUILD) -Werror -fstack-protector -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
+ $(BUILD) -Werror -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl
test-hello:
$(BUILD)
@@ -46,9 +45,6 @@ test-hello:
test-stackprotector-all:
$(BUILD) -Werror -fstack-protector-all
-test-stackprotector:
- $(BUILD) -Werror -fstack-protector -Wstack-protector
-
test-fortify-source:
$(BUILD) -O2 -Werror -D_FORTIFY_SOURCE=2
diff --git a/tools/perf/config/feature-checks/test-stackprotector.c b/tools/perf/config/feature-checks/test-stackprotector.c
deleted file mode 100644
index c9f398d..0000000
--- a/tools/perf/config/feature-checks/test-stackprotector.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <stdio.h>
-
-int main(void)
-{
- return puts("hi");
-}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-29 18:42 ` Arnaldo Carvalho de Melo
2013-11-29 19:31 ` Arnaldo Carvalho de Melo
@ 2013-11-30 16:46 ` Jiri Olsa
1 sibling, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-11-30 16:46 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
On Fri, Nov 29, 2013 at 03:42:35PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Thu, Nov 28, 2013 at 12:33:05PM +0100, Jiri Olsa escreveu:
> > Backporting jbd2 plugin.
> >
> > Backported from Steven Rostedt's trace-cmd repo (HEAD 0f2c2fb):
> > git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
> >
> > This plugin adds field resolving functions for following
> > tracepoint events:
> > jbd2:jbd2_checkpoint_stats
> > jbd2:jbd2_run_stats
> >
> > The diff of 'perf script' output generated by old and new code:
> > (data was generated by 'perf record -e 'jbd2:jbd2_run_stats,jbd2:jbd2_checkpoint_stats' -a')
>
>
> The lines after one that starts with
>
> ---
>
> are ignored by 'git am', please ident them with at least one space,
> I'm doing that this time.
oops, ok
thanks,
jirka
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-29 19:31 ` Arnaldo Carvalho de Melo
@ 2013-11-30 16:49 ` Jiri Olsa
2013-12-02 19:26 ` Arnaldo Carvalho de Melo
0 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2013-11-30 16:49 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
On Fri, Nov 29, 2013 at 04:31:13PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Fri, Nov 29, 2013 at 03:42:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Thu, Nov 28, 2013 at 12:33:05PM +0100, Jiri Olsa escreveu:
> > > This plugin adds field resolving functions for following tracepoint events:
> > > jbd2:jbd2_checkpoint_stats
> > > jbd2:jbd2_run_stats
>
> > > The diff of 'perf script' output generated by old and new code:
> > > (data was generated by 'perf record -e 'jbd2:jbd2_run_stats,jbd2:jbd2_checkpoint_stats' -a')
>
> > The lines after one that starts with
>
> > ---
>
> > are ignored by 'git am', please ident them with at least one space,
> > I'm doing that this time.
> >
> > > --- script.jbd2.old
> > > +++ script.jbd2.new
>
> Also I just tried:
>
> [acme@ssdandy linux]$ git log --oneline | head -7
> b0496b02fcea tools lib traceevent: Add hrtimer plugin
> 1ec7a71e0b2c tools lib traceevent: Add jbd2 plugin
> c63100c95c6e tools lib traceevent: Add traceevent_host_bigendian function
> d54b335656b7 tools lib traceevent: Add plugin build support
> e796a0d73bcc tools lib traceevent: Add plugin support
> 28c803842250 perf tools: Include test-stackprotector-all.c in test-all
> 1a69f6ce513d perf timechart: Move wake_events list to 'struct timechart'
> [acme@ssdandy linux]$
>
> [acme@ssdandy linux]$ time make O=/tmp/build/perf -C tools/perf/ install
> <SNIP successful build>
>
> [acme@ssdandy linux]$ ls -la ~/.traceevent
> ls: cannot access /home/acme/.traceevent: No such file or directory
> [acme@ssdandy linux]$
>
> Where did the plugins go? At least two should be there by now, no?
At this stage (patches applied) you'd need to run the
make for traceevent directory.
The perf installation link is done within this patch:
perf tools: Add build and install plugins targets
which I presume you haven't applied yet?
jirka
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCHv3 01/29] perf tools: Remove stackprotector feature check
2013-11-30 16:46 ` [PATCHv3 " Jiri Olsa
@ 2013-12-01 12:21 ` Ingo Molnar
0 siblings, 0 replies; 45+ messages in thread
From: Ingo Molnar @ 2013-12-01 12:21 UTC (permalink / raw)
To: Jiri Olsa
Cc: Arnaldo Carvalho de Melo, linux-kernel, Corey Ashford,
Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras,
Peter Zijlstra, Steven Rostedt, David Ahern
* Jiri Olsa <jolsa@redhat.com> wrote:
> On Fri, Nov 29, 2013 at 03:34:39PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Thu, Nov 28, 2013 at 12:33:00PM +0100, Jiri Olsa escreveu:
> > > We use -fstack-protector-all option to enable stack protecting
> > > for all available functions. There's no reason for enabling
> > > -Wstack-protector to get warning for unprotected functions.
> > >
> > > Removing stackprotector feature check which was used to
> > > enable the -Wstack-protector option.
> >
> > Doesn't applies to my perf/core branch.
>
> yep, that's that libunwind stuff messing up ;-)
>
> attaching v3, I could resend whole rebased patchset if
> needed.. I also updated my perf/core_plugins branch
>
> thanks,
> jirka
>
>
> ---
> We use -fstack-protector-all option to enable stack protecting
> for all available functions. There's no reason for enabling
> -Wstack-protector to get warning for unprotected functions.
>
> Removing stackprotector feature check which was used to
> enable the -Wstack-protector option.
>
> Signed-off-by: Jiri Olsa <jolsa@redhat.com>
> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: David Ahern <dsahern@gmail.com>
> ---
> tools/perf/config/Makefile | 5 -----
> tools/perf/config/feature-checks/Makefile | 6 +-----
> tools/perf/config/feature-checks/test-stackprotector.c | 6 ------
> 3 files changed, 1 insertion(+), 16 deletions(-)
> delete mode 100644 tools/perf/config/feature-checks/test-stackprotector.c
Acked-by: Ingo Molnar <mingo@kernel.org>
This should also speed up the feature tests by about 10-20 msecs in
the test-all case.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCHv3 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c
2013-11-29 12:42 ` Jiri Olsa
@ 2013-12-02 8:29 ` Namhyung Kim
0 siblings, 0 replies; 45+ messages in thread
From: Namhyung Kim @ 2013-12-02 8:29 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo,
Steven Rostedt, David Ahern
On Fri, 29 Nov 2013 13:42:49 +0100, Jiri Olsa wrote:
> On Fri, Nov 29, 2013 at 10:54:21AM +0000, Namhyung Kim wrote:
>> > Removing malloc_or_die calls from plugin_function.c,
>> > replacing them and factoring the code with standard
>> > realloc and error path.
>>
>> [SNIP]
>> >
>> > if (cpu > cpus) {
>> > - if (fstack)
>> > - fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
>> > - else
>> > - fstack = malloc_or_die(sizeof(*fstack) * (cpu + 1));
>> > + fstack = realloc(fstack, sizeof(*fstack) * (cpu + 1));
>>
>> This code also has same problem..
>>
>
> and v3.1 ;-) thanks
Thank you for your effort.
Now the whole series looks all good to me (with other changes fixed).
Thanks,
Namhyung
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-11-30 16:49 ` Jiri Olsa
@ 2013-12-02 19:26 ` Arnaldo Carvalho de Melo
2013-12-02 19:31 ` Jiri Olsa
0 siblings, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-12-02 19:26 UTC (permalink / raw)
To: Jiri Olsa
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
Em Sat, Nov 30, 2013 at 05:49:21PM +0100, Jiri Olsa escreveu:
> On Fri, Nov 29, 2013 at 04:31:13PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Fri, Nov 29, 2013 at 03:42:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Also I just tried:
> > [acme@ssdandy linux]$ git log --oneline | head -7
> > b0496b02fcea tools lib traceevent: Add hrtimer plugin
> > 1ec7a71e0b2c tools lib traceevent: Add jbd2 plugin
> > c63100c95c6e tools lib traceevent: Add traceevent_host_bigendian function
> > d54b335656b7 tools lib traceevent: Add plugin build support
> > e796a0d73bcc tools lib traceevent: Add plugin support
> > 28c803842250 perf tools: Include test-stackprotector-all.c in test-all
> > 1a69f6ce513d perf timechart: Move wake_events list to 'struct timechart'
> > [acme@ssdandy linux]$
> > [acme@ssdandy linux]$ time make O=/tmp/build/perf -C tools/perf/ install
> > <SNIP successful build>
> > [acme@ssdandy linux]$ ls -la ~/.traceevent
> > ls: cannot access /home/acme/.traceevent: No such file or directory
> > [acme@ssdandy linux]$
> > Where did the plugins go? At least two should be there by now, no?
> At this stage (patches applied) you'd need to run the make for
> traceevent directory.
> The perf installation link is done within this patch:
> perf tools: Add build and install plugins targets
> which I presume you haven't applied yet?
No I haven't, and I expected that I could test it straight away, so I
suggest you reorder the patches so that, right after the first plugin is
introduced a:
make -C tools/perf install
in all its variants (in place, with O=, etc) allows one to test it.
- Arnaldo
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: [PATCH 06/29] tools lib traceevent: Add jbd2 plugin
2013-12-02 19:26 ` Arnaldo Carvalho de Melo
@ 2013-12-02 19:31 ` Jiri Olsa
0 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2013-12-02 19:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
Namhyung Kim, Paul Mackerras, Peter Zijlstra, Steven Rostedt,
David Ahern
On Mon, Dec 02, 2013 at 04:26:51PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Sat, Nov 30, 2013 at 05:49:21PM +0100, Jiri Olsa escreveu:
> > On Fri, Nov 29, 2013 at 04:31:13PM -0300, Arnaldo Carvalho de Melo wrote:
> > > Em Fri, Nov 29, 2013 at 03:42:35PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Also I just tried:
>
> > > [acme@ssdandy linux]$ git log --oneline | head -7
> > > b0496b02fcea tools lib traceevent: Add hrtimer plugin
> > > 1ec7a71e0b2c tools lib traceevent: Add jbd2 plugin
> > > c63100c95c6e tools lib traceevent: Add traceevent_host_bigendian function
> > > d54b335656b7 tools lib traceevent: Add plugin build support
> > > e796a0d73bcc tools lib traceevent: Add plugin support
> > > 28c803842250 perf tools: Include test-stackprotector-all.c in test-all
> > > 1a69f6ce513d perf timechart: Move wake_events list to 'struct timechart'
> > > [acme@ssdandy linux]$
>
> > > [acme@ssdandy linux]$ time make O=/tmp/build/perf -C tools/perf/ install
> > > <SNIP successful build>
>
> > > [acme@ssdandy linux]$ ls -la ~/.traceevent
> > > ls: cannot access /home/acme/.traceevent: No such file or directory
> > > [acme@ssdandy linux]$
>
> > > Where did the plugins go? At least two should be there by now, no?
>
> > At this stage (patches applied) you'd need to run the make for
> > traceevent directory.
>
> > The perf installation link is done within this patch:
> > perf tools: Add build and install plugins targets
>
> > which I presume you haven't applied yet?
>
> No I haven't, and I expected that I could test it straight away, so I
> suggest you reorder the patches so that, right after the first plugin is
> introduced a:
>
> make -C tools/perf install
>
> in all its variants (in place, with O=, etc) allows one to test it.
ok, I will send v3
jirka
^ permalink raw reply [flat|nested] 45+ messages in thread
* [tip:perf/core] perf tools: Include test-stackprotector-all.c in test-all
2013-11-28 11:33 ` [PATCH 02/29] perf tools: Include test-stackprotector-all.c in test-all Jiri Olsa
@ 2013-12-04 15:41 ` tip-bot for Jiri Olsa
0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2013-12-04 15:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, namhyung,
jolsa, fweisbec, rostedt, dsahern, tglx, cjashfor, mingo
Commit-ID: bc32358b569247ceabba14dab297070a8fb255c4
Gitweb: http://git.kernel.org/tip/bc32358b569247ceabba14dab297070a8fb255c4
Author: Jiri Olsa <jolsa@redhat.com>
AuthorDate: Thu, 28 Nov 2013 12:33:01 +0100
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 2 Dec 2013 16:19:26 -0300
perf tools: Include test-stackprotector-all.c in test-all
We're missing test-stackprotector-all.c in test-all check, adding it.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1385638408-23519-3-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/config/feature-checks/test-all.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/perf/config/feature-checks/test-all.c b/tools/perf/config/feature-checks/test-all.c
index 59e7a70..9b8a544 100644
--- a/tools/perf/config/feature-checks/test-all.c
+++ b/tools/perf/config/feature-checks/test-all.c
@@ -85,6 +85,10 @@
# include "test-timerfd.c"
#undef main
+#define main main_test_stackprotector_all
+# include "test-stackprotector-all.c"
+#undef main
+
int main(int argc, char *argv[])
{
main_test_libpython();
@@ -106,6 +110,7 @@ int main(int argc, char *argv[])
main_test_backtrace();
main_test_libnuma();
main_test_timerfd();
+ main_test_stackprotector_all();
return 0;
}
^ permalink raw reply related [flat|nested] 45+ messages in thread
end of thread, other threads:[~2013-12-04 15:43 UTC | newest]
Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-28 11:32 [PATCHv2 00/27] perf tools: Add traceevent plugins support Jiri Olsa
2013-11-28 11:33 ` [PATCH 01/29] perf tools: Remove stackprotector feature check Jiri Olsa
2013-11-29 18:34 ` Arnaldo Carvalho de Melo
2013-11-30 16:46 ` [PATCHv3 " Jiri Olsa
2013-12-01 12:21 ` Ingo Molnar
2013-11-28 11:33 ` [PATCH 02/29] perf tools: Include test-stackprotector-all.c in test-all Jiri Olsa
2013-12-04 15:41 ` [tip:perf/core] " tip-bot for Jiri Olsa
2013-11-28 11:33 ` [PATCH 03/29] tools lib traceevent: Add plugin support Jiri Olsa
2013-11-28 11:33 ` [PATCH 04/29] tools lib traceevent: Add plugin build support Jiri Olsa
2013-11-28 11:33 ` [PATCH 05/29] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
2013-11-28 11:33 ` [PATCH 06/29] tools lib traceevent: Add jbd2 plugin Jiri Olsa
2013-11-29 18:42 ` Arnaldo Carvalho de Melo
2013-11-29 19:31 ` Arnaldo Carvalho de Melo
2013-11-30 16:49 ` Jiri Olsa
2013-12-02 19:26 ` Arnaldo Carvalho de Melo
2013-12-02 19:31 ` Jiri Olsa
2013-11-30 16:46 ` Jiri Olsa
2013-11-28 11:33 ` [PATCH 07/29] tools lib traceevent: Add hrtimer plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 08/29] tools lib traceevent: Add kmem plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 09/29] tools lib traceevent: Add kvm plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 10/29] tools lib traceevent: Add mac80211 plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 11/29] tools lib traceevent: Add sched_switch plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 12/29] tools lib traceevent: Add function plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 13/29] tools lib traceevent: Add xen plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 14/29] tools lib traceevent: Add scsi plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 15/29] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 16/29] tools lib traceevent: Remove malloc_or_die from event-plugin.c Jiri Olsa
2013-11-28 11:33 ` [PATCH 17/29] tools lib traceevent: Use static functions in jbd2 plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 18/29] tools lib traceevent: Use pevent_print_func_field in hrtimer_start handler Jiri Olsa
2013-11-28 11:33 ` [PATCH 19/29] tools lib traceevent: Several cleanups for function plugin Jiri Olsa
2013-11-28 11:33 ` [PATCH 20/29] tools lib traceevent: Remove malloc_or_die from plugin_function.c Jiri Olsa
2013-11-29 6:41 ` Namhyung Kim
2013-11-29 10:37 ` [PATCHv3 " Jiri Olsa
2013-11-29 10:54 ` Namhyung Kim
2013-11-29 12:42 ` Jiri Olsa
2013-12-02 8:29 ` Namhyung Kim
2013-11-28 11:33 ` [PATCH 21/29] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
2013-11-28 11:33 ` [PATCH 22/29] tools lib traceevent: Change pevent_parse_format to include pevent handle Jiri Olsa
2013-11-28 11:33 ` [PATCH 23/29] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
2013-11-28 11:33 ` [PATCH 24/29] perf tools: Add build and install plugins targets Jiri Olsa
2013-11-28 11:33 ` [PATCH 25/29] perf tools: Add udis86 disassembler feature check Jiri Olsa
2013-11-28 11:33 ` [PATCH 26/29] perf tools: Add filename__read_str util function Jiri Olsa
2013-11-28 11:33 ` [PATCH 27/29] perf tools: Add trace-event object Jiri Olsa
2013-11-28 11:33 ` [PATCH 28/29] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
2013-11-28 11:33 ` [PATCH 29/29] perf tools: Overload pr_stat traceevent print function Jiri Olsa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).