linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/22] perf tools: Add traceevent plugins support
@ 2013-11-21 11:00 Jiri Olsa
  2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
                   ` (21 more replies)
  0 siblings, 22 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:00 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

Changes from RFC:
  - added comment about repo/HEAD of the backport source
  - ommited 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

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>


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


---
Jiri Olsa (22):
      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: Update kvm plugin with is_writable_pte helper
      tools lib traceevent: Change pevent_parse_event to return event format
      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                  |  61 ++++++++++--
 tools/lib/traceevent/event-parse.c             |  32 +++----
 tools/lib/traceevent/event-parse.h             |  21 +++-
 tools/lib/traceevent/event-plugin.c            | 202 +++++++++++++++++++++++++++++++++++++++
 tools/lib/traceevent/plugin_cfg80211.c         |  23 +++++
 tools/lib/traceevent/plugin_function.c         | 151 +++++++++++++++++++++++++++++
 tools/lib/traceevent/plugin_hrtimer.c          |  93 ++++++++++++++++++
 tools/lib/traceevent/plugin_jbd2.c             |  66 +++++++++++++
 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                       |  16 +++-
 tools/perf/builtin-script.c                    |   2 +-
 tools/perf/builtin-trace.c                     |   5 +-
 tools/perf/config/Makefile                     |  10 ++
 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 +++
 tools/perf/util/debug.c                        |  16 ++++
 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            |  17 +---
 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                         |  41 ++++++++
 tools/perf/util/util.h                         |   1 +
 33 files changed, 2144 insertions(+), 114 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
 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] 77+ messages in thread

* [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
@ 2013-11-21 11:00 ` Jiri Olsa
  2013-11-21 11:58   ` Steven Rostedt
  2013-11-22 14:17   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 02/22] tools lib traceevent: Add plugin build support Jiri Olsa
                   ` (20 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:00 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 enahnce 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 vairable. 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: 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/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] 77+ messages in thread

* [PATCH 02/22] tools lib traceevent: Add plugin build support
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
  2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 11:01 ` [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
                   ` (19 subsequent siblings)
  21 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/lib/traceevent/Makefile | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 2ccb5bc..ea88c19 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -43,6 +43,20 @@ man_dir_SQ = '$(subst ','\'',$(man_dir))'
 export man_dir man_dir_SQ INSTALL
 export DESTDIR DESTDIR_SQ
 
+# Set plugin_dir to preffered global plugin location
+# If we install under $HOME directory we go under
+# $(HOME)/.traceevent/plugins
+ifeq ($(plugin_dir),)
+ifeq ($(prefix),$(HOME))
+override plugin_dir = $(HOME)/.traceevent/plugins
+else
+override plugin_dir = $(prefix)/lib/traceevent/plugins
+endif
+endif
+
+PLUGIN_DIR = -DPLUGIN_DIR="$(DESTDIR)/$(plugin_dir)"
+PLUGIN_DIR_SQ = '$(subst ','\'',$(PLUGIN_DIR))'
+
 # copy a bit from Linux kbuild
 
 ifeq ("$(origin V)", "command line")
@@ -96,6 +110,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 +153,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 +202,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 +221,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 +319,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] 77+ messages in thread

* [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
  2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
  2013-11-21 11:01 ` [PATCH 02/22] tools lib traceevent: Add plugin build support Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 14:22   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 04/22] tools lib traceevent: Add jbd2 plugin Jiri Olsa
                   ` (18 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/event-parse.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index a288860..0ad7f6b 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -527,6 +527,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 *ptr;
+
+	ptr = (unsigned int *)str;
+	return *ptr == 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] 77+ messages in thread

* [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (2 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:09   ` Steven Rostedt
  2013-11-22 14:27   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 05/22] tools lib traceevent: Add hrtimer plugin Jiri Olsa
                   ` (17 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 ea88c19..7aabc24 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -202,6 +202,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] 77+ messages in thread

* [PATCH 05/22] tools lib traceevent: Add hrtimer plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (3 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 04/22] tools lib traceevent: Add jbd2 plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:10   ` Steven Rostedt
  2013-11-22 14:33   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 06/22] tools lib traceevent: Add kmem plugin Jiri Olsa
                   ` (16 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 7aabc24..df087f3 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -202,7 +202,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] 77+ messages in thread

* [PATCH 06/22] tools lib traceevent: Add kmem plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (4 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 05/22] tools lib traceevent: Add hrtimer plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:14   ` Steven Rostedt
  2013-11-22 14:38   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 07/22] tools lib traceevent: Add kvm plugin Jiri Olsa
                   ` (15 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 df087f3..1ff8bb2 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -204,6 +204,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] 77+ messages in thread

* [PATCH 07/22] tools lib traceevent: Add kvm plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (5 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 06/22] tools lib traceevent: Add kmem plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:15   ` Steven Rostedt
  2013-11-22 14:45   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 08/22] tools lib traceevent: Add mac80211 plugin Jiri Olsa
                   ` (14 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 1ff8bb2..2ed515f 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -205,6 +205,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] 77+ messages in thread

* [PATCH 08/22] tools lib traceevent: Add mac80211 plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (6 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 07/22] tools lib traceevent: Add kvm plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 11:01 ` [PATCH 09/22] tools lib traceevent: Add sched_switch plugin Jiri Olsa
                   ` (13 subsequent siblings)
  21 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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 2ed515f..a26c89e 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -206,6 +206,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] 77+ messages in thread

* [PATCH 09/22] tools lib traceevent: Add sched_switch plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (7 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 08/22] tools lib traceevent: Add mac80211 plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:18   ` Steven Rostedt
       [not found]   ` <1385132034.1747.58.camel@leonhard>
  2013-11-21 11:01 ` [PATCH 10/22] tools lib traceevent: Add function plugin Jiri Olsa
                   ` (12 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 a26c89e..1dc6934 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -207,6 +207,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] 77+ messages in thread

* [PATCH 10/22] tools lib traceevent: Add function plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (8 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 09/22] tools lib traceevent: Add sched_switch plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:20   ` Steven Rostedt
  2013-11-22 15:03   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 11/22] tools lib traceevent: Add xen plugin Jiri Olsa
                   ` (11 subsequent siblings)
  21 siblings, 2 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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: 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/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 1dc6934..5bc4a85 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -208,6 +208,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] 77+ messages in thread

* [PATCH 11/22] tools lib traceevent: Add xen plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (9 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 10/22] tools lib traceevent: Add function plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:06   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 12/22] tools lib traceevent: Add scsi plugin Jiri Olsa
                   ` (10 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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 5bc4a85..f3166a8 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -209,6 +209,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] 77+ messages in thread

* [PATCH 12/22] tools lib traceevent: Add scsi plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (10 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 11/22] tools lib traceevent: Add xen plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:24   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
                   ` (9 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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 fucntions 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 generated 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@redhat.com>
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 f3166a8..88da8af 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -210,6 +210,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] 77+ messages in thread

* [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (11 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 12/22] tools lib traceevent: Add scsi plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:16   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
                   ` (8 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/lib/traceevent/Makefile          |  1 +
 tools/lib/traceevent/plugin_cfg80211.c | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 tools/lib/traceevent/plugin_cfg80211.c

diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 88da8af..bbb2061 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -211,6 +211,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..0bbffb0
--- /dev/null
+++ b/tools/lib/traceevent/plugin_cfg80211.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <endian.h>
+#include "event-parse.h"
+
+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] 77+ messages in thread

* [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (12 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:19   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format Jiri Olsa
                   ` (7 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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..1e37678 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)
+
+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] 77+ messages in thread

* [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (13 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 13:28   ` Steven Rostedt
  2013-11-21 11:01 ` [PATCH 16/22] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
                   ` (6 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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 pevent_parse_event to return 'struct event_format',
for the parsed event if the return pointer is specified.

This way we can remove pevent_parse_format which does the
same stuff just without 'struct pevent' object.

The ultimate 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@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/lib/traceevent/event-parse.c  | 32 +++++++++++---------------------
 tools/lib/traceevent/event-parse.h  |  7 ++++---
 tools/perf/util/evsel.c             |  2 +-
 tools/perf/util/trace-event-parse.c |  4 ++--
 4 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 74007ab..4baa0a9 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -5130,27 +5130,9 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
 }
 
 /**
- * pevent_parse_format - parse the event format
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
-				      unsigned long size, const char *sys)
-{
-	return __pevent_parse_format(eventp, NULL, buf, size, sys);
-}
-
-/**
  * pevent_parse_event - parse the event format
  * @pevent: the handle to the pevent
+ * @format: event format object for passed format
  * @buf: the buffer storing the event format string
  * @size: the size of @buf
  * @sys: the system the event belongs to
@@ -5158,11 +5140,16 @@ enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *
  * This parses the event format and creates an event structure
  * to quickly parse raw data for a given event.
  *
+ * Returns  event format object in @format parameter if
+ * specified.
+ *
  * These files currently come from:
  *
  * /sys/kernel/debug/tracing/events/.../.../format
  */
-enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
+enum pevent_errno pevent_parse_event(struct pevent *pevent,
+				     struct event_format **format,
+				     const char *buf,
 				     unsigned long size, const char *sys)
 {
 	struct event_format *event = NULL;
@@ -5171,7 +5158,7 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
 	if (event == NULL)
 		return ret;
 
-	if (add_event(pevent, event)) {
+	if (pevent && add_event(pevent, event)) {
 		ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
 		goto event_add_failed;
 	}
@@ -5180,6 +5167,9 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
 	if (PRINT_ARGS && event->print_fmt.args)
 		print_args(event->print_fmt.args);
 
+	if (format)
+		*format = event;
+
 	return 0;
 
 event_add_failed:
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index 0ad7f6b..daafb70 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -559,10 +559,11 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
 int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
 			     int long_size);
 
-enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
+enum pevent_errno pevent_parse_event(struct pevent *pevent,
+				     struct event_format **format,
+				     const char *buf,
 				     unsigned long size, const char *sys);
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
-				      unsigned long size, const char *sys);
+
 void pevent_free_format(struct event_format *event);
 
 void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 77e38ff..599d1780 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -208,7 +208,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_event(NULL, &format, bf, size, sys);
 
 out_free_bf:
 	free(bf);
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index 6681f71..c8dae72 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -198,13 +198,13 @@ void parse_ftrace_printk(struct pevent *pevent,
 
 int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size)
 {
-	return pevent_parse_event(pevent, buf, size, "ftrace");
+	return pevent_parse_event(pevent, NULL, buf, size, "ftrace");
 }
 
 int parse_event_file(struct pevent *pevent,
 		     char *buf, unsigned long size, char *sys)
 {
-	return pevent_parse_event(pevent, buf, size, sys);
+	return pevent_parse_event(pevent, NULL, buf, size, sys);
 }
 
 struct event_format *trace_find_next_event(struct pevent *pevent,
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 16/22] tools lib traceevent: Harmonize the install messages in lib-traceevent
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (14 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 11:01 ` [PATCH 17/22] perf tools: Add build and install plugins targets Jiri Olsa
                   ` (5 subsequent siblings)
  21 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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 bbb2061..37da4a9 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -156,7 +156,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] 77+ messages in thread

* [PATCH 17/22] perf tools: Add build and install plugins targets
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (15 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 16/22] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:27   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 18/22] perf tools: Add udis86 disassembler feature check Jiri Olsa
                   ` (4 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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)/libexec/perf-core/traceevent/plugins
    - if installed localy under $HOME
  $(DESTDIR)/$(prefix)/$(perfexecdir)/traceevent/plugins
    - if installed globally

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/Makefile.perf   | 15 ++++++++++-----
 tools/perf/config/Makefile |  2 ++
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index e416ccc..b4f8910 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,18 @@ $(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) CFLAGS="-g -Wall $(EXTRA_CFLAGS)" 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 +790,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 +854,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 f7d11a8..8c8a205 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -578,6 +578,7 @@ else
 lib = lib
 endif
 libdir = $(prefix)/$(lib)
+plugindir=$(perfexecdir)/traceevent/plugins
 
 # Shell quote (do not use $(call) to accommodate ancient setups);
 ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
@@ -598,3 +599,4 @@ else
 perfexec_instdir = $(prefix)/$(perfexecdir)
 endif
 perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
+plugindir_SQ= $(subst ','\'',$(prefix)/$(plugindir))
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 77+ messages in thread

* [PATCH 18/22] perf tools: Add udis86 disassembler feature check
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (16 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 17/22] perf tools: Add build and install plugins targets Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:38   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 19/22] perf tools: Add filename__read_str util function Jiri Olsa
                   ` (3 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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 b4f8910..d465540 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -710,7 +710,7 @@ $(LIB_FILE): $(LIB_OBJS)
 # libtraceevent.a
 TE_SOURCES = $(wildcard $(TRACE_EVENT_DIR)*.[ch])
 
-LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS)" plugin_dir=$(plugindir_SQ)
+LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS) $(LIBTRACEEVENT_CFLAGS)" plugin_dir=$(plugindir_SQ)
 
 $(LIBTRACEEVENT): $(TE_SOURCES) $(OUTPUT)PERF-CFLAGS
 	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) libtraceevent.a plugins
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 8c8a205..3f9c6b4 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -418,6 +418,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 87e7900..b0df0f2 100644
--- a/tools/perf/config/feature-checks/Makefile
+++ b/tools/perf/config/feature-checks/Makefile
@@ -27,7 +27,8 @@ FILES=					\
 	test-on-exit			\
 	test-stackprotector-all		\
 	test-stackprotector		\
-	test-timerfd
+	test-timerfd			\
+	test-udis86
 
 CC := $(CC) -MD
 
@@ -144,6 +145,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 59e7a70..0896ae0 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_udis86
+# include "test-udis86.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_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] 77+ messages in thread

* [PATCH 19/22] perf tools: Add filename__read_str util function
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (17 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 18/22] perf tools: Add udis86 disassembler feature check Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:43   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 20/22] perf tools: Add trace-event object Jiri Olsa
                   ` (2 subsequent siblings)
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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

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/util/util.c | 41 +++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/util.h |  1 +
 2 files changed, 42 insertions(+)

diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 28a0a89..e96cc90 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -413,3 +413,44 @@ 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, BUFSIZ);
+		if (n < 0) {
+			err = 0;
+			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] 77+ messages in thread

* [PATCH 20/22] perf tools: Add trace-event object
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (18 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 19/22] perf tools: Add filename__read_str util function Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-21 11:01 ` [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
  2013-11-21 11:01 ` [PATCH 22/22] perf tools: Overload pr_stat traceevent print function Jiri Olsa
  21 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/perf/Makefile.perf            |  1 +
 tools/perf/builtin-script.c         |  2 +-
 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       | 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 d465540..90790c3 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 b392770..0615e2a 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1587,7 +1587,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;
 	}
diff --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 c8dae72..044f5cf 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] 77+ messages in thread

* [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (19 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 20/22] perf tools: Add trace-event object Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:47   ` Namhyung Kim
  2013-11-21 11:01 ` [PATCH 22/22] perf tools: Overload pr_stat traceevent print function Jiri Olsa
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
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 599d1780..53d3908 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;
@@ -178,47 +179,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_event(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));
@@ -233,7 +193,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..9b0b89d 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_event(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] 77+ messages in thread

* [PATCH 22/22] perf tools: Overload pr_stat traceevent print function
  2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
                   ` (20 preceding siblings ...)
  2013-11-21 11:01 ` [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
@ 2013-11-21 11:01 ` Jiri Olsa
  2013-11-22 15:50   ` Namhyung Kim
  21 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 11:01 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@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/perf/util/debug.c | 16 ++++++++++++++++
 tools/perf/util/debug.h |  2 ++
 2 files changed, 18 insertions(+)

diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index 399e74c..dc93bc3 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -33,6 +33,22 @@ int eprintf(int level, const char *fmt, ...)
 	return ret;
 }
 
+/*
+ * Overloading libtraceevent standard info print
+ * function, display with -v in perf.
+ */
+void pr_stat(const char *fmt, ...)
+{
+	va_list args;
+
+	if (verbose >= 1) {
+		va_start(args, fmt);
+		vfprintf(stderr, fmt, args);
+		fprintf(stderr, "\n");
+		va_end(args);
+	}
+}
+
 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] 77+ messages in thread

* Re: [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
@ 2013-11-21 11:58   ` Steven Rostedt
  2013-11-22 14:17   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 11:58 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:00:59 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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 enahnce 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 vairable. 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: 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>

As I authored the original code, you can add my:

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> 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
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-21 11:01 ` [PATCH 04/22] tools lib traceevent: Add jbd2 plugin Jiri Olsa
@ 2013-11-21 13:09   ` Steven Rostedt
  2013-11-22 14:27   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:09 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:02 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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: 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>

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> Cc: David Ahern <dsahern@gmail.com>
> ---

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/22] tools lib traceevent: Add hrtimer plugin
  2013-11-21 11:01 ` [PATCH 05/22] tools lib traceevent: Add hrtimer plugin Jiri Olsa
@ 2013-11-21 13:10   ` Steven Rostedt
  2013-11-22 14:33   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:10 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:03 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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: 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>

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> Cc: David Ahern <dsahern@gmail.com>

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 06/22] tools lib traceevent: Add kmem plugin
  2013-11-21 11:01 ` [PATCH 06/22] tools lib traceevent: Add kmem plugin Jiri Olsa
@ 2013-11-21 13:14   ` Steven Rostedt
  2013-11-22 14:38   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:14 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:04 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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: 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/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 df087f3..1ff8bb2 100644
> --- a/tools/lib/traceevent/Makefile
> +++ b/tools/lib/traceevent/Makefile
> @@ -204,6 +204,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;

This was one of the older plugins. We can simplify this with:

	if (pevent_get_field_val(s, event, "call_site",
			 record, &val, 0))
		return 1;

Would would replace the above two checks.

But we can fix this later. As I'm sure there's other places that can
use these updates.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve


> +
> +	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;
> +}


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 07/22] tools lib traceevent: Add kvm plugin
  2013-11-21 11:01 ` [PATCH 07/22] tools lib traceevent: Add kvm plugin Jiri Olsa
@ 2013-11-21 13:15   ` Steven Rostedt
  2013-11-22 14:45   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:15 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:05 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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: 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>

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> Cc: David Ahern <dsahern@gmail.com>
> ---

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 09/22] tools lib traceevent: Add sched_switch plugin
  2013-11-21 11:01 ` [PATCH 09/22] tools lib traceevent: Add sched_switch plugin Jiri Olsa
@ 2013-11-21 13:18   ` Steven Rostedt
       [not found]   ` <1385132034.1747.58.camel@leonhard>
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:18 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:07 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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: 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>

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> 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
> 

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 10/22] tools lib traceevent: Add function plugin
  2013-11-21 11:01 ` [PATCH 10/22] tools lib traceevent: Add function plugin Jiri Olsa
@ 2013-11-21 13:20   ` Steven Rostedt
  2013-11-22 15:03   ` Namhyung Kim
  1 sibling, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:20 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:08 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> 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

The number of times I enabled the parent option, I should make it
default too.

Thanks!

>  'indent' to show function call indents
> 
> Enabling both of them by default.
> 
> 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>

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve

> 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
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format
  2013-11-21 11:01 ` [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format Jiri Olsa
@ 2013-11-21 13:28   ` Steven Rostedt
  2013-11-21 13:42     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Steven Rostedt @ 2013-11-21 13:28 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, 21 Nov 2013 12:01:13 +0100
Jiri Olsa <jolsa@redhat.com> wrote:

> Changing pevent_parse_event to return 'struct event_format',
> for the parsed event if the return pointer is specified.

Can we not change the API of pevent_parse_event(), I use it quite a bit.

And yes, I'm working hard to keep what's in trace-cmd and the kernel
identical.

> 
> This way we can remove pevent_parse_format which does the
> same stuff just without 'struct pevent' object.

Actually, I don't use pevent_parse_format() at all. What about changing
that one to include the pevent?


> 
> The ultimate 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.

Right, so add a pevent to the pevent_parse_format() and leave the
pevent_parse_event() alone. That should make everyone happy :-)

Thanks!

-- Steve

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format
  2013-11-21 13:28   ` Steven Rostedt
@ 2013-11-21 13:42     ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-21 13:42 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar,
	Namhyung Kim, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Thu, Nov 21, 2013 at 08:28:41AM -0500, Steven Rostedt wrote:
> On Thu, 21 Nov 2013 12:01:13 +0100
> Jiri Olsa <jolsa@redhat.com> wrote:
> 
> > Changing pevent_parse_event to return 'struct event_format',
> > for the parsed event if the return pointer is specified.
> 
> Can we not change the API of pevent_parse_event(), I use it quite a bit.
> 
> And yes, I'm working hard to keep what's in trace-cmd and the kernel
> identical.
> 
> > 
> > This way we can remove pevent_parse_format which does the
> > same stuff just without 'struct pevent' object.
> 
> Actually, I don't use pevent_parse_format() at all. What about changing
> that one to include the pevent?
> 
> 
> > 
> > The ultimate 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.
> 
> Right, so add a pevent to the pevent_parse_format() and leave the
> pevent_parse_event() alone. That should make everyone happy :-)

