mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Tom Zanussi <tzanussi@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@elte.hu, fweisbec@gmail.com, rostedt@goodmis.org,
	k-keiichi@bx.jp.nec.com
Subject: [PATCH 09/12] perf tools: save syscall map
Date: Wed, 27 Jan 2010 02:28:00 -0600	[thread overview]
Message-ID: <1264580883-15324-10-git-send-email-tzanussi@gmail.com> (raw)
In-Reply-To: <1264580883-15324-1-git-send-email-tzanussi@gmail.com>

Read the exported syscall metadata and save it in the trace file for
post-processing tools.

Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
---
 tools/perf/util/trace-event-info.c  |   25 ++++++++++++++
 tools/perf/util/trace-event-parse.c |   63 +++++++++++++++++++++++++++++++++++
 tools/perf/util/trace-event-read.c  |   18 ++++++++++
 tools/perf/util/trace-event.h       |   10 +++++
 4 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 5ea8973..6a6e5cc 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -461,6 +461,30 @@ out:
 	put_tracing_file(path);
 }
 
+static void read_syscall_map(void)
+{
+	unsigned int size, check_size;
+	char *path;
+	struct stat st;
+	int ret;
+
+	path = get_tracing_file("syscall_map");
+	ret = stat(path, &st);
+	if (ret < 0) {
+		/* not found */
+		size = 0;
+		write_or_die(&size, 4);
+		goto out;
+	}
+	size = get_size(path);
+	write_or_die(&size, 4);
+	check_size = copy_file(path);
+	if (size != check_size)
+		die("error in size of file '%s'", path);
+out:
+	put_tracing_file(path);
+}
+
 static struct tracepoint_path *
 get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events)
 {
@@ -523,6 +547,7 @@ int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events)
 	read_event_files(tps);
 	read_proc_kallsyms();
 	read_ftrace_printk();
+	read_syscall_map();
 
 	return 0;
 }
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index c1299ff..31bb6f2 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -336,6 +336,69 @@ void print_printk(void)
 	}
 }
 
+static struct syscall_metadata *syscalls;
+static int syscall_count;
+
+void parse_syscall_map(char *file, int size __unused)
+{
+	struct syscall_list {
+		struct syscall_list	*next;
+		char			*name;
+		int			nr;
+	} *list = NULL, *item;
+	char *line;
+	char *next = NULL;
+	int i;
+
+	line = strtok_r(file, "\n", &next);
+	while (line) {
+		item = malloc_or_die(sizeof(*item));
+		sscanf(line, "%d:%as", &item->nr,
+		       (float *)(void *)&item->name); /* workaround gcc warning */
+		item->next = list;
+		list = item;
+		line = strtok_r(NULL, "\n", &next);
+		syscall_count++;
+	}
+
+	syscalls = malloc_or_die(sizeof(*syscalls) * syscall_count);
+
+	i = 0;
+	while (list) {
+		syscalls[i].nr = list->nr;
+		syscalls[i].name = list->name;
+		i++;
+		item = list;
+		list = list->next;
+		free(item);
+	}
+}
+
+int nr_syscalls(void)
+{
+	return syscall_count;
+}
+
+const struct syscall_metadata *syscall_at_idx(int idx)
+{
+	if (idx >= syscall_count)
+		return NULL;
+
+	return &syscalls[idx];
+}
+
+const struct syscall_metadata *find_syscall(int syscall_nr)
+{
+	int i;
+
+	for (i = 0; i < syscall_count; i++) {
+		if (syscalls[i].nr == syscall_nr)
+			return &syscalls[i];
+	}
+
+	return NULL;
+}
+
 static struct event *alloc_event(void)
 {
 	struct event *event;
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 1744422..70fcaec 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -171,6 +171,23 @@ static void read_ftrace_printk(void)
 	free(buf);
 }
 
