linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [GIT PULL 0/4] perf/core fixes and improvements
@ 2011-10-23 19:12 Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 1/4] perf tools: Fix tracing info recording Arnaldo Carvalho de Melo
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-10-23 19:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Arnaldo Carvalho de Melo, Anton Blanchard,
	David Ahern, Eric Dumazet, Frederic Weisbecker, Ingo Molnar,
	Jiri Olsa, Mike Galbraith, Neil Horman, Paul Mackerras,
	Pekka Enberg, Peter Zijlstra, Ricardo Ribalda Delgado,
	Stephane Eranian, Steven Rostedt, arnaldo.melo

Hi Ingo,

        Please consider pulling from:

git://github.com/acmel/linux.git perf/core

Regards,

- Arnaldo

Arnaldo Carvalho de Melo (2):
  perf ui browser: Use libslang to read keys
  perf hists browser: Refuse 'a' hotkey on non symbolic views

Jiri Olsa (1):
  perf tools: Fix tracing info recording

Ricardo Ribalda Delgado (1):
  perf symbols: Increase symbol KSYM_NAME_LEN size

 tools/perf/Makefile                    |    1 +
 tools/perf/builtin-annotate.c          |    8 +-
 tools/perf/util/header.c               |   27 +++++++-
 tools/perf/util/hist.h                 |    9 +--
 tools/perf/util/symbol.c               |    2 +-
 tools/perf/util/trace-event-info.c     |  112 +++++++++++++++++++++++++-------
 tools/perf/util/trace-event.h          |   13 ++++-
 tools/perf/util/ui/browser.c           |   79 +++++++++++++++-------
 tools/perf/util/ui/browsers/annotate.c |   19 ++---
 tools/perf/util/ui/browsers/hists.c    |   40 +++++++-----
 tools/perf/util/ui/keysyms.h           |   25 +++++++
 tools/perf/util/ui/libslang.h          |    2 +
 tools/perf/util/ui/setup.c             |   13 ++++
 13 files changed, 256 insertions(+), 94 deletions(-)
 create mode 100644 tools/perf/util/ui/keysyms.h


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

* [PATCH 1/4] perf tools: Fix tracing info recording
  2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
@ 2011-10-23 19:12 ` Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 2/4] perf ui browser: Use libslang to read keys Arnaldo Carvalho de Melo
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-10-23 19:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Jiri Olsa, Eric Dumazet, Ingo Molnar, Neil Horman,
	Paul Mackerras, Peter Zijlstra, Steven Rostedt,
	Arnaldo Carvalho de Melo

From: Jiri Olsa <jolsa@redhat.com>

Fixing the way the tracing information is stored within record command.
The current implementation is causing issues for pipe output.

Following commands fail currently:
	perf script syscall-counts ls
	perf record -e syscalls:sys_exit_read ls | ./perf report -i -

The tracing information is part of the perf data file. It contains
several files from within the tracing debugfs and procs directories.

Beside some static header files, for each tracing event the format
file is added. The /proc/kallsyms file is also added.

The tracing data are stored with preceeding size. This is causing some
dificulties for pipe output, since there's no way to tell debugfs/proc
file size before reading it. So, for pipe output, all the debugfs files
were read twice. Once to get the overall size and once to store the
content itself. This can cause problem in case any of these file
changed, within the storage time.

To fix this behaviour and ensure the integrity of the tracing data, we:
    - read debugfs/proc file into the temp file
    - get temp file size and dump it to the pipe
    - dump the temp file contents to the pipe

Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/20111020135943.GD2092@jolsa.brq.redhat.com
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/header.c           |   27 +++++++-
 tools/perf/util/trace-event-info.c |  112 ++++++++++++++++++++++++++++--------
 tools/perf/util/trace-event.h      |   13 ++++-
 3 files changed, 123 insertions(+), 29 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 6a9c041..76c0b2c 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2218,15 +2218,29 @@ int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist,
 				   struct perf_session *session __unused)
 {
 	union perf_event ev;
+	struct tracing_data *tdata;
 	ssize_t size = 0, aligned_size = 0, padding;
 	int err __used = 0;
 
+	/*
+	 * We are going to store the size of the data followed
+	 * by the data contents. Since the fd descriptor is a pipe,
+	 * we cannot seek back to store the size of the data once
+	 * we know it. Instead we:
+	 *
+	 * - write the tracing data to the temp file
+	 * - get/write the data size to pipe
+	 * - write the tracing data from the temp file
+	 *   to the pipe
+	 */
+	tdata = tracing_data_get(&evlist->entries, fd, true);
+	if (!tdata)
+		return -1;
+
 	memset(&ev, 0, sizeof(ev));
 
 	ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA;
-	size = read_tracing_data_size(fd, &evlist->entries);
-	if (size <= 0)
-		return size;
+	size = tdata->size;
 	aligned_size = ALIGN(size, sizeof(u64));
 	padding = aligned_size - size;
 	ev.tracing_data.header.size = sizeof(ev.tracing_data);
@@ -2234,7 +2248,12 @@ int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist,
 
 	process(&ev, NULL, session);
 
-	err = read_tracing_data(fd, &evlist->entries);
+	/*
+	 * The put function will copy all the tracing data
+	 * stored in temp file to the pipe.
+	 */
+	tracing_data_put(tdata);
+
 	write_padded(fd, NULL, 0, padding);
 
 	return aligned_size;
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 3403f81..2d530cf 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -196,7 +196,8 @@ static void record_file(const char *file, size_t hdr_sz)
 		die("Can't read '%s'", file);
 
 	/* put in zeros for file size, then fill true size later */
-	write_or_die(&size, hdr_sz);
+	if (hdr_sz)
+		write_or_die(&size, hdr_sz);
 
 	do {
 		r = read(fd, buf, BUFSIZ);
@@ -212,7 +213,7 @@ static void record_file(const char *file, size_t hdr_sz)
 	if (bigendian())
 		sizep += sizeof(u64) - hdr_sz;
 
-	if (pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0)
+	if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0)
 		die("writing to %s", output_file);
 }
 
@@ -428,6 +429,19 @@ get_tracepoints_path(struct list_head *pattrs)
 	return nr_tracepoints > 0 ? path.next : NULL;
 }
 
+static void
+put_tracepoints_path(struct tracepoint_path *tps)
+{
+	while (tps) {
+		struct tracepoint_path *t = tps;
+
+		tps = tps->next;
+		free(t->name);
+		free(t->system);
+		free(t);
+	}
+}
+
 bool have_tracepoints(struct list_head *pattrs)
 {
 	struct perf_evsel *pos;
@@ -439,19 +453,11 @@ bool have_tracepoints(struct list_head *pattrs)
 	return false;
 }
 
-int read_tracing_data(int fd, struct list_head *pattrs)
+static void tracing_data_header(void)
 {
-	char buf[BUFSIZ];
-	struct tracepoint_path *tps = get_tracepoints_path(pattrs);
-
-	/*
-	 * What? No tracepoints? No sense writing anything here, bail out.
-	 */
-	if (tps == NULL)
-		return -1;
-
-	output_fd = fd;
+	char buf[20];
 
+	/* just guessing this is someone's birthday.. ;) */
 	buf[0] = 23;
 	buf[1] = 8;
 	buf[2] = 68;
@@ -476,28 +482,86 @@ int read_tracing_data(int fd, struct list_head *pattrs)
 	/* save page_size */
 	page_size = sysconf(_SC_PAGESIZE);
 	write_or_die(&page_size, 4);
+}
+
+struct tracing_data *tracing_data_get(struct list_head *pattrs,
+				      int fd, bool temp)
+{
+	struct tracepoint_path *tps;
+	struct tracing_data *tdata;
+
+	output_fd = fd;
+
+	tps = get_tracepoints_path(pattrs);
+	if (!tps)
+		return NULL;
 
+	tdata = malloc_or_die(sizeof(*tdata));
+	tdata->temp = temp;
+	tdata->size = 0;
+
+	if (temp) {
+		int temp_fd;
+
+		snprintf(tdata->temp_file, sizeof(tdata->temp_file),
+			 "/tmp/perf-XXXXXX");
+		if (!mkstemp(tdata->temp_file))
+			die("Can't make temp file");
+
+		temp_fd = open(tdata->temp_file, O_RDWR);
+		if (temp_fd < 0)
+			die("Can't read '%s'", tdata->temp_file);
+
+		/*
+		 * Set the temp file the default output, so all the
+		 * tracing data are stored into it.
+		 */
+		output_fd = temp_fd;
+	}
+
+	tracing_data_header();
 	read_header_files();
 	read_ftrace_files(tps);
 	read_event_files(tps);
 	read_proc_kallsyms();
 	read_ftrace_printk();
 
-	return 0;
+	/*
+	 * All tracing data are stored by now, we can restore
+	 * the default output file in case we used temp file.
+	 */
+	if (temp) {
+		tdata->size = lseek(output_fd, 0, SEEK_CUR);
+		close(output_fd);
+		output_fd = fd;
+	}
+
+	put_tracepoints_path(tps);
+	return tdata;
 }
 
-ssize_t read_tracing_data_size(int fd, struct list_head *pattrs)
+void tracing_data_put(struct tracing_data *tdata)
 {
-	ssize_t size;
-	int err = 0;
+	if (tdata->temp) {
+		record_file(tdata->temp_file, 0);
+		unlink(tdata->temp_file);
+	}
 
-	calc_data_size = 1;
-	err = read_tracing_data(fd, pattrs);
-	size = calc_data_size - 1;
-	calc_data_size = 0;
+	free(tdata);
+}
 
-	if (err < 0)
-		return err;
+int read_tracing_data(int fd, struct list_head *pattrs)
+{
+	struct tracing_data *tdata;
 
-	return size;
+	/*
+	 * We work over the real file, so we can write data
+	 * directly, no temp file is needed.
+	 */
+	tdata = tracing_data_get(pattrs, fd, false);
+	if (!tdata)
+		return -ENOMEM;
+
+	tracing_data_put(tdata);
+	return 0;
 }
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index f674dda..a841008 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -263,7 +263,18 @@ void *raw_field_ptr(struct event *event, const char *name, void *data);
 unsigned long long eval_flag(const char *flag);
 
 int read_tracing_data(int fd, struct list_head *pattrs);
-ssize_t read_tracing_data_size(int fd, struct list_head *pattrs);
+
+struct tracing_data {
+	/* size is only valid if temp is 'true' */
+	ssize_t size;
+	bool temp;
+	char temp_file[50];
+};
+
+struct tracing_data *tracing_data_get(struct list_head *pattrs,
+				      int fd, bool temp);
+void tracing_data_put(struct tracing_data *tdata);
+
 
 /* taken from kernel/trace/trace.h */
 enum trace_flag_type {
-- 
1.6.2.5


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

* [PATCH 2/4] perf ui browser: Use libslang to read keys
  2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 1/4] perf tools: Fix tracing info recording Arnaldo Carvalho de Melo
@ 2011-10-23 19:12 ` Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 3/4] perf hists browser: Refuse 'a' hotkey on non symbolic views Arnaldo Carvalho de Melo
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-10-23 19:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern,
	Frederic Weisbecker, Mike Galbraith, Paul Mackerras,
	Peter Zijlstra, Stephane Eranian

From: Arnaldo Carvalho de Melo <acme@redhat.com>

Just another step in stopping the use of libnewt in perf.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-uy6s534uqxq8tenh6s3k8ocj@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Makefile                    |    1 +
 tools/perf/builtin-annotate.c          |    8 ++--
 tools/perf/util/hist.h                 |    9 +--
 tools/perf/util/ui/browser.c           |   79 +++++++++++++++++++++----------
 tools/perf/util/ui/browsers/annotate.c |   19 +++----
 tools/perf/util/ui/browsers/hists.c    |   33 ++++++-------
 tools/perf/util/ui/keysyms.h           |   25 ++++++++++
 tools/perf/util/ui/libslang.h          |    2 +
 tools/perf/util/ui/setup.c             |   13 +++++
 9 files changed, 125 insertions(+), 64 deletions(-)
 create mode 100644 tools/perf/util/ui/keysyms.h

diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index 37fe930..b98e307 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -472,6 +472,7 @@ else
 		LIB_H += util/ui/browser.h
 		LIB_H += util/ui/browsers/map.h
 		LIB_H += util/ui/helpline.h
+		LIB_H += util/ui/keysyms.h
 		LIB_H += util/ui/libslang.h
 		LIB_H += util/ui/progress.h
 		LIB_H += util/ui/util.h
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 3ea764a..46b4c24 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -118,7 +118,7 @@ static void hists__find_annotations(struct hists *self, int evidx,
 				    int nr_events)
 {
 	struct rb_node *nd = rb_first(&self->entries), *next;
-	int key = KEY_RIGHT;
+	int key = K_RIGHT;
 
 	while (nd) {
 		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
@@ -130,7 +130,7 @@ static void hists__find_annotations(struct hists *self, int evidx,
 		notes = symbol__annotation(he->ms.sym);
 		if (notes->src == NULL) {
 find_next:
-			if (key == KEY_LEFT)
+			if (key == K_LEFT)
 				nd = rb_prev(nd);
 			else
 				nd = rb_next(nd);
@@ -141,10 +141,10 @@ find_next:
 			key = hist_entry__tui_annotate(he, evidx, nr_events,
 						       NULL, NULL, 0);
 			switch (key) {
-			case KEY_RIGHT:
+			case K_RIGHT:
 				next = rb_next(nd);
 				break;
-			case KEY_LEFT:
+			case K_LEFT:
 				next = rb_prev(nd);
 				break;
 			default:
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 575bcbc..ff93ddc 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -125,16 +125,13 @@ static inline int hist_entry__tui_annotate(struct hist_entry *self __used,
 {
 	return 0;
 }
-#define KEY_LEFT -1
-#define KEY_RIGHT -2
+#define K_LEFT -1
+#define K_RIGHT -2
 #else
-#include <newt.h>
+#include "ui/keysyms.h"
 int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events,
 			     void(*timer)(void *arg), void *arg, int delay_secs);
 
-#define KEY_LEFT NEWT_KEY_LEFT
-#define KEY_RIGHT NEWT_KEY_RIGHT
-
 int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
 				  void(*timer)(void *arg), void *arg,
 				  int refresh);
diff --git a/tools/perf/util/ui/browser.c b/tools/perf/util/ui/browser.c
index 06fc9eb..5359f37 100644
--- a/tools/perf/util/ui/browser.c
+++ b/tools/perf/util/ui/browser.c
@@ -11,10 +11,9 @@
 #include <sys/ttydefaults.h>
 #include "browser.h"
 #include "helpline.h"
+#include "keysyms.h"
 #include "../color.h"
 
-int newtGetKey(void);
-
 static int ui_browser__percent_color(struct ui_browser *browser,
 				     double percent, bool current)
 {
@@ -292,16 +291,55 @@ void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries)
 	browser->seek(browser, browser->top_idx, SEEK_SET);
 }
 
+static int ui__getch(int delay_secs)
+{
+	struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
+	fd_set read_set;
+	int err, key;
+
+	FD_ZERO(&read_set);
+	FD_SET(0, &read_set);
+
+	if (delay_secs) {
+		timeout.tv_sec = delay_secs;
+		timeout.tv_usec = 0;
+	}
+
+        err = select(1, &read_set, NULL, NULL, ptimeout);
+
+	if (err == 0)
+		return K_TIMER;
+
+	if (err == -1) {
+		if (errno == EINTR)
+			return K_RESIZE;
+		return K_ERROR;
+	}
+
+	key = SLang_getkey();
+	if (key != K_ESC)
+		return key;
+
+	FD_ZERO(&read_set);
+	FD_SET(0, &read_set);
+	timeout.tv_sec = 0;
+	timeout.tv_usec = 20;
+        err = select(1, &read_set, NULL, NULL, &timeout);
+	if (err == 0)
+		return K_ESC;
+
+	SLang_ungetkey(key);
+	return SLkp_getkey();
+}
+
 int ui_browser__run(struct ui_browser *self, int delay_secs)
 {
 	int err, key;
-	struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
 
 	pthread__unblock_sigwinch();
 
 	while (1) {
 		off_t offset;
-		fd_set read_set;
 
 		pthread_mutex_lock(&ui__lock);
 		err = __ui_browser__refresh(self);
@@ -310,20 +348,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 		if (err < 0)
 			break;
 
-		FD_ZERO(&read_set);
-		FD_SET(0, &read_set);
+		key = ui__getch(delay_secs);
 
-		if (delay_secs) {
-			timeout.tv_sec = delay_secs;
-			timeout.tv_usec = 0;
-		}
-
-	        err = select(1, &read_set, NULL, NULL, ptimeout);
-		if (err > 0 && FD_ISSET(0, &read_set))
-			key = newtGetKey();
-		else if (err == 0)
-			break;
-		else {
+		if (key == K_RESIZE) {
 			pthread_mutex_lock(&ui__lock);
 			SLtt_get_screen_size();
 			SLsmg_reinit_smg();
@@ -335,9 +362,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 		}
 
 		if (self->use_navkeypressed && !self->navkeypressed) {
-			if (key == NEWT_KEY_DOWN || key == NEWT_KEY_UP ||
-			    key == NEWT_KEY_PGDN || key == NEWT_KEY_PGUP ||
-			    key == NEWT_KEY_HOME || key == NEWT_KEY_END ||
+			if (key == K_DOWN || key == K_UP ||
+			    key == K_PGDN || key == K_PGUP ||
+			    key == K_HOME || key == K_END ||
 			    key == ' ') {
 				self->navkeypressed = true;
 				continue;
@@ -346,7 +373,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 		}
 
 		switch (key) {
-		case NEWT_KEY_DOWN:
+		case K_DOWN:
 			if (self->index == self->nr_entries - 1)
 				break;
 			++self->index;
@@ -355,7 +382,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 				self->seek(self, +1, SEEK_CUR);
 			}
 			break;
-		case NEWT_KEY_UP:
+		case K_UP:
 			if (self->index == 0)
 				break;
 			--self->index;
@@ -364,7 +391,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 				self->seek(self, -1, SEEK_CUR);
 			}
 			break;
-		case NEWT_KEY_PGDN:
+		case K_PGDN:
 		case ' ':
 			if (self->top_idx + self->height > self->nr_entries - 1)
 				break;
@@ -376,7 +403,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 			self->top_idx += offset;
 			self->seek(self, +offset, SEEK_CUR);
 			break;
-		case NEWT_KEY_PGUP:
+		case K_PGUP:
 			if (self->top_idx == 0)
 				break;
 
@@ -389,10 +416,10 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
 			self->top_idx -= offset;
 			self->seek(self, -offset, SEEK_CUR);
 			break;
-		case NEWT_KEY_HOME:
+		case K_HOME:
 			ui_browser__reset_index(self);
 			break;
-		case NEWT_KEY_END:
+		case K_END:
 			offset = self->height - 1;
 			if (offset >= self->nr_entries)
 				offset = self->nr_entries - 1;
diff --git a/tools/perf/util/ui/browsers/annotate.c b/tools/perf/util/ui/browsers/annotate.c
index 1a12d8f..4e0cb7f 100644
--- a/tools/perf/util/ui/browsers/annotate.c
+++ b/tools/perf/util/ui/browsers/annotate.c
@@ -6,6 +6,7 @@
 #include "../../sort.h"
 #include "../../symbol.h"
 #include <pthread.h>
+#include <newt.h>
 
 static void ui__error_window(const char *fmt, ...)
 {
@@ -265,18 +266,14 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
 		}
 
 		switch (key) {
-		case -1:
-			/*
- 			 * FIXME we need to check if it was
- 			 * es.reason == NEWT_EXIT_TIMER
- 			 */
+		case K_TIMER:
 			if (timer != NULL)
 				timer(arg);
 
 			if (delay_secs != 0)
 				symbol__annotate_decay_histogram(sym, evidx);
 			continue;
-		case NEWT_KEY_TAB:
+		case K_TAB:
 			if (nd != NULL) {
 				nd = rb_prev(nd);
 				if (nd == NULL)
@@ -284,7 +281,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
 			} else
 				nd = self->curr_hot;
 			break;
-		case NEWT_KEY_UNTAB:
+		case K_UNTAB:
 			if (nd != NULL)
 				nd = rb_next(nd);
 				if (nd == NULL)
@@ -299,8 +296,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
 			if (annotate_browser__toggle_source(self))
 				ui_helpline__puts(help);
 			continue;
-		case NEWT_KEY_ENTER:
-		case NEWT_KEY_RIGHT:
+		case K_ENTER:
+		case K_RIGHT:
 			if (self->selection == NULL) {
 				ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org");
 				continue;
@@ -350,8 +347,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
 						     timer, arg, delay_secs);
 			}
 			continue;
-		case NEWT_KEY_LEFT:
-		case NEWT_KEY_ESCAPE:
+		case K_LEFT:
+		case K_ESC:
 		case 'q':
 		case CTRL('c'):
 			goto out;
diff --git a/tools/perf/util/ui/browsers/hists.c b/tools/perf/util/ui/browsers/hists.c
index a06e7d9..af12e6f 100644
--- a/tools/perf/util/ui/browsers/hists.c
+++ b/tools/perf/util/ui/browsers/hists.c
@@ -344,7 +344,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name,
 			/* Expand the whole world. */
 			hist_browser__set_folding(self, true);
 			break;
-		case NEWT_KEY_ENTER:
+		case K_ENTER:
 			if (hist_browser__toggle_fold(self))
 				break;
 			/* fall thru */
@@ -872,8 +872,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 		}
 
 		switch (key) {
-		case NEWT_KEY_TAB:
-		case NEWT_KEY_UNTAB:
+		case K_TAB:
+		case K_UNTAB:
 			if (nr_events == 1)
 				continue;
 			/*
@@ -891,7 +891,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 			goto zoom_dso;
 		case 't':
 			goto zoom_thread;
-		case NEWT_KEY_F1:
+		case K_F1:
 		case 'h':
 		case '?':
 			ui__help_window("h/?/F1        Show this window\n"
@@ -909,11 +909,11 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 					"d             Zoom into current DSO\n"
 					"t             Zoom into current Thread\n");
 			continue;
-		case NEWT_KEY_ENTER:
-		case NEWT_KEY_RIGHT:
+		case K_ENTER:
+		case K_RIGHT:
 			/* menu */
 			break;
-		case NEWT_KEY_LEFT: {
+		case K_LEFT: {
 			const void *top;
 
 			if (pstack__empty(fstack)) {
@@ -931,7 +931,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 				goto zoom_out_thread;
 			continue;
 		}
-		case NEWT_KEY_ESCAPE:
+		case K_ESC:
 			if (!left_exits &&
 			    !ui__dialog_yesno("Do you really want to exit?"))
 				continue;
@@ -1091,12 +1091,11 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu,
 		key = ui_browser__run(&menu->b, delay_secs);
 
 		switch (key) {
-		case -1:
-			/* FIXME we need to check if it was es.reason == NEWT_EXIT_TIMER */
+		case K_TIMER:
 			timer(arg);
 			continue;
-		case NEWT_KEY_RIGHT:
-		case NEWT_KEY_ENTER:
+		case K_RIGHT:
+		case K_ENTER:
 			if (!menu->selection)
 				continue;
 			pos = menu->selection;
@@ -1114,19 +1113,19 @@ browse_hists:
 						       arg, delay_secs);
 			ui_browser__show_title(&menu->b, title);
 			switch (key) {
-			case NEWT_KEY_TAB:
+			case K_TAB:
 				if (pos->node.next == &evlist->entries)
 					pos = list_entry(evlist->entries.next, struct perf_evsel, node);
 				else
 					pos = list_entry(pos->node.next, struct perf_evsel, node);
 				goto browse_hists;
-			case NEWT_KEY_UNTAB:
+			case K_UNTAB:
 				if (pos->node.prev == &evlist->entries)
 					pos = list_entry(evlist->entries.prev, struct perf_evsel, node);
 				else
 					pos = list_entry(pos->node.prev, struct perf_evsel, node);
 				goto browse_hists;
-			case NEWT_KEY_ESCAPE:
+			case K_ESC:
 				if (!ui__dialog_yesno("Do you really want to exit?"))
 					continue;
 				/* Fall thru */
@@ -1136,9 +1135,9 @@ browse_hists:
 			default:
 				continue;
 			}
-		case NEWT_KEY_LEFT:
+		case K_LEFT:
 			continue;
-		case NEWT_KEY_ESCAPE:
+		case K_ESC:
 			if (!ui__dialog_yesno("Do you really want to exit?"))
 				continue;
 			/* Fall thru */
diff --git a/tools/perf/util/ui/keysyms.h b/tools/perf/util/ui/keysyms.h
new file mode 100644
index 0000000..3458b19
--- /dev/null
+++ b/tools/perf/util/ui/keysyms.h
@@ -0,0 +1,25 @@
+#ifndef _PERF_KEYSYMS_H_
+#define _PERF_KEYSYMS_H_ 1
+
+#include "libslang.h"
+
+#define K_DOWN	SL_KEY_DOWN
+#define K_END	SL_KEY_END
+#define K_ENTER	'\r'
+#define K_ESC	033
+#define K_F1	SL_KEY_F(1)
+#define K_HOME	SL_KEY_HOME
+#define K_LEFT	SL_KEY_LEFT
+#define K_PGDN	SL_KEY_NPAGE
+#define K_PGUP	SL_KEY_PPAGE
+#define K_RIGHT	SL_KEY_RIGHT
+#define K_TAB	'\t'
+#define K_UNTAB	SL_KEY_UNTAB
+#define K_UP	SL_KEY_UP
+
+/* Not really keys */
+#define K_TIMER	 -1
+#define K_ERROR	 -2
+#define K_RESIZE -3
+
+#endif /* _PERF_KEYSYMS_H_ */
diff --git a/tools/perf/util/ui/libslang.h b/tools/perf/util/ui/libslang.h
index 2b63e1c..4d54b64 100644
--- a/tools/perf/util/ui/libslang.h
+++ b/tools/perf/util/ui/libslang.h
@@ -24,4 +24,6 @@
 #define sltt_set_color SLtt_set_color
 #endif
 
+#define SL_KEY_UNTAB 0x1000
+
 #endif /* _PERF_UI_SLANG_H_ */
diff --git a/tools/perf/util/ui/setup.c b/tools/perf/util/ui/setup.c
index 5111f1a..1e6ba06 100644
--- a/tools/perf/util/ui/setup.c
+++ b/tools/perf/util/ui/setup.c
@@ -18,6 +18,18 @@ static void newt_suspend(void *d __used)
 	newtResume();
 }
 
+static int ui__init(void)
+{
+	int err = SLkp_init();
+
+	if (err < 0)
+		goto out;
+
+	SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
+out:
+	return err;
+}
+
 static void ui__exit(void)
 {
 	SLtt_set_cursor_visibility(1);
@@ -44,6 +56,7 @@ void setup_browser(bool fallback_to_pager)
 
 	use_browser = 1;
 	newtInit();
+	ui__init();
 	newtSetSuspendCallback(newt_suspend, NULL);
 	ui_helpline__init();
 	ui_browser__init();
-- 
1.6.2.5


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

* [PATCH 3/4] perf hists browser: Refuse 'a' hotkey on non symbolic views
  2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 1/4] perf tools: Fix tracing info recording Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 2/4] perf ui browser: Use libslang to read keys Arnaldo Carvalho de Melo
@ 2011-10-23 19:12 ` Arnaldo Carvalho de Melo
  2011-10-23 19:12 ` [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size Arnaldo Carvalho de Melo
  2011-10-25  3:22 ` [GIT PULL 0/4] perf/core fixes and improvements Ingo Molnar
  4 siblings, 0 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-10-23 19:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Arnaldo Carvalho de Melo, David Ahern,
	Frederic Weisbecker, Mike Galbraith, Paul Mackerras,
	Peter Zijlstra, Stephane Eranian

From: Arnaldo Carvalho de Melo <acme@redhat.com>

We don't allocate the histogram data structures for --sort lists without
"sym", so, just like was done for the menu, don't try to annotate when
'a' is pressed, just warn the user about it.

Reported-by: David Ahern <dsahern@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-27mjg02s2mbw8lfxqv7jpzec@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/ui/browsers/hists.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/tools/perf/util/ui/browsers/hists.c b/tools/perf/util/ui/browsers/hists.c
index af12e6f..4663dcb 100644
--- a/tools/perf/util/ui/browsers/hists.c
+++ b/tools/perf/util/ui/browsers/hists.c
@@ -882,6 +882,13 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 			 */
 			goto out_free_stack;
 		case 'a':
+			if (!browser->has_symbols) {
+				ui__warning(
+			"Annotation is only available for symbolic views, "
+			"include \"sym\" in --sort to use it.");
+				continue;
+			}
+
 			if (browser->selection == NULL ||
 			    browser->selection->sym == NULL ||
 			    browser->selection->map->dso->annotate_warned)
-- 
1.6.2.5


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

* [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size
  2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
                   ` (2 preceding siblings ...)
  2011-10-23 19:12 ` [PATCH 3/4] perf hists browser: Refuse 'a' hotkey on non symbolic views Arnaldo Carvalho de Melo
@ 2011-10-23 19:12 ` Arnaldo Carvalho de Melo
  2011-10-24 18:05   ` Valdis.Kletnieks
  2011-10-25  3:22 ` [GIT PULL 0/4] perf/core fixes and improvements Ingo Molnar
  4 siblings, 1 reply; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2011-10-23 19:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Ricardo Ribalda Delgado, Anton Blanchard,
	David Ahern, Ingo Molnar, Paul Mackerras, Pekka Enberg,
	Peter Zijlstra, Arnaldo Carvalho de Melo

From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>

Fglrx propietary driver has symbol names over 128 chars (:S). This
breaks the function kallsyms__parse.

This fix increases the size of KSYM_NAME_LEN, so kallsyms__parse can
work on such kernels.

The only counterparty, is that such function requires 128 more bytes to
work.

Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: David Ahern <daahern@cisco.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1319096606-11568-1-git-send-email-ricardo.ribalda@gmail.com
Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/symbol.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 3f09a23..632b50c 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -24,7 +24,7 @@
 #include <sys/utsname.h>
 
 #ifndef KSYM_NAME_LEN
-#define KSYM_NAME_LEN 128
+#define KSYM_NAME_LEN 256
 #endif
 
 #ifndef NT_GNU_BUILD_ID
-- 
1.6.2.5


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

* Re: [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size
  2011-10-23 19:12 ` [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size Arnaldo Carvalho de Melo
@ 2011-10-24 18:05   ` Valdis.Kletnieks
  2011-10-24 18:54     ` Ricardo Ribalda Delgado
  0 siblings, 1 reply; 8+ messages in thread
From: Valdis.Kletnieks @ 2011-10-24 18:05 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Ingo Molnar, linux-kernel, Ricardo Ribalda Delgado,
	Anton Blanchard, David Ahern, Paul Mackerras, Pekka Enberg,
	Peter Zijlstra, Arnaldo Carvalho de Melo

[-- Attachment #1: Type: text/plain, Size: 433 bytes --]

On Sun, 23 Oct 2011 17:12:23 -0200, Arnaldo Carvalho de Melo said:

> Fglrx propietary driver has symbol names over 128 chars (:S). This
> breaks the function kallsyms__parse.

Well, that explains why they haven't upstreamed the driver, it will never
pass checkpatch's line-lenght check :)

But at some point you really need to just tell the vendors to put down
the crack pipe.

(What *are* the symbols? C++ mangled function names?)

[-- Attachment #2: Type: application/pgp-signature, Size: 227 bytes --]

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

* Re: [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size
  2011-10-24 18:05   ` Valdis.Kletnieks
@ 2011-10-24 18:54     ` Ricardo Ribalda Delgado
  0 siblings, 0 replies; 8+ messages in thread
From: Ricardo Ribalda Delgado @ 2011-10-24 18:54 UTC (permalink / raw)
  To: Valdis.Kletnieks
  Cc: Arnaldo Carvalho de Melo, Ingo Molnar, linux-kernel,
	Anton Blanchard, David Ahern, Paul Mackerras, Pekka Enberg,
	Peter Zijlstra, Arnaldo Carvalho de Melo

Also suck a big binary blob does not help :)

ricardo@newpili:/tmp/fglrx-driver-11-9/arch/x86_64/lib/modules/fglrx/build_mod$
for a in $( objdump -t libfglrx_ip.a | grep text| awk '{print $6}' );
do printf " %s $a\n" $(echo $a|  wc -c) ; done | sort -n  | tee
symbols | tail -n 10
 137 _ZNK11R800AddrLib28ComputeSurfaceInfoMicroTiledEPK32_ADDR_COMPUTE_SURFACE_INFO_INPUTP33_ADDR_COMPUTE_SURFACE_INFO_OUTPUTj13_AddrTileMode
 140 _ZNK11R800AddrLib33DispatchComputeFmaskCoordFromAddrEPK39_ADDR_COMPUTE_FMASK_COORDFROMADDR_INPUTP40_ADDR_COMPUTE_FMASK_COORDFROMADDR_OUTPUT
 141 _ZNK11R600AddrLib30HwlComputeSurfaceAddrFromCoordEPK41_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUTP42_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
 141 _ZNK11R600AddrLib30HwlComputeSurfaceCoordFromAddrEPK41_ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUTP42_ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
 141 _ZNK11R800AddrLib30HwlComputeSurfaceAddrFromCoordEPK41_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUTP42_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
 141 _ZNK11R800AddrLib30HwlComputeSurfaceCoordFromAddrEPK41_ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUTP42_ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
 146 _ZNK11R600AddrLib35DispatchComputeSurfaceAddrFromCoordEPK41_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUTP42_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
 146 _ZNK11R600AddrLib35DispatchComputeSurfaceCoordFromAddrEPK41_ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUTP42_ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT
 146 _ZNK11R800AddrLib35DispatchComputeSurfaceAddrFromCoordEPK41_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUTP42_ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT
 146 _ZNK11R800AddrLib35DispatchComputeSurfaceCoordFromAddrEPK41_ADDR_COMPUTE_SURFACE_COORDFROMADDR_INPUTP42_ADDR_COMPUTE_SURFACE_COORDFROMADDR_OUTPUT


On Mon, Oct 24, 2011 at 20:05,  <Valdis.Kletnieks@vt.edu> wrote:
> On Sun, 23 Oct 2011 17:12:23 -0200, Arnaldo Carvalho de Melo said:
>
>> Fglrx propietary driver has symbol names over 128 chars (:S). This
>> breaks the function kallsyms__parse.
>
> Well, that explains why they haven't upstreamed the driver, it will never
> pass checkpatch's line-lenght check :)
>
> But at some point you really need to just tell the vendors to put down
> the crack pipe.
>
> (What *are* the symbols? C++ mangled function names?)
>



-- 
Ricardo Ribalda

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

* Re: [GIT PULL 0/4] perf/core fixes and improvements
  2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
                   ` (3 preceding siblings ...)
  2011-10-23 19:12 ` [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size Arnaldo Carvalho de Melo
@ 2011-10-25  3:22 ` Ingo Molnar
  4 siblings, 0 replies; 8+ messages in thread
From: Ingo Molnar @ 2011-10-25  3:22 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: linux-kernel, Anton Blanchard, David Ahern, Eric Dumazet,
	Frederic Weisbecker, Jiri Olsa, Mike Galbraith, Neil Horman,
	Paul Mackerras, Pekka Enberg, Peter Zijlstra,
	Ricardo Ribalda Delgado, Stephane Eranian, Steven Rostedt,
	arnaldo.melo


* Arnaldo Carvalho de Melo <acme@infradead.org> wrote:

> Hi Ingo,
> 
>         Please consider pulling from:
> 
> git://github.com/acmel/linux.git perf/core
> 
> Regards,
> 
> - Arnaldo
> 
> Arnaldo Carvalho de Melo (2):
>   perf ui browser: Use libslang to read keys
>   perf hists browser: Refuse 'a' hotkey on non symbolic views
> 
> Jiri Olsa (1):
>   perf tools: Fix tracing info recording
> 
> Ricardo Ribalda Delgado (1):
>   perf symbols: Increase symbol KSYM_NAME_LEN size
> 
>  tools/perf/Makefile                    |    1 +
>  tools/perf/builtin-annotate.c          |    8 +-
>  tools/perf/util/header.c               |   27 +++++++-
>  tools/perf/util/hist.h                 |    9 +--
>  tools/perf/util/symbol.c               |    2 +-
>  tools/perf/util/trace-event-info.c     |  112 +++++++++++++++++++++++++-------
>  tools/perf/util/trace-event.h          |   13 ++++-
>  tools/perf/util/ui/browser.c           |   79 +++++++++++++++-------
>  tools/perf/util/ui/browsers/annotate.c |   19 ++---
>  tools/perf/util/ui/browsers/hists.c    |   40 +++++++-----
>  tools/perf/util/ui/keysyms.h           |   25 +++++++
>  tools/perf/util/ui/libslang.h          |    2 +
>  tools/perf/util/ui/setup.c             |   13 ++++
>  13 files changed, 256 insertions(+), 94 deletions(-)
>  create mode 100644 tools/perf/util/ui/keysyms.h

Pulled, thanks a lot Arnaldo!

	Ingo

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

end of thread, other threads:[~2011-10-25  3:24 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-23 19:12 [GIT PULL 0/4] perf/core fixes and improvements Arnaldo Carvalho de Melo
2011-10-23 19:12 ` [PATCH 1/4] perf tools: Fix tracing info recording Arnaldo Carvalho de Melo
2011-10-23 19:12 ` [PATCH 2/4] perf ui browser: Use libslang to read keys Arnaldo Carvalho de Melo
2011-10-23 19:12 ` [PATCH 3/4] perf hists browser: Refuse 'a' hotkey on non symbolic views Arnaldo Carvalho de Melo
2011-10-23 19:12 ` [PATCH 4/4] perf symbols: Increase symbol KSYM_NAME_LEN size Arnaldo Carvalho de Melo
2011-10-24 18:05   ` Valdis.Kletnieks
2011-10-24 18:54     ` Ricardo Ribalda Delgado
2011-10-25  3:22 ` [GIT PULL 0/4] perf/core fixes and improvements Ingo Molnar

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