ook, np ;-)

thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
  2013-11-21 11:58   ` Steven Rostedt
@ 2013-11-22 14:17   ` Namhyung Kim
  2013-11-23  8:12     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:17 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,

2013-11-21 (목), 12:00 +0100, Jiri Olsa:
> 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 enahnce 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 vairable. 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

First of all, thank you for your nice work! :)

> 
[SNIP[
> +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);

I'd like not to see this malloc_or_die() anymore in a new code.  Just
returning after showing a warning looks enough here.

> +
> +	strcpy(plugin, path);
> +	strcat(plugin, "/");
> +	strcat(plugin, file);
> +
> +	handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);

Why RTLD_NOW and RTLD_GLOBAL?  Hmm.. maybe using _NOW is needed to
prevent a runtime error, but not sure why _GLOBAL is needed.

IIUC _GLOBAL is for exporting symbols to *other libraries*.  Is it
intended for this plugin support?


> +	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;

So this 'alias' is not used anywhere in the current code, right?
Do you plan to add the option processing soon?

> +
> +	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));

Ditto.  Please check return value and handle error properly.


> +	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),

Doesn't gcc complain about the name shadows other function?  Anyway I
think we should avoid using same name - probably using typedef for the
function might be helpful.


> +		 void *data)
[SNIP]
> +	/*
> +	 * 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);

Ditto.

Thanks,
Namhyung

> +
> +	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);
> +	}
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function
  2013-11-21 11:01 ` [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
@ 2013-11-22 14:22   ` Namhyung Kim
  2013-11-23  8:27     ` Steven Rostedt
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:22 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> Adding traceevent_host_bigendian function to get host
> endianity. It's used in following patches.

[SNIP]
> +static inline int traceevent_host_bigendian(void)
> +{
> +	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> +	unsigned int *ptr;
> +
> +	ptr = (unsigned int *)str;
> +	return *ptr == 0x01020304;

Is it safe for every architecture supported - especially ones that
require stricter alignment?  I know many architectures/compilers align
stack but not sure doing this is safe for all architecture.

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-21 11:01 ` [PATCH 04/22] tools lib traceevent: Add jbd2 plugin Jiri Olsa
  2013-11-21 13:09   ` Steven Rostedt
@ 2013-11-22 14:27   ` Namhyung Kim
  2013-11-23  8:52     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:27 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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.

[SNIP]
> +#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)

Isn't it better to make these functions static?


> +{
> +	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,

Actually the function returns long long not string.  But it seems the
current code doesn't care about the return type.


> +				       "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;
> +}

Shouldn't it unregister these functions when unloaded?

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/22] tools lib traceevent: Add hrtimer plugin
  2013-11-21 11:01 ` [PATCH 05/22] tools lib traceevent: Add hrtimer plugin Jiri Olsa
  2013-11-21 13:10   ` Steven Rostedt
@ 2013-11-22 14:33   ` Namhyung Kim
  2013-11-23  8:59     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:33 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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.

[SNIP]
> +	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);

Shouldn't it be like below?

		if (pevent_read_number_field(fn, data, &function))
			trace_seq_printf(s, " function=INVALID");
		else {
			func = pevent_find_function(pevent, function);
			trace_seq_printf(s, " function=%s", func);
		}

Otherwise it'll print "function=XXX" twice if pevent_read_number_field()
failed.

Thanks,
Namhyung


> +	}
> +
> +	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;
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 06/22] tools lib traceevent: Add kmem plugin
  2013-11-21 11:01 ` [PATCH 06/22] tools lib traceevent: Add kmem plugin Jiri Olsa
  2013-11-21 13:14   ` Steven Rostedt
@ 2013-11-22 14:38   ` Namhyung Kim
  2013-11-23  9:06     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:38 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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

It'd be great if the "call_site" in the output changes to display
function names instead of hex addresses directly.

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 07/22] tools lib traceevent: Add kvm plugin
  2013-11-21 11:01 ` [PATCH 07/22] tools lib traceevent: Add kvm plugin Jiri Olsa
  2013-11-21 13:15   ` Steven Rostedt
@ 2013-11-22 14:45   ` Namhyung Kim
  2013-11-23  9:15     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 14:45 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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

[SNIP]
> +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;

Hmm.. it seems this returning from the middle of function can make
output hard to parse.  How about printing 'unknown' if the field not
found?

> +
> +	trace_seq_printf(s, "%s%c",  val ? "unsync" : "sync", 0);

Why did you print %c (0) at the end?

Thanks,
Namhyung


> +	return 0;
> +}



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 10/22] tools lib traceevent: Add function plugin
  2013-11-21 11:01 ` [PATCH 10/22] tools lib traceevent: Add function plugin Jiri Olsa
  2013-11-21 13:20   ` Steven Rostedt
@ 2013-11-22 15:03   ` Namhyung Kim
  2013-11-23  9:22     ` Steven Rostedt
  1 sibling, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:03 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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.

[SNIP]
> +static struct func_stack {
> +	int index;

It seems not used anywhere.


> +	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);

Please do not use this function.


> +		else
> +			stack->stack = realloc(stack->stack, sizeof(char *) *
> +					       (stack->size + STK_BLK));

It seems you need to use a local variable to check return value.


> +		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)

It seems this function does not only to get index but also to add
function stack.  So how about renaming it to something like
add_and_get_index()?

> +{
> +	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));

It seems it has same problem as above function.

> +
> +		/* 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, "   ");

What about this?

	trace_seq_printf(s, "%*s", index*3, "");

Thanks,
Namhyung

> +
> +	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;
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 11/22] tools lib traceevent: Add xen plugin
  2013-11-21 11:01 ` [PATCH 11/22] tools lib traceevent: Add xen plugin Jiri Olsa
@ 2013-11-22 15:06   ` Namhyung Kim
  2013-11-25 13:38     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:06 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, Jeremy Fitzhardinge

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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
> 

[SNIP]
> +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 "";

How about defaults to "unknown" if not found?

Thanks
Namhyung


> +}
> +
> +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;
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin
  2013-11-21 11:01 ` [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
@ 2013-11-22 15:16   ` Namhyung Kim
  2013-11-23  9:27     ` Steven Rostedt
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:16 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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

[SNIP]
> +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,

Just a nitpick.  The function should return int or the return type
should be _LONG for consistency.

Thanks,
Namhyung

> +				       "__le16_to_cpup",
> +				       PEVENT_FUNC_ARG_PTR,
> +				       PEVENT_FUNC_ARG_VOID);
> +	return 0;
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper
  2013-11-21 11:01 ` [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
@ 2013-11-22 15:19   ` Namhyung Kim
  2013-11-23  9:28     ` Steven Rostedt
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:19 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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

[SNIP]
> +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,

Same as the previous reply - return type of the function is
inconsistent.

And please also consider making the function static.

Thanks,
Namhyung


> +				       "is_writable_pte",
> +				       PEVENT_FUNC_ARG_LONG,
> +				       PEVENT_FUNC_ARG_VOID);
>  	return 0;
>  }




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 12/22] tools lib traceevent: Add scsi plugin
  2013-11-21 11:01 ` [PATCH 12/22] tools lib traceevent: Add scsi plugin Jiri Olsa
@ 2013-11-22 15:24   ` Namhyung Kim
  2013-11-23  9:25     ` Steven Rostedt
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:24 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, Martin K. Petersen

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> Adding scsi plugin.
> 
> This plugin adds fields resolving fucntions 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 generated scsi_dispatch_cmd_timeout tracepoint,
>      but it's similar to the rest, so I believe it's ok.

[SNIP]
> +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);

Why is this _putc(0) needed?  It seems you added it to all other
functions too.


> +	return ret;
> +}
> +




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 17/22] perf tools: Add build and install plugins targets
  2013-11-21 11:01 ` [PATCH 17/22] perf tools: Add build and install plugins targets Jiri Olsa
@ 2013-11-22 15:27   ` Namhyung Kim
  2013-11-25 14:51     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:27 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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)/libexec/perf-core/traceevent/plugins
>     - if installed localy under $HOME
>   $(DESTDIR)/$(prefix)/$(perfexecdir)/traceevent/plugins
>     - if installed globally

[SNIP]
> --- a/tools/perf/config/Makefile
> +++ b/tools/perf/config/Makefile
> @@ -578,6 +578,7 @@ else
>  lib = lib
>  endif
>  libdir = $(prefix)/$(lib)
> +plugindir=$(perfexecdir)/traceevent/plugins

Hmm.. it puts traceevent plugins under the perf directory.  But I don't
think it's a good idea since libtraceevent can be used independently.

What about something like this?

  plugindir = $(perfexecdir)/../traceevent/plugins

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 18/22] perf tools: Add udis86 disassembler feature check
  2013-11-21 11:01 ` [PATCH 18/22] perf tools: Add udis86 disassembler feature check Jiri Olsa
@ 2013-11-22 15:38   ` Namhyung Kim
  2013-11-25 15:02     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:38 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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)

[SNIP]
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -710,7 +710,7 @@ $(LIB_FILE): $(LIB_OBJS)
>  # libtraceevent.a
>  TE_SOURCES = $(wildcard $(TRACE_EVENT_DIR)*.[ch])
>  
> -LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS)" plugin_dir=$(plugindir_SQ)
> +LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS) $(LIBTRACEEVENT_CFLAGS)" plugin_dir=$(plugindir_SQ)

What about breaking the line with "+="?

>  
>  $(LIBTRACEEVENT): $(TE_SOURCES) $(OUTPUT)PERF-CFLAGS
>  	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) libtraceevent.a plugins
> diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
> index 8c8a205..3f9c6b4 100644
> --- a/tools/perf/config/Makefile
> +++ b/tools/perf/config/Makefile
> @@ -418,6 +418,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

I think we can just use libbfd for this eventually.  But it can be a
later work. :)

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 19/22] perf tools: Add filename__read_str util function
  2013-11-21 11:01 ` [PATCH 19/22] perf tools: Add filename__read_str util function Jiri Olsa
@ 2013-11-22 15:43   ` Namhyung Kim
  2013-11-25 15:17     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:43 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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

[SNIP]
> +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, BUFSIZ);

Shouldn't it be "read(fd, bf + size, alloc_size - size)"?
Otherwise there might be a problem if read() returned early for some
reason with small size and then retry with a full BUFSIZ..


> +		if (n < 0) {
> +			err = 0;

I think it needs to check the size also since read() might fail at the
first invocation.  What about this?

		if (n < 0) {
			if (size)
				err = 0;
			else
				err = -errno;

Thanks,
Namhyung

> +			break;
> +		}
> +
> +		size += n;
> +	} while (n > 0);
> +
> +	if (!err) {
> +		*sizep = size;
> +		*buf   = bf;
> +	} else
> +		free(bf);
> +
> +	close(fd);
> +	return err;
> +}




^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-21 11:01 ` [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
@ 2013-11-22 15:47   ` Namhyung Kim
  2013-11-25 16:03     ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:47 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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.

I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)

  CC       util/trace-event.o
cc1: warnings being treated as errors
util/trace-event.c: In function 'trace_event__tp_format':
util/trace-event.c:63: error: not protecting function: no buffer at
least 8 bytes long
make[1]: *** [util/trace-event.o] Error 1

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 22/22] perf tools: Overload pr_stat traceevent print function
  2013-11-21 11:01 ` [PATCH 22/22] perf tools: Overload pr_stat traceevent print function Jiri Olsa
@ 2013-11-22 15:50   ` Namhyung Kim
  0 siblings, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-22 15:50 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

2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 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.

[SNIP]
>  
> +/*
> + * Overloading libtraceevent standard info print
> + * function, display with -v in perf.
> + */
> +void pr_stat(const char *fmt, ...)
> +{
> +	va_list args;
> +
> +	if (verbose >= 1) {
> +		va_start(args, fmt);
> +		vfprintf(stderr, fmt, args);
> +		fprintf(stderr, "\n");
> +		va_end(args);
> +	}
> +}

It'd be better if it use or does same as eprintf() like other pr_*
functions does.

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-22 14:17   ` Namhyung Kim
@ 2013-11-23  8:12     ` Steven Rostedt
  2013-11-25  7:33       ` Namhyung Kim
  2013-11-25  9:30       ` Jiri Olsa
  0 siblings, 2 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  8:12 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:17:06 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> > 
> [SNIP[
> > +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);
> 
> I'd like not to see this malloc_or_die() anymore in a new code.  Just
> returning after showing a warning looks enough here.

Yeah I agree. This is a relic from my code. I think it's OK to add
here, as it is pretty much direct port of my code, and then we can just
add a patch against it to remove it.

> 
> > +
> > +	strcpy(plugin, path);
> > +	strcat(plugin, "/");
> > +	strcat(plugin, file);
> > +
> > +	handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
> 
> Why RTLD_NOW and RTLD_GLOBAL?  Hmm.. maybe using _NOW is needed to
> prevent a runtime error, but not sure why _GLOBAL is needed.

Yes, we want to make sure all symbols defined are available at time of
load, otherwise bail out.

> 
> IIUC _GLOBAL is for exporting symbols to *other libraries*.  Is it
> intended for this plugin support?

That was the plan. To have one plugin supply a set of functions that
other plugins may use. That is what GLOBAL is for, right?  I don't
recall if I every did this, but it was something I wanted for future
work.

Now if we don't need it, we could remove it, but is it bad to have?


> 
> 
> > +	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;
> 
> So this 'alias' is not used anywhere in the current code, right?
> Do you plan to add the option processing soon?

I believe he is, and hopefully he will, because I want to forward port
this code to have trace-cmd use it. The end result should be a separate
library that we all can use.

It may be best to add the above alias when we add option support. But
it doesn't hurt to include it now, as long as we plan to add that in
the near future.

> 
> > +
> > +	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));
> 
> Ditto.  Please check return value and handle error properly.

I agree, but lets make that a separate patch, such that we see the
changes between the backport and updates.

> 
> 
> > +	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),
> 
> Doesn't gcc complain about the name shadows other function?  Anyway I
> think we should avoid using same name - probably using typedef for the
> function might be helpful.

I agree here too, but again, lets keep the backport and fixes as
separate patches.

-- Steve

> 
> 
> > +		 void *data)
> [SNIP]
> > +	/*
> > +	 * 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);
> 
> Ditto.
> 
> Thanks,
> Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function
  2013-11-22 14:22   ` Namhyung Kim
@ 2013-11-23  8:27     ` Steven Rostedt
  2013-11-25  7:24       ` Namhyung Kim
  0 siblings, 1 reply; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  8:27 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:22:52 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > Adding traceevent_host_bigendian function to get host
> > endianity. It's used in following patches.
> 
> [SNIP]
> > +static inline int traceevent_host_bigendian(void)
> > +{
> > +	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> > +	unsigned int *ptr;
> > +
> > +	ptr = (unsigned int *)str;
> > +	return *ptr == 0x01020304;
> 
> Is it safe for every architecture supported - especially ones that
> require stricter alignment?  I know many architectures/compilers align
> stack but not sure doing this is safe for all architecture.

Would you prefer this (I tested it on both a big and little endian)

{
	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
	unsigned int val;

	memcpy(&val, str, 4);
	return val == 0x01020304;
}

-- Steve


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-22 14:27   ` Namhyung Kim
@ 2013-11-23  8:52     ` Steven Rostedt
  2013-11-25  7:38       ` Namhyung Kim
  2013-11-25  9:46       ` Jiri Olsa
  0 siblings, 2 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  8:52 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern, Theodore Ts'o

On Fri, 22 Nov 2013 23:27:57 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> [SNIP]
> > +#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)
> 
> Isn't it better to make these functions static?

Yeah, but that was my mistake. Lets keep the fix separate from the
backport though. Thanks!

> 
> 
> > +{
> > +	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,
> 
> Actually the function returns long long not string.  But it seems the
> current code doesn't care about the return type.

Actually it's not representing what process_jbd2_dev_to_name() returns
(which will always return unsigned long long), but what
"jbd2_dev_to_name()" returns that is (was) defined in the kernel. That
was:

	const char *jbd2_dev_to_name(dev_t device)

When registering a function to handle, you need to express the
prototype of that function (not the handler). The third argument is the
ret_type of that function.

But this is interesting, the ret_type doesn't seem to be used in
event_parse.c. The return value of the callback is only done in
eval_num_arg() where we could put a warning if the ret_type is not a
number.

Funny thing is, this patch is irrelevant with todays kernel due to this
commit:

commit 4862fd6047ed02e2726667c54d35f538eecc56aa
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Sun Jul 10 22:05:08 2011 -0400

    jbd2: remove jbd2_dev_to_name() from jbd2 tracepoints
    
    Using function calls in TP_printk causes perf heartburn, so print the
    MAJOR/MINOR device numbers instead.
    
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>



> 
> 
> > +				       "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;
> > +}
> 
> Shouldn't it unregister these functions when unloaded?

Probably ;-)

-- Steve

> 
> Thanks,
> Namhyung
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 05/22] tools lib traceevent: Add hrtimer plugin
  2013-11-22 14:33   ` Namhyung Kim
@ 2013-11-23  8:59     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  8:59 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:33:29 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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.
> 
> [SNIP]
> > +	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);
> 
> Shouldn't it be like below?
> 
> 		if (pevent_read_number_field(fn, data, &function))
> 			trace_seq_printf(s, " function=INVALID");
> 		else {
> 			func = pevent_find_function(pevent, function);
> 			trace_seq_printf(s, " function=%s", func);
> 		}
> 
> Otherwise it'll print "function=XXX" twice if pevent_read_number_field()
> failed.
> 

Nice catch, but lets keep the backport and fixes separate.

Actually, this was one of the first plugins I wrote, and since then, I
added a function tat does this for you. The proper change is to rip
this out and use:

	pevent_print_func_field()

instead. That function does the checks properly.

-- Steve

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 06/22] tools lib traceevent: Add kmem plugin
  2013-11-22 14:38   ` Namhyung Kim
@ 2013-11-23  9:06     ` Steven Rostedt
  2013-11-25  7:43       ` Namhyung Kim
  0 siblings, 1 reply; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:06 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:38:17 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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
> 
> It'd be great if the "call_site" in the output changes to display
> function names instead of hex addresses directly.
> 

Actually, that's what's in the (). 

   kmem:kmalloc_node: (__alloc_skb+0x7e) call_site=ffffffff8153c67e

This uses a short cut, where we don't overwrite the entire handler, in
case the TP_printk() gets new fields.

If the registered handler for an event, like "call_site_handler" (see
how we use it for all of tracepoints) returns >0, that tells the
library that we only added extra information, and to print the
tracepoint as it is normally.

The better solution here is to use "%pS" or something in the actual
tracepoint instead.

-- Steve

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 07/22] tools lib traceevent: Add kvm plugin
  2013-11-22 14:45   ` Namhyung Kim
@ 2013-11-23  9:15     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:15 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:45:24 +0900
Namhyung Kim <namhyung@kernel.org> wrote:


> > +	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;
> 
> Hmm.. it seems this returning from the middle of function can make
> output hard to parse.  How about printing 'unknown' if the field not
> found?

I wasn't fully correct in my last email. If the handler returns
anything but zero, the TP_print() will go in affect. Thus, if this
fails, then the default print will happen anyway.

It shouldn't fail. But yeah, we could think of adding "unknow" and such
too. That can go as a separate patch.

> 
> > +
> > +	trace_seq_printf(s, "%s%c",  val ? "unsync" : "sync", 0);
> 
> Why did you print %c (0) at the end?

I simulated exactly what was (and still is) in the kvm tracepoint:

arch/x86/kvm/mmutrace.h:

        trace_seq_printf(p, "sp gfn %llx %u%s q%u%s %s%s"               \
                         " %snxe root %u %s%c",                         \
                         __entry->gfn, role.level,                      \
                         role.cr4_pae ? " pae" : "",                    \
                         role.quadrant,                                 \
                         role.direct ? " direct" : "",                  \
                         access_str[role.access],                       \
                         role.invalid ? " invalid" : "",                \
                         role.nxe ? "" : "!",                           \
                         __entry->root_count,                           \
                         __entry->unsync ? "unsync" : "sync", 0);	\


-- Steve

> 
> Thanks,
> Namhyung
> 
> 
> > +	return 0;
> > +}
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 09/22] tools lib traceevent: Add sched_switch plugin
       [not found]   ` <1385132034.1747.58.camel@leonhard>
@ 2013-11-23  9:16     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:16 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Fri, 22 Nov 2013 23:53:54 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> 
> > 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]
> 
> 
> [SNIP]
> 
> > +
> > +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, '!');
> 
> 
> Like I said in the previous reply, it'd better to avoid returning from
> the middle of function IMHO.  If it's really critical info, check it at
> the beginning of the function and bail out before print anything.
> 

Well, it shouldn't lose any data, as I said in a previous reply, it
will print (reprint) the data as if the plugin didn't exist.

-- Steve

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 10/22] tools lib traceevent: Add function plugin
  2013-11-22 15:03   ` Namhyung Kim
@ 2013-11-23  9:22     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:22 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, 23 Nov 2013 00:03:51 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

 
> > 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.
> 
> [SNIP]
> > +static struct func_stack {
> > +	int index;
> 
> It seems not used anywhere.

You're right, it's not!  Not sure why I added that. Oh well, again,
lets add that as a clean up and keep the backport separate.

> 
> 
> > +	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);
> 
> Please do not use this function.

Again, added as a separate patch (do I hear a theme ;-)

> 
> 
> > +		else
> > +			stack->stack = realloc(stack->stack, sizeof(char *) *
> > +					       (stack->size + STK_BLK));
> 
> It seems you need to use a local variable to check return value.
> 
> 
> > +		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)
> 
> It seems this function does not only to get index but also to add
> function stack.  So how about renaming it to something like
> add_and_get_index()?
> 
> > +{
> > +	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));
> 
> It seems it has same problem as above function.
> 
> > +
> > +		/* 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, "   ");
> 
> What about this?
> 
> 	trace_seq_printf(s, "%*s", index*3, "");

Nice trick ;-)

I'm fine with all the updates, but lets make that a patch on top.

Thanks,

-- Steve

> 
> Thanks,
> Namhyung
> 
> > +
> > +	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;
> > +}
> 
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 12/22] tools lib traceevent: Add scsi plugin
  2013-11-22 15:24   ` Namhyung Kim
@ 2013-11-23  9:25     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:25 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern, Martin K. Petersen

On Sat, 23 Nov 2013 00:24:50 +0900
Namhyung Kim <namhyung@kernel.org> wrote:


> [SNIP]
> > +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);
> 
> Why is this _putc(0) needed?  It seems you added it to all other
> functions too.

This is because these are copied directly from the kernel, and the
kernel versions use the putc(0) too. But there, it is needed, as its up
to the helper function to terminate the trace_seq.

I need to add trace_seq_terminate() in the kernel (it's in
libtraceevent), so that we can replace the putc(0) with terminate, and
not truncate the seq early.

-- Steve


> 
> 
> > +	return ret;
> > +}
> > +
> 
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin
  2013-11-22 15:16   ` Namhyung Kim
@ 2013-11-23  9:27     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:27 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, 23 Nov 2013 00:16:14 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

 
> [SNIP]
> > +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,
> 
> Just a nitpick.  The function should return int or the return type
> should be _LONG for consistency.

As stated in another reply, the return type is not for the callback, but
instead for the function it is representing.

-- Steve

> 
> Thanks,
> Namhyung
> 
> > +				       "__le16_to_cpup",
> > +				       PEVENT_FUNC_ARG_PTR,
> > +				       PEVENT_FUNC_ARG_VOID);
> > +	return 0;
> > +}
> 
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper
  2013-11-22 15:19   ` Namhyung Kim
@ 2013-11-23  9:28     ` Steven Rostedt
  0 siblings, 0 replies; 77+ messages in thread
From: Steven Rostedt @ 2013-11-23  9:28 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, 23 Nov 2013 00:19:48 +0900
Namhyung Kim <namhyung@kernel.org> wrote:

> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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
> 
> [SNIP]
> > +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,
> 
> Same as the previous reply - return type of the function is
> inconsistent.

Actually it's not.

> 
> And please also consider making the function static.

Agreed.

-- Steve

> 
> Thanks,
> Namhyung
> 
> 
> > +				       "is_writable_pte",
> > +				       PEVENT_FUNC_ARG_LONG,
> > +				       PEVENT_FUNC_ARG_VOID);
> >  	return 0;
> >  }
> 
> 


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function
  2013-11-23  8:27     ` Steven Rostedt
@ 2013-11-25  7:24       ` Namhyung Kim
  2013-11-25  9:33         ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-25  7:24 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

Hi Steve,

On Sat, 23 Nov 2013 03:27:08 -0500, Steven Rostedt wrote:
> On Fri, 22 Nov 2013 23:22:52 +0900
> Namhyung Kim <namhyung@kernel.org> wrote:
>
>> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
>> > Adding traceevent_host_bigendian function to get host
>> > endianity. It's used in following patches.
>> 
>> [SNIP]
>> > +static inline int traceevent_host_bigendian(void)
>> > +{
>> > +	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
>> > +	unsigned int *ptr;
>> > +
>> > +	ptr = (unsigned int *)str;
>> > +	return *ptr == 0x01020304;
>> 
>> Is it safe for every architecture supported - especially ones that
>> require stricter alignment?  I know many architectures/compilers align
>> stack but not sure doing this is safe for all architecture.
>
> Would you prefer this (I tested it on both a big and little endian)
>
> {
> 	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> 	unsigned int val;
>
> 	memcpy(&val, str, 4);
> 	return val == 0x01020304;
> }

Yeah, looks good to me.

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-23  8:12     ` Steven Rostedt
@ 2013-11-25  7:33       ` Namhyung Kim
  2013-11-25  9:30       ` Jiri Olsa
  1 sibling, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-25  7:33 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, 23 Nov 2013 03:12:19 -0500, Steven Rostedt wrote:
> On Fri, 22 Nov 2013 23:17:06 +0900
> Namhyung Kim <namhyung@kernel.org> wrote:
>
>> > 
>> [SNIP[
>> > +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);
>> 
>> I'd like not to see this malloc_or_die() anymore in a new code.  Just
>> returning after showing a warning looks enough here.
>
> Yeah I agree. This is a relic from my code. I think it's OK to add
> here, as it is pretty much direct port of my code, and then we can just
> add a patch against it to remove it.

Okay.  I agree that it'd be better to make them separate patches.

>
>> 
>> > +
>> > +	strcpy(plugin, path);
>> > +	strcat(plugin, "/");
>> > +	strcat(plugin, file);
>> > +
>> > +	handle = dlopen(plugin, RTLD_NOW | RTLD_GLOBAL);
>> 
>> Why RTLD_NOW and RTLD_GLOBAL?  Hmm.. maybe using _NOW is needed to
>> prevent a runtime error, but not sure why _GLOBAL is needed.
>
> Yes, we want to make sure all symbols defined are available at time of
> load, otherwise bail out.
>
>> 
>> IIUC _GLOBAL is for exporting symbols to *other libraries*.  Is it
>> intended for this plugin support?
>
> That was the plan. To have one plugin supply a set of functions that
> other plugins may use. That is what GLOBAL is for, right?  I don't
> recall if I every did this, but it was something I wanted for future
> work.
>
> Now if we don't need it, we could remove it, but is it bad to have?

I might be slow down symbol resolution of new plugins tiny bit.  But I
don't think it's a real problem as its effect will be negligible.

I don't object the code but just want to know your intention. :)

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-23  8:52     ` Steven Rostedt
@ 2013-11-25  7:38       ` Namhyung Kim
  2013-11-25  9:46       ` Jiri Olsa
  1 sibling, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-25  7:38 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern, Theodore Ts'o

On Sat, 23 Nov 2013 03:52:21 -0500, Steven Rostedt wrote:
> On Fri, 22 Nov 2013 23:27:57 +0900
> Namhyung Kim <namhyung@kernel.org> wrote:
>
>> [SNIP]
>> > +#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,
>> 
>> Actually the function returns long long not string.  But it seems the
>> current code doesn't care about the return type.
>
> Actually it's not representing what process_jbd2_dev_to_name() returns
> (which will always return unsigned long long), but what
> "jbd2_dev_to_name()" returns that is (was) defined in the kernel. That
> was:
>
> 	const char *jbd2_dev_to_name(dev_t device)
>
> When registering a function to handle, you need to express the
> prototype of that function (not the handler). The third argument is the
> ret_type of that function.

Aha, got it.  Thank you for the explanation.


> But this is interesting, the ret_type doesn't seem to be used in
> event_parse.c. The return value of the callback is only done in
> eval_num_arg() where we could put a warning if the ret_type is not a
> number.

Yes. :)

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 06/22] tools lib traceevent: Add kmem plugin
  2013-11-23  9:06     ` Steven Rostedt
@ 2013-11-25  7:43       ` Namhyung Kim
  0 siblings, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-25  7:43 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jiri Olsa, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, 23 Nov 2013 04:06:45 -0500, Steven Rostedt wrote:
> On Fri, 22 Nov 2013 23:38:17 +0900
> Namhyung Kim <namhyung@kernel.org> wrote:
>> It'd be great if the "call_site" in the output changes to display
>> function names instead of hex addresses directly.
>> 
>
> Actually, that's what's in the (). 
>
>    kmem:kmalloc_node: (__alloc_skb+0x7e) call_site=ffffffff8153c67e
>
> This uses a short cut, where we don't overwrite the entire handler, in
> case the TP_printk() gets new fields.
>
> If the registered handler for an event, like "call_site_handler" (see
> how we use it for all of tracepoints) returns >0, that tells the
> library that we only added extra information, and to print the
> tracepoint as it is normally.

Yeah, I know.  But just want to say that it'd be better if it's
displayed like below.

  kmem:kmalloc_node: call_site=__alloc_skb+0x7e ...

But it requires to write new handlers for each event..

>
> The better solution here is to use "%pS" or something in the actual
> tracepoint instead.

Agreed.

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 01/22] tools lib traceevent: Add plugin support
  2013-11-23  8:12     ` Steven Rostedt
  2013-11-25  7:33       ` Namhyung Kim
@ 2013-11-25  9:30       ` Jiri Olsa
  1 sibling, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25  9:30 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Namhyung Kim, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Sat, Nov 23, 2013 at 03:12:19AM -0500, Steven Rostedt wrote:

SNIP

> > > +	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;
> > 
> > So this 'alias' is not used anywhere in the current code, right?
> > Do you plan to add the option processing soon?
> 
> I believe he is, and hopefully he will, because I want to forward port
> this code to have trace-cmd use it. The end result should be a separate
> library that we all can use.

yep, thats the plan ;-)

so I get the the deal is in v2 I keep the current code and add
patches addressing comments on top of it..

jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function
  2013-11-25  7:24       ` Namhyung Kim
@ 2013-11-25  9:33         ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25  9:33 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern

On Mon, Nov 25, 2013 at 04:24:52PM +0900, Namhyung Kim wrote:
> Hi Steve,
> 
> On Sat, 23 Nov 2013 03:27:08 -0500, Steven Rostedt wrote:
> > On Fri, 22 Nov 2013 23:22:52 +0900
> > Namhyung Kim <namhyung@kernel.org> wrote:
> >
> >> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> >> > Adding traceevent_host_bigendian function to get host
> >> > endianity. It's used in following patches.
> >> 
> >> [SNIP]
> >> > +static inline int traceevent_host_bigendian(void)
> >> > +{
> >> > +	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> >> > +	unsigned int *ptr;
> >> > +
> >> > +	ptr = (unsigned int *)str;
> >> > +	return *ptr == 0x01020304;
> >> 
> >> Is it safe for every architecture supported - especially ones that
> >> require stricter alignment?  I know many architectures/compilers align
> >> stack but not sure doing this is safe for all architecture.
> >
> > Would you prefer this (I tested it on both a big and little endian)
> >
> > {
> > 	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
> > 	unsigned int val;
> >
> > 	memcpy(&val, str, 4);
> > 	return val == 0x01020304;
> > }
> 
> Yeah, looks good to me.

ok, will change to this one

thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-23  8:52     ` Steven Rostedt
  2013-11-25  7:38       ` Namhyung Kim
@ 2013-11-25  9:46       ` Jiri Olsa
  2013-11-25 10:03         ` Jiri Olsa
  1 sibling, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25  9:46 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Namhyung Kim, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern, Theodore Ts'o

On Sat, Nov 23, 2013 at 03:52:21AM -0500, Steven Rostedt wrote:
> On Fri, 22 Nov 2013 23:27:57 +0900
> Namhyung Kim <namhyung@kernel.org> wrote:
> 
> > [SNIP]
> > > +#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)
> > 
> > Isn't it better to make these functions static?
> 
> Yeah, but that was my mistake. Lets keep the fix separate from the
> backport though. Thanks!

ok

> 
> > 
> > 
> > > +{
> > > +	unsigned int dev = args[0];
> > > +
> > > +	trace_seq_printf(s, "%d:%d", MAJOR(dev), MINOR(dev));

SNIP

> 
>     jbd2: remove jbd2_dev_to_name() from jbd2 tracepoints
>     
>     Using function calls in TP_printk causes perf heartburn, so print the
>     MAJOR/MINOR device numbers instead.
>     
>     Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

yep, it's rather old change (v3.1-rc1) but I thought
we want to keep that for backward compatibility

and it's small piece of code anyway.. ;-)

> 
> 
> 
> > 
> > 
> > > +				       "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;
> > > +}
> > 
> > Shouldn't it unregister these functions when unloaded?
> 
> Probably ;-)

will add,


thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 04/22] tools lib traceevent: Add jbd2 plugin
  2013-11-25  9:46       ` Jiri Olsa
@ 2013-11-25 10:03         ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 10:03 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Namhyung Kim, linux-kernel, Corey Ashford, Frederic Weisbecker,
	Ingo Molnar, Paul Mackerras, Peter Zijlstra,
	Arnaldo Carvalho de Melo, David Ahern, Theodore Ts'o

On Mon, Nov 25, 2013 at 10:46:18AM +0100, Jiri Olsa wrote:
> > > Shouldn't it unregister these functions when unloaded?
> > 
> > Probably ;-)
> 
> will add,

hum... haven't found exported interface to unregister/remove
for print function, seems like this is getting freed in the
end at:

  void pevent_free(struct pevent *pevent)

jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 11/22] tools lib traceevent: Add xen plugin
  2013-11-22 15:06   ` Namhyung Kim
@ 2013-11-25 13:38     ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 13:38 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, Jeremy Fitzhardinge

On Sat, Nov 23, 2013 at 12:06:28AM +0900, Namhyung Kim wrote:
> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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
> > 
> 
> [SNIP]
> > +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 "";
> 
> How about defaults to "unknown" if not found?
> 

That's how the kernel 'xen_hypercall_name' handles it.

I dont mind, but I guess we want to change both sides.
I've already included Jeremy (kernel side author), so
I guess it's up to him ;-)

jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 17/22] perf tools: Add build and install plugins targets
  2013-11-22 15:27   ` Namhyung Kim
@ 2013-11-25 14:51     ` Jiri Olsa
  2013-11-27  8:13       ` Namhyung Kim
  0 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 14:51 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 Sat, Nov 23, 2013 at 12:27:48AM +0900, Namhyung Kim wrote:
> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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)/libexec/perf-core/traceevent/plugins
> >     - if installed localy under $HOME
> >   $(DESTDIR)/$(prefix)/$(perfexecdir)/traceevent/plugins
> >     - if installed globally
> 
> [SNIP]
> > --- a/tools/perf/config/Makefile
> > +++ b/tools/perf/config/Makefile
> > @@ -578,6 +578,7 @@ else
> >  lib = lib
> >  endif
> >  libdir = $(prefix)/$(lib)
> > +plugindir=$(perfexecdir)/traceevent/plugins
> 
> Hmm.. it puts traceevent plugins under the perf directory.  But I don't
> think it's a good idea since libtraceevent can be used independently.
> 
> What about something like this?
> 
>   plugindir = $(perfexecdir)/../traceevent/plugins

this is where trace-cmd stores them:

  $(HOME)/.trace-cmd/plugins
  $(prefix)/$(libdir)/trace-cmd/plugins

but I guess we want global place to install plugins,
the traceevent by default uses:

  $(HOME)/.traceevent/plugins
  $(prefix)/lib/traceevent/plugins

How about that?

thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 18/22] perf tools: Add udis86 disassembler feature check
  2013-11-22 15:38   ` Namhyung Kim
@ 2013-11-25 15:02     ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 15:02 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 Sat, Nov 23, 2013 at 12:38:02AM +0900, Namhyung Kim wrote:
> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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)
> 
> [SNIP]
> > --- a/tools/perf/Makefile.perf
> > +++ b/tools/perf/Makefile.perf
> > @@ -710,7 +710,7 @@ $(LIB_FILE): $(LIB_OBJS)
> >  # libtraceevent.a
> >  TE_SOURCES = $(wildcard $(TRACE_EVENT_DIR)*.[ch])
> >  
> > -LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS)" plugin_dir=$(plugindir_SQ)
> > +LIBTRACEEVENT_FLAGS=$(QUIET_SUBDIR1) O=$(OUTPUT) CFLAGS="-g -Wall $(EXTRA_CFLAGS) $(LIBTRACEEVENT_CFLAGS)" plugin_dir=$(plugindir_SQ)
> 
> What about breaking the line with "+="?

ok

thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 19/22] perf tools: Add filename__read_str util function
  2013-11-22 15:43   ` Namhyung Kim
@ 2013-11-25 15:17     ` Jiri Olsa
  0 siblings, 0 replies; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 15:17 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 Sat, Nov 23, 2013 at 12:43:59AM +0900, Namhyung Kim wrote:
> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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
> 
> [SNIP]
> > +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, BUFSIZ);
> 
> Shouldn't it be "read(fd, bf + size, alloc_size - size)"?
> Otherwise there might be a problem if read() returned early for some
> reason with small size and then retry with a full BUFSIZ..
> 
> 
> > +		if (n < 0) {
> > +			err = 0;
> 
> I think it needs to check the size also since read() might fail at the
> first invocation.  What about this?
> 
> 		if (n < 0) {
> 			if (size)
> 				err = 0;
> 			else
> 				err = -errno;
> 

ok, added.. plus warning in the 'if (size)' leg,
because we're returning data even if we failed.

thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-22 15:47   ` Namhyung Kim
@ 2013-11-25 16:03     ` Jiri Olsa
  2013-11-27 13:46       ` Namhyung Kim
  0 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-25 16:03 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 Sat, Nov 23, 2013 at 12:47:14AM +0900, Namhyung Kim wrote:
> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > 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.
> 
> I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)
> 
>   CC       util/trace-event.o
> cc1: warnings being treated as errors
> util/trace-event.c: In function 'trace_event__tp_format':
> util/trace-event.c:63: error: not protecting function: no buffer at
> least 8 bytes long
> make[1]: *** [util/trace-event.o] Error 1

hum, what was the stackprotector status?

...                stackprotector: [ on  ]
...            stackprotector-all: [ on  ]


thanks,
jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 17/22] perf tools: Add build and install plugins targets
  2013-11-25 14:51     ` Jiri Olsa
@ 2013-11-27  8:13       ` Namhyung Kim
  0 siblings, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-27  8:13 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 Mon, 25 Nov 2013 15:51:44 +0100, Jiri Olsa wrote:
> On Sat, Nov 23, 2013 at 12:27:48AM +0900, Namhyung Kim wrote:
>> 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
>> > 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)/libexec/perf-core/traceevent/plugins
>> >     - if installed localy under $HOME
>> >   $(DESTDIR)/$(prefix)/$(perfexecdir)/traceevent/plugins
>> >     - if installed globally
>> 
>> [SNIP]
>> > --- a/tools/perf/config/Makefile
>> > +++ b/tools/perf/config/Makefile
>> > @@ -578,6 +578,7 @@ else
>> >  lib = lib
>> >  endif
>> >  libdir = $(prefix)/$(lib)
>> > +plugindir=$(perfexecdir)/traceevent/plugins
>> 
>> Hmm.. it puts traceevent plugins under the perf directory.  But I don't
>> think it's a good idea since libtraceevent can be used independently.
>> 
>> What about something like this?
>> 
>>   plugindir = $(perfexecdir)/../traceevent/plugins
>
> this is where trace-cmd stores them:
>
>   $(HOME)/.trace-cmd/plugins
>   $(prefix)/$(libdir)/trace-cmd/plugins
>
> but I guess we want global place to install plugins,
> the traceevent by default uses:
>
>   $(HOME)/.traceevent/plugins
>   $(prefix)/lib/traceevent/plugins
>
> How about that?

Looks good to me.

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-25 16:03     ` Jiri Olsa
@ 2013-11-27 13:46       ` Namhyung Kim
  2013-11-27 15:10         ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Namhyung Kim @ 2013-11-27 13:46 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,

2013-11-25 (월), 17:03 +0100, Jiri Olsa:
> On Sat, Nov 23, 2013 at 12:47:14AM +0900, Namhyung Kim wrote:
> > 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > > 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.
> > 
> > I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)
> > 
> >   CC       util/trace-event.o
> > cc1: warnings being treated as errors
> > util/trace-event.c: In function 'trace_event__tp_format':
> > util/trace-event.c:63: error: not protecting function: no buffer at
> > least 8 bytes long
> > make[1]: *** [util/trace-event.o] Error 1
> 
> hum, what was the stackprotector status?
> 
> ...                stackprotector: [ on  ]
> ...            stackprotector-all: [ on  ]

Right. Both of them were turned on.

Auto-detecting system features:
...                     backtrace: [ on  ]
...                         dwarf: [ on  ]
...                fortify-source: [ on  ]
...                         glibc: [ on  ]
...                          gtk2: [ on  ]
...                  gtk2-infobar: [ on  ]
...                      libaudit: [ on  ]
...                        libbfd: [ on  ]
...                        libelf: [ on  ]
...             libelf-getphdrnum: [ OFF ]
...                   libelf-mmap: [ on  ]
...                       libnuma: [ OFF ]
...                       libperl: [ on  ]
...                     libpython: [ on  ]
...             libpython-version: [ on  ]
...                      libslang: [ on  ]
...                     libunwind: [ OFF ]
...                       on-exit: [ on  ]
...                stackprotector: [ on  ]
...            stackprotector-all: [ on  ]
...                       timerfd: [ on  ]


Thanks,
Namhyung


^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-27 13:46       ` Namhyung Kim
@ 2013-11-27 15:10         ` Jiri Olsa
  2013-11-27 15:27           ` Jiri Olsa
  0 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-27 15:10 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 Wed, Nov 27, 2013 at 10:46:00PM +0900, Namhyung Kim wrote:
> Hi Jiri,
> 
> 2013-11-25 (월), 17:03 +0100, Jiri Olsa:
> > On Sat, Nov 23, 2013 at 12:47:14AM +0900, Namhyung Kim wrote:
> > > 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > > > 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.
> > > 
> > > I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)
> > > 
> > >   CC       util/trace-event.o
> > > cc1: warnings being treated as errors
> > > util/trace-event.c: In function 'trace_event__tp_format':
> > > util/trace-event.c:63: error: not protecting function: no buffer at
> > > least 8 bytes long
> > > make[1]: *** [util/trace-event.o] Error 1
> > 
> > hum, what was the stackprotector status?
> > 
> > ...                stackprotector: [ on  ]
> > ...            stackprotector-all: [ on  ]
> 
> Right. Both of them were turned on.
> 
> Auto-detecting system features:
> ...                     backtrace: [ on  ]
> ...                         dwarf: [ on  ]
> ...                fortify-source: [ on  ]
> ...                         glibc: [ on  ]
> ...                          gtk2: [ on  ]
> ...                  gtk2-infobar: [ on  ]
> ...                      libaudit: [ on  ]
> ...                        libbfd: [ on  ]
> ...                        libelf: [ on  ]
> ...             libelf-getphdrnum: [ OFF ]
> ...                   libelf-mmap: [ on  ]
> ...                       libnuma: [ OFF ]
> ...                       libperl: [ on  ]
> ...                     libpython: [ on  ]
> ...             libpython-version: [ on  ]
> ...                      libslang: [ on  ]
> ...                     libunwind: [ OFF ]
> ...                       on-exit: [ on  ]
> ...                stackprotector: [ on  ]
> ...            stackprotector-all: [ on  ]
> ...                       timerfd: [ on  ]

I found that -fstack-protector might not always work:
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/691722

they say it was fixed in gcc 4.5.0 which I was not
able to prove in gcc release notes..

we could disable the warning like in the below
for gcc < 4.5.0, could you please test?

any other idea? ;-)

thanks,
jirka

---
diff --git a/tools/perf/config/feature-checks/test-stackprotector.c b/tools/perf/config/feature-checks/test-stackprotector.c
index c9f398d..c0ace8b 100644
--- a/tools/perf/config/feature-checks/test-stackprotector.c
+++ b/tools/perf/config/feature-checks/test-stackprotector.c
@@ -1,5 +1,13 @@
 #include <stdio.h>
 
+#define GCC_VERSION (__GNUC__ * 10000 \
+		+ __GNUC_MINOR__ * 100 \
+		+ __GNUC_PATCHLEVEL__)
+
+#if GCC_VERSION < 40500
+#error "failed"
+#endif
+
 int main(void)
 {
 	return puts("hi");

^ permalink raw reply related	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-27 15:10         ` Jiri Olsa
@ 2013-11-27 15:27           ` Jiri Olsa
  2013-11-27 15:49             ` Namhyung Kim
  0 siblings, 1 reply; 77+ messages in thread
From: Jiri Olsa @ 2013-11-27 15:27 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 Wed, Nov 27, 2013 at 04:10:45PM +0100, Jiri Olsa wrote:
> On Wed, Nov 27, 2013 at 10:46:00PM +0900, Namhyung Kim wrote:
> > Hi Jiri,
> > 
> > 2013-11-25 (월), 17:03 +0100, Jiri Olsa:
> > > On Sat, Nov 23, 2013 at 12:47:14AM +0900, Namhyung Kim wrote:
> > > > 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > > > > 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.
> > > > 
> > > > I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)
> > > > 
> > > >   CC       util/trace-event.o
> > > > cc1: warnings being treated as errors
> > > > util/trace-event.c: In function 'trace_event__tp_format':
> > > > util/trace-event.c:63: error: not protecting function: no buffer at
> > > > least 8 bytes long
> > > > make[1]: *** [util/trace-event.o] Error 1
> > > 
> > > hum, what was the stackprotector status?
> > > 
> > > ...                stackprotector: [ on  ]
> > > ...            stackprotector-all: [ on  ]
> > 
> > Right. Both of them were turned on.
> > 
> > Auto-detecting system features:
> > ...                     backtrace: [ on  ]
> > ...                         dwarf: [ on  ]
> > ...                fortify-source: [ on  ]
> > ...                         glibc: [ on  ]
> > ...                          gtk2: [ on  ]
> > ...                  gtk2-infobar: [ on  ]
> > ...                      libaudit: [ on  ]
> > ...                        libbfd: [ on  ]
> > ...                        libelf: [ on  ]
> > ...             libelf-getphdrnum: [ OFF ]
> > ...                   libelf-mmap: [ on  ]
> > ...                       libnuma: [ OFF ]
> > ...                       libperl: [ on  ]
> > ...                     libpython: [ on  ]
> > ...             libpython-version: [ on  ]
> > ...                      libslang: [ on  ]
> > ...                     libunwind: [ OFF ]
> > ...                       on-exit: [ on  ]
> > ...                stackprotector: [ on  ]
> > ...            stackprotector-all: [ on  ]
> > ...                       timerfd: [ on  ]
> 
> I found that -fstack-protector might not always work:
> https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/691722
> 
> they say it was fixed in gcc 4.5.0 which I was not
> able to prove in gcc release notes..
> 
> we could disable the warning like in the below
> for gcc < 4.5.0, could you please test?
> 
> any other idea? ;-)

or remove -Wstack-protector option completely, as it's just informative
seems there's nothing you could do about the warning anyway

jirka

^ permalink raw reply	[flat|nested] 77+ messages in thread

* Re: [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface
  2013-11-27 15:27           ` Jiri Olsa
@ 2013-11-27 15:49             ` Namhyung Kim
  0 siblings, 0 replies; 77+ messages in thread
From: Namhyung Kim @ 2013-11-27 15:49 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

2013-11-27 (수), 16:27 +0100, Jiri Olsa:
> On Wed, Nov 27, 2013 at 04:10:45PM +0100, Jiri Olsa wrote:
> > On Wed, Nov 27, 2013 at 10:46:00PM +0900, Namhyung Kim wrote:
> > > Hi Jiri,
> > > 
> > > 2013-11-25 (월), 17:03 +0100, Jiri Olsa:
> > > > On Sat, Nov 23, 2013 at 12:47:14AM +0900, Namhyung Kim wrote:
> > > > > 2013-11-21 (목), 12:01 +0100, Jiri Olsa:
> > > > > > 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.
> > > > > 
> > > > > I see this when I compile it on my old ubuntu 10.04 box (with gcc 4.4.3)
> > > > > 
> > > > >   CC       util/trace-event.o
> > > > > cc1: warnings being treated as errors
> > > > > util/trace-event.c: In function 'trace_event__tp_format':
> > > > > util/trace-event.c:63: error: not protecting function: no buffer at
> > > > > least 8 bytes long
> > > > > make[1]: *** [util/trace-event.o] Error 1
> > > > 
> > > > hum, what was the stackprotector status?
> > > > 
> > > > ...                stackprotector: [ on  ]
> > > > ...            stackprotector-all: [ on  ]
> > > 
> > > Right. Both of them were turned on.
> > > 
> > > Auto-detecting system features:
> > > ...                     backtrace: [ on  ]
> > > ...                         dwarf: [ on  ]
> > > ...                fortify-source: [ on  ]
> > > ...                         glibc: [ on  ]
> > > ...                          gtk2: [ on  ]
> > > ...                  gtk2-infobar: [ on  ]
> > > ...                      libaudit: [ on  ]
> > > ...                        libbfd: [ on  ]
> > > ...                        libelf: [ on  ]
> > > ...             libelf-getphdrnum: [ OFF ]
> > > ...                   libelf-mmap: [ on  ]
> > > ...                       libnuma: [ OFF ]
> > > ...                       libperl: [ on  ]
> > > ...                     libpython: [ on  ]
> > > ...             libpython-version: [ on  ]
> > > ...                      libslang: [ on  ]
> > > ...                     libunwind: [ OFF ]
> > > ...                       on-exit: [ on  ]
> > > ...                stackprotector: [ on  ]
> > > ...            stackprotector-all: [ on  ]
> > > ...                       timerfd: [ on  ]
> > 
> > I found that -fstack-protector might not always work:
> > https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/691722
> > 
> > they say it was fixed in gcc 4.5.0 which I was not
> > able to prove in gcc release notes..
> > 
> > we could disable the warning like in the below
> > for gcc < 4.5.0, could you please test?

Works well for me, thanks.

> > 
> > any other idea? ;-)
> 
> or remove -Wstack-protector option completely, as it's just informative
> seems there's nothing you could do about the warning anyway

Agreed.  It seems just adding -fstack-protector is enough.

Thanks,
Namhyung



^ permalink raw reply	[flat|nested] 77+ messages in thread

end of thread, other threads:[~2013-11-27 15:50 UTC | newest]

Thread overview: 77+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-21 11:00 [PATCH 00/22] perf tools: Add traceevent plugins support Jiri Olsa
2013-11-21 11:00 ` [PATCH 01/22] tools lib traceevent: Add plugin support Jiri Olsa
2013-11-21 11:58   ` Steven Rostedt
2013-11-22 14:17   ` Namhyung Kim
2013-11-23  8:12     ` Steven Rostedt
2013-11-25  7:33       ` Namhyung Kim
2013-11-25  9:30       ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 02/22] tools lib traceevent: Add plugin build support Jiri Olsa
2013-11-21 11:01 ` [PATCH 03/22] tools lib traceevent: Add traceevent_host_bigendian function Jiri Olsa
2013-11-22 14:22   ` Namhyung Kim
2013-11-23  8:27     ` Steven Rostedt
2013-11-25  7:24       ` Namhyung Kim
2013-11-25  9:33         ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 04/22] tools lib traceevent: Add jbd2 plugin Jiri Olsa
2013-11-21 13:09   ` Steven Rostedt
2013-11-22 14:27   ` Namhyung Kim
2013-11-23  8:52     ` Steven Rostedt
2013-11-25  7:38       ` Namhyung Kim
2013-11-25  9:46       ` Jiri Olsa
2013-11-25 10:03         ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 05/22] tools lib traceevent: Add hrtimer plugin Jiri Olsa
2013-11-21 13:10   ` Steven Rostedt
2013-11-22 14:33   ` Namhyung Kim
2013-11-23  8:59     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 06/22] tools lib traceevent: Add kmem plugin Jiri Olsa
2013-11-21 13:14   ` Steven Rostedt
2013-11-22 14:38   ` Namhyung Kim
2013-11-23  9:06     ` Steven Rostedt
2013-11-25  7:43       ` Namhyung Kim
2013-11-21 11:01 ` [PATCH 07/22] tools lib traceevent: Add kvm plugin Jiri Olsa
2013-11-21 13:15   ` Steven Rostedt
2013-11-22 14:45   ` Namhyung Kim
2013-11-23  9:15     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 08/22] tools lib traceevent: Add mac80211 plugin Jiri Olsa
2013-11-21 11:01 ` [PATCH 09/22] tools lib traceevent: Add sched_switch plugin Jiri Olsa
2013-11-21 13:18   ` Steven Rostedt
     [not found]   ` <1385132034.1747.58.camel@leonhard>
2013-11-23  9:16     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 10/22] tools lib traceevent: Add function plugin Jiri Olsa
2013-11-21 13:20   ` Steven Rostedt
2013-11-22 15:03   ` Namhyung Kim
2013-11-23  9:22     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 11/22] tools lib traceevent: Add xen plugin Jiri Olsa
2013-11-22 15:06   ` Namhyung Kim
2013-11-25 13:38     ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 12/22] tools lib traceevent: Add scsi plugin Jiri Olsa
2013-11-22 15:24   ` Namhyung Kim
2013-11-23  9:25     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 13/22] tools lib traceevent: Add cfg80211 plugin Jiri Olsa
2013-11-22 15:16   ` Namhyung Kim
2013-11-23  9:27     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 14/22] tools lib traceevent: Update kvm plugin with is_writable_pte helper Jiri Olsa
2013-11-22 15:19   ` Namhyung Kim
2013-11-23  9:28     ` Steven Rostedt
2013-11-21 11:01 ` [PATCH 15/22] tools lib traceevent: Change pevent_parse_event to return event format Jiri Olsa
2013-11-21 13:28   ` Steven Rostedt
2013-11-21 13:42     ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 16/22] tools lib traceevent: Harmonize the install messages in lib-traceevent Jiri Olsa
2013-11-21 11:01 ` [PATCH 17/22] perf tools: Add build and install plugins targets Jiri Olsa
2013-11-22 15:27   ` Namhyung Kim
2013-11-25 14:51     ` Jiri Olsa
2013-11-27  8:13       ` Namhyung Kim
2013-11-21 11:01 ` [PATCH 18/22] perf tools: Add udis86 disassembler feature check Jiri Olsa
2013-11-22 15:38   ` Namhyung Kim
2013-11-25 15:02     ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 19/22] perf tools: Add filename__read_str util function Jiri Olsa
2013-11-22 15:43   ` Namhyung Kim
2013-11-25 15:17     ` Jiri Olsa
2013-11-21 11:01 ` [PATCH 20/22] perf tools: Add trace-event object Jiri Olsa
2013-11-21 11:01 ` [PATCH 21/22] perf tools: Add trace-event global object for tracepoint interface Jiri Olsa
2013-11-22 15:47   ` Namhyung Kim
2013-11-25 16:03     ` Jiri Olsa
2013-11-27 13:46       ` Namhyung Kim
2013-11-27 15:10         ` Jiri Olsa
2013-11-27 15:27           ` Jiri Olsa
2013-11-27 15:49             ` Namhyung Kim
2013-11-21 11:01 ` [PATCH 22/22] perf tools: Overload pr_stat traceevent print function Jiri Olsa
2013-11-22 15:50   ` Namhyung Kim

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).