+static void read_syscall_map(void)
+{
+	unsigned int size;
+	char *buf;
+
+	size = read4();
+	if (!size)
+		return;
+
+	buf = malloc_or_die(size);
+	read_or_die(buf, size);
+
+	parse_syscall_map(buf, size);
+
+	free(buf);
+}
+
 static void read_header_files(void)
 {
 	unsigned long long size;
@@ -498,6 +515,7 @@ void trace_report(int fd)
 	read_event_files();
 	read_proc_kallsyms();
 	read_ftrace_printk();
+	read_syscall_map();
 
 	if (show_funcs) {
 		print_funcs();
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index c3269b9..5313ad8 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -178,6 +178,16 @@ int parse_event_file(char *buf, unsigned long size, char *sys);
 void print_event(int cpu, void *data, int size, unsigned long long nsecs,
 		  char *comm);
 
+struct syscall_metadata {
+	char *name;
+	int nr;
+};
+
+void parse_syscall_map(char *file, int size);
+int nr_syscalls(void);
+const struct syscall_metadata *syscall_at_idx(int idx);
+const struct syscall_metadata *find_syscall(int syscall_nr);
+
 extern int file_bigendian;
 extern int host_bigendian;
 
-- 
1.6.4.GIT


  parent reply	other threads:[~2010-01-27  8:28 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-27  8:27 [PATCH 00/12] perf trace: Python scripting support Tom Zanussi
2010-01-27  8:27 ` [PATCH 01/12] perf trace/scripting: Fix supported language listing option Tom Zanussi
2010-02-25 10:06   ` [tip:perf/core] perf/scripts: " tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 02/12] perf trace/scripting: fix bug in Util.pm Tom Zanussi
2010-02-25 10:06   ` [tip:perf/core] perf/scripts: Fix " tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 03/12] perf trace/scripting: move common code out of Perl-specific files Tom Zanussi
2010-02-25 10:07   ` [tip:perf/core] perf/scripts: Move " tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 04/12] perf trace/scripting: move Perl scripting files to scripting-engines dir Tom Zanussi
2010-02-25 10:07   ` [tip:perf/core] perf/scripts: Move " tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 05/12] perf trace/scripting: remove check-perf-trace from listed scripts Tom Zanussi
2010-02-22  1:51   ` Frederic Weisbecker
2010-02-25 10:07   ` [tip:perf/core] perf/scripts: Remove " tip-bot for Tom Zanussi
2010-02-25 10:07   ` [tip:perf/core] perf/scripts: Add Python scripting engine tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 06/12] perf trace/scripting: add " Tom Zanussi
2010-02-22  2:27   ` Frederic Weisbecker
2010-02-22  7:12     ` Tom Zanussi
2010-02-25 10:08       ` [tip:perf/core] perf/scripts: Remove unnecessary PyTuple resizes tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 07/12] perf trace/scripting: add syscall tracing scripts Tom Zanussi
2010-02-25 10:08   ` [tip:perf/core] perf/scripts: Add " tip-bot for Tom Zanussi
2010-01-27  8:27 ` [PATCH 08/12] perf: export some syscall metadata Tom Zanussi
2010-02-23 21:44   ` Frederic Weisbecker
2010-02-24  6:00     ` Tom Zanussi
2010-02-25  1:52       ` Frederic Weisbecker
2010-02-25  6:09         ` Tom Zanussi
2010-02-25  2:43       ` Frederic Weisbecker
2010-02-25  6:51         ` Tom Zanussi
2010-03-27  0:37           ` Frederic Weisbecker
2010-03-28  5:18             ` Tom Zanussi
2010-01-27  8:28 ` Tom Zanussi [this message]
2010-01-27  8:28 ` [PATCH 10/12] perf trace/scripting: make the syscall map available as a Python dict Tom Zanussi
2010-01-27  8:28 ` [PATCH 11/12] perf trace/scripting: make the syscall map available as a Perl hash Tom Zanussi
2010-01-27  8:28 ` [PATCH 12/12] perf trace/scripting: add perf-trace-python Documentation Tom Zanussi
2010-02-25  1:37   ` Frederic Weisbecker
2010-02-25  6:06     ` Tom Zanussi
2010-02-25 10:08   ` [tip:perf/core] perf/scripts: Add " tip-bot for Tom Zanussi
2010-02-19 21:37 ` [PATCH 00/12] perf trace: Python scripting support Frederic Weisbecker
2010-02-20 21:51   ` Tom Zanussi
2010-02-23 17:31     ` Frederic Weisbecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1264580883-15324-10-git-send-email-tzanussi@gmail.com \
    --to=tzanussi@gmail.com \
    --cc=fweisbec@gmail.com \
    --cc=k-keiichi@bx.jp.nec.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome