All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHSET 0/9] perf util: Cleanup die() and its friends
@ 2013-03-19  8:53 Namhyung Kim
  2013-03-19  8:53 ` [PATCH 1/9] perf util: Let get_tracing_file() can return NULL Namhyung Kim
                   ` (8 more replies)
  0 siblings, 9 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

Hi,

I've done this painful cleanup of *die() removal. ;-) It now can
return error code rather than calling die() when something bad happen.
It only touches tracepoint related code and I tested it's working
normally but lacks thorough testing in various environment.

Please help testing more!

Thanks,
Namhyung


Namhyung Kim (9):
  perf util: Let get_tracing_file() can return NULL
  perf util: Get rid of malloc_or_die() in trace-event-info.c
  perf util: Get rid of write_or_die() from trace-event-info.c
  perf util: Get rid of die() calls from trace-event-info.c
  perf util: Handle failure case in trace_report()
  perf util: Get rid of malloc_or_die() in trace-event-read.c
  perf util: Get rid of read_or_die() in trace-event-read.c
  perf util: Get rid of die() calls in trace-data-read.c
  perf util: Cleanup calc_data_size logic

 tools/perf/util/header.c           |  11 +-
 tools/perf/util/trace-event-info.c | 336 +++++++++++++++++++++++++------------
 tools/perf/util/trace-event-read.c | 256 ++++++++++++++++++----------
 tools/perf/util/trace-event.h      |   2 +-
 4 files changed, 403 insertions(+), 202 deletions(-)

-- 
1.7.11.7


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

* [PATCH 1/9] perf util: Let get_tracing_file() can return NULL
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 13:54   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 2/9] perf util: Get rid of malloc_or_die() in trace-event-info.c Namhyung Kim
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

So that it can be used by other places.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-info.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 5729f434c5b1..f241343b7d48 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -62,7 +62,7 @@ static const char *find_debugfs(void)
 	const char *path = perf_debugfs_mount(NULL);
 
 	if (!path)
-		die("Your kernel not support debugfs filesystem");
+		pr_err("Your kernel not support debugfs filesystem");
 
 	return path;
 }
@@ -81,8 +81,12 @@ static const char *find_tracing_dir(void)
 		return tracing;
 
 	debugfs = find_debugfs();
+	if (!debugfs)
+		return NULL;
 
-	tracing = malloc_or_die(strlen(debugfs) + 9);
+	tracing = malloc(strlen(debugfs) + 9);
+	if (!tracing)
+		return NULL;
 
 	sprintf(tracing, "%s/tracing", debugfs);
 
@@ -99,7 +103,9 @@ static char *get_tracing_file(const char *name)
 	if (!tracing)
 		return NULL;
 
-	file = malloc_or_die(strlen(tracing) + strlen(name) + 2);
+	file = malloc(strlen(tracing) + strlen(name) + 2);
+	if (!file)
+		return NULL;
 
 	sprintf(file, "%s/%s", tracing, name);
 	return file;
@@ -170,6 +176,9 @@ static void read_header_files(void)
 	struct stat st;
 
 	path = get_tracing_file("events/header_page");
+	if (!path)
+		die("can't get tracing/events/header_page");
+
 	if (stat(path, &st) < 0)
 		die("can't read '%s'", path);
 
@@ -178,6 +187,9 @@ static void read_header_files(void)
 	put_tracing_file(path);
 
 	path = get_tracing_file("events/header_event");
+	if (!path)
+		die("can't get tracing/events/header_event");
+
 	if (stat(path, &st) < 0)
 		die("can't read '%s'", path);
 
@@ -251,6 +263,8 @@ static void read_ftrace_files(struct tracepoint_path *tps)
 	char *path;
 
 	path = get_tracing_file("events/ftrace");
+	if (!path)
+		die("can't get tracing/events/ftrace");
 
 	copy_event_system(path, tps);
 
@@ -279,6 +293,8 @@ static void read_event_files(struct tracepoint_path *tps)
 	int ret;
 
 	path = get_tracing_file("events");
+	if (!path)
+		die("can't get tracing/events");
 
 	dir = opendir(path);
 	if (!dir)
@@ -343,6 +359,9 @@ static void read_ftrace_printk(void)
 	int ret;
 
 	path = get_tracing_file("printk_formats");
+	if (!path)
+		die("can't get tracing/printk_formats");
+
 	ret = stat(path, &st);
 	if (ret < 0) {
 		/* not found */
-- 
1.7.11.7


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

* [PATCH 2/9] perf util: Get rid of malloc_or_die() in trace-event-info.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
  2013-03-19  8:53 ` [PATCH 1/9] perf util: Let get_tracing_file() can return NULL Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19  8:53 ` [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c Namhyung Kim
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Check return value of malloc and fail if NULL.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-info.c | 48 ++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index f241343b7d48..f04c8fd190dc 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -47,16 +47,6 @@ static const char *output_file = "trace.info";
 static int output_fd;
 
 
-static void *malloc_or_die(unsigned int size)
-{
-	void *data;
-
-	data = malloc(size);
-	if (!data)
-		die("malloc");
-	return data;
-}
-
 static const char *find_debugfs(void)
 {
 	const char *path = perf_debugfs_mount(NULL);
@@ -209,7 +199,7 @@ static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
 	return false;
 }
 
-static void copy_event_system(const char *sys, struct tracepoint_path *tps)
+static int copy_event_system(const char *sys, struct tracepoint_path *tps)
 {
 	struct dirent *dent;
 	struct stat st;
@@ -217,6 +207,7 @@ static void copy_event_system(const char *sys, struct tracepoint_path *tps)
 	DIR *dir;
 	int count = 0;
 	int ret;
+	int err;
 
 	dir = opendir(sys);
 	if (!dir)
@@ -228,7 +219,11 @@ static void copy_event_system(const char *sys, struct tracepoint_path *tps)
 		    strcmp(dent->d_name, "..") == 0 ||
 		    !name_in_tp_list(dent->d_name, tps))
 			continue;
-		format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
+		format = malloc(strlen(sys) + strlen(dent->d_name) + 10);
+		if (!format) {
+			err = -ENOMEM;
+			goto out;
+		}
 		sprintf(format, "%s/%s/format", sys, dent->d_name);
 		ret = stat(format, &st);
 		free(format);
@@ -246,16 +241,22 @@ static void copy_event_system(const char *sys, struct tracepoint_path *tps)
 		    strcmp(dent->d_name, "..") == 0 ||
 		    !name_in_tp_list(dent->d_name, tps))
 			continue;
-		format = malloc_or_die(strlen(sys) + strlen(dent->d_name) + 10);
+		format = malloc(strlen(sys) + strlen(dent->d_name) + 10);
+		if (!format) {
+			err = -ENOMEM;
+			goto out;
+		}
 		sprintf(format, "%s/%s/format", sys, dent->d_name);
 		ret = stat(format, &st);
 
 		if (ret >= 0)
 			record_file(format, 8);
-
 		free(format);
 	}
+	err = 0;
+out:
 	closedir(dir);
+	return err;
 }
 
 static void read_ftrace_files(struct tracepoint_path *tps)
@@ -282,7 +283,7 @@ static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
 	return false;
 }
 
-static void read_event_files(struct tracepoint_path *tps)
+static int read_event_files(struct tracepoint_path *tps)
 {
 	struct dirent *dent;
 	struct stat st;
@@ -291,6 +292,7 @@ static void read_event_files(struct tracepoint_path *tps)
 	DIR *dir;
 	int count = 0;
 	int ret;
+	int err;
 
 	path = get_tracing_file("events");
 	if (!path)
@@ -320,7 +322,11 @@ static void read_event_files(struct tracepoint_path *tps)
 		    strcmp(dent->d_name, "ftrace") == 0 ||
 		    !system_in_tp_list(dent->d_name, tps))
 			continue;
-		sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
+		sys = malloc(strlen(path) + strlen(dent->d_name) + 2);
+		if (!sys) {
+			err = -ENOMEM;
+			goto out;
+		}
 		sprintf(sys, "%s/%s", path, dent->d_name);
 		ret = stat(sys, &st);
 		if (ret >= 0) {
@@ -329,9 +335,12 @@ static void read_event_files(struct tracepoint_path *tps)
 		}
 		free(sys);
 	}
-
+	err = 0;
+out:
 	closedir(dir);
 	put_tracing_file(path);
+
+	return err;
 }
 
 static void read_proc_kallsyms(void)
@@ -463,7 +472,10 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 	if (!tps)
 		return NULL;
 
-	tdata = malloc_or_die(sizeof(*tdata));
+	tdata = malloc(sizeof(*tdata));
+	if (!tdata)
+		return NULL;
+
 	tdata->temp = temp;
 	tdata->size = 0;
 
-- 
1.7.11.7


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

* [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
  2013-03-19  8:53 ` [PATCH 1/9] perf util: Let get_tracing_file() can return NULL Namhyung Kim
  2013-03-19  8:53 ` [PATCH 2/9] perf util: Get rid of malloc_or_die() in trace-event-info.c Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 14:35   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 4/9] perf util: Get rid of die() calls " Namhyung Kim
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Check return value of write and fail if error.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-info.c | 169 +++++++++++++++++++++++++------------
 tools/perf/util/trace-event.h      |   2 +-
 2 files changed, 116 insertions(+), 55 deletions(-)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index f04c8fd190dc..05cf94ef57e4 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -106,17 +106,6 @@ static void put_tracing_file(char *file)
 	free(file);
 }
 
-static ssize_t write_or_die(const void *buf, size_t len)
-{
-	int ret;
-
-	ret = write(output_fd, buf, len);
-	if (ret < 0)
-		die("writing to '%s'", output_file);
-
-	return ret;
-}
-
 int bigendian(void)
 {
 	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
@@ -127,29 +116,32 @@ int bigendian(void)
 }
 
 /* unfortunately, you can not stat debugfs or proc files for size */
-static void record_file(const char *file, size_t hdr_sz)
+static int record_file(const char *file, ssize_t hdr_sz)
 {
 	unsigned long long size = 0;
 	char buf[BUFSIZ], *sizep;
 	off_t hdr_pos = lseek(output_fd, 0, SEEK_CUR);
 	int r, fd;
+	int err = -EIO;
 
 	fd = open(file, O_RDONLY);
 	if (fd < 0)
 		die("Can't read '%s'", file);
 
 	/* put in zeros for file size, then fill true size later */
-	if (hdr_sz)
-		write_or_die(&size, hdr_sz);
+	if (hdr_sz) {
+		if (write(output_fd, &size, hdr_sz) != hdr_sz)
+			goto out;
+	}
 
 	do {
 		r = read(fd, buf, BUFSIZ);
 		if (r > 0) {
 			size += r;
-			write_or_die(buf, r);
+			if (write(output_fd, buf, r) != r)
+				goto out;
 		}
 	} while (r > 0);
-	close(fd);
 
 	/* ugh, handle big-endian hdr_size == 4 */
 	sizep = (char*)&size;
@@ -158,12 +150,18 @@ static void record_file(const char *file, size_t hdr_sz)
 
 	if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0)
 		die("writing to %s", output_file);
+
+	err = 0;
+out:
+	close(fd);
+	return err;
 }
 
-static void read_header_files(void)
+static int read_header_files(void)
 {
 	char *path;
 	struct stat st;
+	int err = -EIO;
 
 	path = get_tracing_file("events/header_page");
 	if (!path)
@@ -172,8 +170,16 @@ static void read_header_files(void)
 	if (stat(path, &st) < 0)
 		die("can't read '%s'", path);
 
-	write_or_die("header_page", 12);
-	record_file(path, 8);
+	if (write(output_fd, "header_page", 12) != 12) {
+		pr_err("can't write header_page\n");
+		goto out;
+	}
+
+	if (record_file(path, 8) < 0) {
+		pr_err("can't record header_page file\n");
+		goto out;
+	}
+
 	put_tracing_file(path);
 
 	path = get_tracing_file("events/header_event");
@@ -183,9 +189,20 @@ static void read_header_files(void)
 	if (stat(path, &st) < 0)
 		die("can't read '%s'", path);
 
-	write_or_die("header_event", 13);
-	record_file(path, 8);
+	if (write(output_fd, "header_event", 13) != 13) {
+		pr_err("can't write header_event\n");
+		goto out;
+	}
+
+	if (record_file(path, 8) < 0) {
+		pr_err("can't record header_event file\n");
+		goto out;
+	}
+
+	err = 0;
+out:
 	put_tracing_file(path);
+	return err;
 }
 
 static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
@@ -232,7 +249,11 @@ static int copy_event_system(const char *sys, struct tracepoint_path *tps)
 		count++;
 	}
 
-	write_or_die(&count, 4);
+	if (write(output_fd, &count, 4) != 4) {
+		err = -EIO;
+		pr_err("can't write count\n");
+		goto out;
+	}
 
 	rewinddir(dir);
 	while ((dent = readdir(dir))) {
@@ -249,8 +270,13 @@ static int copy_event_system(const char *sys, struct tracepoint_path *tps)
 		sprintf(format, "%s/%s/format", sys, dent->d_name);
 		ret = stat(format, &st);
 
-		if (ret >= 0)
-			record_file(format, 8);
+		if (ret >= 0) {
+			err = record_file(format, 8);
+			if (err) {
+				free(format);
+				goto out;
+			}
+		}
 		free(format);
 	}
 	err = 0;
@@ -259,17 +285,20 @@ out:
 	return err;
 }
 
-static void read_ftrace_files(struct tracepoint_path *tps)
+static int read_ftrace_files(struct tracepoint_path *tps)
 {
 	char *path;
+	int ret;
 
 	path = get_tracing_file("events/ftrace");
 	if (!path)
 		die("can't get tracing/events/ftrace");
 
-	copy_event_system(path, tps);
+	ret = copy_event_system(path, tps);
 
 	put_tracing_file(path);
+
+	return ret;
 }
 
 static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
@@ -312,7 +341,11 @@ static int read_event_files(struct tracepoint_path *tps)
 		count++;
 	}
 
-	write_or_die(&count, 4);
+	if (write(output_fd, &count, 4) != 4) {
+		err = -EIO;
+		pr_err("can't write count\n");
+		goto out;
+	}
 
 	rewinddir(dir);
 	while ((dent = readdir(dir))) {
@@ -330,8 +363,14 @@ static int read_event_files(struct tracepoint_path *tps)
 		sprintf(sys, "%s/%s", path, dent->d_name);
 		ret = stat(sys, &st);
 		if (ret >= 0) {
-			write_or_die(dent->d_name, strlen(dent->d_name) + 1);
-			copy_event_system(sys, tps);
+			ssize_t size = strlen(dent->d_name) + 1;
+
+			if (write(output_fd, dent->d_name, size) != size ||
+			    copy_event_system(sys, tps) < 0) {
+				err = -EIO;
+				free(sys);
+				goto out;
+			}
 		}
 		free(sys);
 	}
@@ -343,29 +382,30 @@ out:
 	return err;
 }
 
-static void read_proc_kallsyms(void)
+static int read_proc_kallsyms(void)
 {
 	unsigned int size;
 	const char *path = "/proc/kallsyms";
 	struct stat st;
-	int ret;
+	int ret, err = 0;
 
 	ret = stat(path, &st);
 	if (ret < 0) {
 		/* not found */
 		size = 0;
-		write_or_die(&size, 4);
-		return;
+		if (write(output_fd, &size, 4) != 4)
+			err = -EIO;
+		return err;
 	}
-	record_file(path, 4);
+	return record_file(path, 4);
 }
 
-static void read_ftrace_printk(void)
+static int read_ftrace_printk(void)
 {
 	unsigned int size;
 	char *path;
 	struct stat st;
-	int ret;
+	int ret, err = 0;
 
 	path = get_tracing_file("printk_formats");
 	if (!path)
@@ -375,13 +415,15 @@ static void read_ftrace_printk(void)
 	if (ret < 0) {
 		/* not found */
 		size = 0;
-		write_or_die(&size, 4);
+		if (write(output_fd, &size, 4) != 4)
+			err = -EIO;
 		goto out;
 	}
-	record_file(path, 4);
+	err = record_file(path, 4);
 
 out:
 	put_tracing_file(path);
+	return err;
 }
 
 static struct tracepoint_path *
@@ -428,9 +470,10 @@ bool have_tracepoints(struct list_head *pattrs)
 	return false;
 }
 
-static void tracing_data_header(void)
+static int tracing_data_header(void)
 {
 	char buf[20];
+	ssize_t size;
 
 	/* just guessing this is someone's birthday.. ;) */
 	buf[0] = 23;
@@ -438,9 +481,12 @@ static void tracing_data_header(void)
 	buf[2] = 68;
 	memcpy(buf + 3, "tracing", 7);
 
-	write_or_die(buf, 10);
+	if (write(output_fd, buf, 10) != 10)
+		return -1;
 
-	write_or_die(VERSION, strlen(VERSION) + 1);
+	size = strlen(VERSION) + 1;
+	if (write(output_fd, VERSION, size) != size)
+		return -1;
 
 	/* save endian */
 	if (bigendian())
@@ -450,14 +496,19 @@ static void tracing_data_header(void)
 
 	read_trace_init(buf[0], buf[0]);
 
-	write_or_die(buf, 1);
+	if (write(output_fd, buf, 1) != 1)
+		return -1;
 
 	/* save size of long */
 	buf[0] = sizeof(long);
-	write_or_die(buf, 1);
+	if (write(output_fd, buf, 1) != 1)
+		return -1;
 
 	/* save page_size */
-	write_or_die(&page_size, 4);
+	if (write(output_fd, &page_size, 4) != 4)
+		return -1;
+
+	return 0;
 }
 
 struct tracing_data *tracing_data_get(struct list_head *pattrs,
@@ -465,6 +516,7 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 {
 	struct tracepoint_path *tps;
 	struct tracing_data *tdata;
+	int err1, err2, err3, err4, err5, err6;
 
 	output_fd = fd;
 
@@ -498,12 +550,12 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 		output_fd = temp_fd;
 	}
 
-	tracing_data_header();
-	read_header_files();
-	read_ftrace_files(tps);
-	read_event_files(tps);
-	read_proc_kallsyms();
-	read_ftrace_printk();
+	err1 = tracing_data_header();
+	err2 = read_header_files();
+	err3 = read_ftrace_files(tps);
+	err4 = read_event_files(tps);
+	err5 = read_proc_kallsyms();
+	err6 = read_ftrace_printk();
 
 	/*
 	 * All tracing data are stored by now, we can restore
@@ -515,22 +567,31 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 		output_fd = fd;
 	}
 
+	if (err1 + err2 + err3 + err4 + err5 + err6 < 0) {
+		free(tdata);
+		tdata = NULL;
+	}
+
 	put_tracepoints_path(tps);
 	return tdata;
 }
 
-void tracing_data_put(struct tracing_data *tdata)
+int tracing_data_put(struct tracing_data *tdata)
 {
+	int err = 0;
+
 	if (tdata->temp) {
-		record_file(tdata->temp_file, 0);
+		err = record_file(tdata->temp_file, 0);
 		unlink(tdata->temp_file);
 	}
 
 	free(tdata);
+	return err;
 }
 
 int read_tracing_data(int fd, struct list_head *pattrs)
 {
+	int err;
 	struct tracing_data *tdata;
 
 	/*
@@ -541,6 +602,6 @@ int read_tracing_data(int fd, struct list_head *pattrs)
 	if (!tdata)
 		return -ENOMEM;
 
-	tracing_data_put(tdata);
-	return 0;
+	err = tracing_data_put(tdata);
+	return err;
 }
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index 28ccde8ba20f..1978c398ad87 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -68,7 +68,7 @@ struct tracing_data {
 
 struct tracing_data *tracing_data_get(struct list_head *pattrs,
 				      int fd, bool temp);
-void tracing_data_put(struct tracing_data *tdata);
+int tracing_data_put(struct tracing_data *tdata);
 
 
 struct addr_location;
-- 
1.7.11.7


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

* [PATCH 4/9] perf util: Get rid of die() calls from trace-event-info.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (2 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19  8:53 ` [PATCH 5/9] perf util: Handle failure case in trace_report() Namhyung Kim
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Now remove all remaining die() calls and convert them to check return
value and propagate it.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-info.c | 114 +++++++++++++++++++++++--------------
 1 file changed, 72 insertions(+), 42 deletions(-)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 05cf94ef57e4..f006529d2284 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -43,7 +43,6 @@
 
 #define VERSION "0.5"
 
-static const char *output_file = "trace.info";
 static int output_fd;
 
 
@@ -125,8 +124,10 @@ static int record_file(const char *file, ssize_t hdr_sz)
 	int err = -EIO;
 
 	fd = open(file, O_RDONLY);
-	if (fd < 0)
-		die("Can't read '%s'", file);
+	if (fd < 0) {
+		pr_debug("Can't read '%s'", file);
+		return -errno;
+	}
 
 	/* put in zeros for file size, then fill true size later */
 	if (hdr_sz) {
@@ -148,8 +149,10 @@ static int record_file(const char *file, ssize_t hdr_sz)
 	if (bigendian())
 		sizep += sizeof(u64) - hdr_sz;
 
-	if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0)
-		die("writing to %s", output_file);
+	if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0) {
+		pr_debug("writing file size failed\n");
+		goto out;
+	}
 
 	err = 0;
 out:
@@ -164,11 +167,15 @@ static int read_header_files(void)
 	int err = -EIO;
 
 	path = get_tracing_file("events/header_page");
-	if (!path)
-		die("can't get tracing/events/header_page");
+	if (!path) {
+		pr_err("can't get tracing/events/header_page");
+		return -ENOMEM;
+	}
 
-	if (stat(path, &st) < 0)
-		die("can't read '%s'", path);
+	if (stat(path, &st) < 0) {
+		pr_err("can't read '%s'", path);
+		goto out;
+	}
 
 	if (write(output_fd, "header_page", 12) != 12) {
 		pr_err("can't write header_page\n");
@@ -183,11 +190,16 @@ static int read_header_files(void)
 	put_tracing_file(path);
 
 	path = get_tracing_file("events/header_event");
-	if (!path)
-		die("can't get tracing/events/header_event");
+	if (!path) {
+		pr_err("can't get tracing/events/header_event");
+		err = -ENOMEM;
+		goto out;
+	}
 
-	if (stat(path, &st) < 0)
-		die("can't read '%s'", path);
+	if (stat(path, &st) < 0) {
+		pr_err("can't read '%s'", path);
+		goto out;
+	}
 
 	if (write(output_fd, "header_event", 13) != 13) {
 		pr_err("can't write header_event\n");
@@ -227,8 +239,10 @@ static int copy_event_system(const char *sys, struct tracepoint_path *tps)
 	int err;
 
 	dir = opendir(sys);
-	if (!dir)
-		die("can't read directory '%s'", sys);
+	if (!dir) {
+		pr_err("can't read directory '%s'", sys);
+		return -errno;
+	}
 
 	while ((dent = readdir(dir))) {
 		if (dent->d_type != DT_DIR ||
@@ -291,8 +305,10 @@ static int read_ftrace_files(struct tracepoint_path *tps)
 	int ret;
 
 	path = get_tracing_file("events/ftrace");
-	if (!path)
-		die("can't get tracing/events/ftrace");
+	if (!path) {
+		pr_err("can't get tracing/events/ftrace");
+		return -ENOMEM;
+	}
 
 	ret = copy_event_system(path, tps);
 
@@ -324,12 +340,17 @@ static int read_event_files(struct tracepoint_path *tps)
 	int err;
 
 	path = get_tracing_file("events");
-	if (!path)
-		die("can't get tracing/events");
+	if (!path) {
+		pr_err("can't get tracing/events");
+		return -ENOMEM;
+	}
 
 	dir = opendir(path);
-	if (!dir)
-		die("can't read directory '%s'", path);
+	if (!dir) {
+		err = -errno;
+		pr_err("can't read directory '%s'", path);
+		goto out;
+	}
 
 	while ((dent = readdir(dir))) {
 		if (dent->d_type != DT_DIR ||
@@ -408,8 +429,10 @@ static int read_ftrace_printk(void)
 	int ret, err = 0;
 
 	path = get_tracing_file("printk_formats");
-	if (!path)
-		die("can't get tracing/printk_formats");
+	if (!path) {
+		pr_err("can't get tracing/printk_formats");
+		return -ENOMEM;
+	}
 
 	ret = stat(path, &st);
 	if (ret < 0) {
@@ -426,6 +449,19 @@ out:
 	return err;
 }
 
+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);
+	}
+}
+
 static struct tracepoint_path *
 get_tracepoints_path(struct list_head *pattrs)
 {
@@ -438,27 +474,17 @@ get_tracepoints_path(struct list_head *pattrs)
 			continue;
 		++nr_tracepoints;
 		ppath->next = tracepoint_id_to_path(pos->attr.config);
-		if (!ppath->next)
-			die("%s\n", "No memory to alloc tracepoints list");
+		if (!ppath->next) {
+			pr_err("No memory to alloc tracepoints list\n");
+			put_tracepoints_path(&path);
+			return NULL;
+		}
 		ppath = ppath->next;
 	}
 
 	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;
@@ -536,12 +562,16 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
 
 		snprintf(tdata->temp_file, sizeof(tdata->temp_file),
 			 "/tmp/perf-XXXXXX");
-		if (!mkstemp(tdata->temp_file))
-			die("Can't make temp file");
+		if (!mkstemp(tdata->temp_file)) {
+			pr_err("Can't make temp file");
+			return NULL;
+		}
 
 		temp_fd = open(tdata->temp_file, O_RDWR);
-		if (temp_fd < 0)
-			die("Can't read '%s'", tdata->temp_file);
+		if (temp_fd < 0) {
+			pr_err("Can't read '%s'", tdata->temp_file);
+			return NULL;
+		}
 
 		/*
 		 * Set the temp file the default output, so all the
-- 
1.7.11.7


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

* [PATCH 5/9] perf util: Handle failure case in trace_report()
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (3 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 4/9] perf util: Get rid of die() calls " Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 14:47   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c Namhyung Kim
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

If pevent allocation in read_trace_init() fails, trace_report() will
return -1 and *ppevent is set to NULL.  Its callers should check this
case and handle it properly.

This is also a preparation for the removal of *die() calls.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/header.c           | 11 +++++++---
 tools/perf/util/trace-event-read.c | 41 ++++++++++++++++++++++----------------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index a9b7349f7c5f..f2c33c4cfc38 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1672,8 +1672,8 @@ static int process_tracing_data(struct perf_file_section *section __maybe_unused
 				struct perf_header *ph __maybe_unused,
 				int fd, void *data)
 {
-	trace_report(fd, data, false);
-	return 0;
+	ssize_t ret = trace_report(fd, data, false);
+	return ret < 0 ? -1 : 0;
 }
 
 static int process_build_id(struct perf_file_section *section,
@@ -2752,6 +2752,11 @@ static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel,
 	if (evsel->tp_format)
 		return 0;
 
+	if (pevent == NULL) {
+		pr_debug("broken or missing trace data\n");
+		return -1;
+	}
+
 	event = pevent_find_event(pevent, evsel->attr.config);
 	if (event == NULL)
 		return -1;
@@ -3100,7 +3105,7 @@ int perf_event__process_tracing_data(union perf_event *event,
 		}
 	}
 
-	if (size_read + padding != size) {
+	if (size_read + padding != size || session->pevent == NULL) {
 		pr_err("%s: tracing data size mismatch", __func__);
 		return -1;
 	}
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 7cb24635adf2..129362b97ca5 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -293,7 +293,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 	int show_version = 0;
 	int show_funcs = 0;
 	int show_printk = 0;
-	ssize_t size;
+	ssize_t size = -1;
+	struct pevent *pevent;
+
+	*ppevent = NULL;
 
 	calc_data_size = 1;
 	repipe = __repipe;
@@ -317,34 +320,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 	file_bigendian = buf[0];
 	host_bigendian = bigendian();
 
-	*ppevent = read_trace_init(file_bigendian, host_bigendian);
-	if (*ppevent == NULL)
-		die("read_trace_init failed");
+	pevent = read_trace_init(file_bigendian, host_bigendian);
+	if (pevent == NULL) {
+		pr_err("read_trace_init failed");
+		goto out;
+	}
 
 	read_or_die(buf, 1);
 	long_size = buf[0];
 
-	page_size = read4(*ppevent);
-
-	read_header_files(*ppevent);
+	page_size = read4(pevent);
 
-	read_ftrace_files(*ppevent);
-	read_event_files(*ppevent);
-	read_proc_kallsyms(*ppevent);
-	read_ftrace_printk(*ppevent);
+	read_header_files(pevent);
+	read_ftrace_files(pevent);
+	read_event_files(pevent);
+	read_proc_kallsyms(pevent);
+	read_ftrace_printk(pevent);
 
 	size = calc_data_size - 1;
 	calc_data_size = 0;
 	repipe = false;
 
 	if (show_funcs) {
-		pevent_print_funcs(*ppevent);
-		return size;
-	}
-	if (show_printk) {
-		pevent_print_printk(*ppevent);
-		return size;
+		pevent_print_funcs(pevent);
+	} else if (show_printk) {
+		pevent_print_printk(pevent);
 	}
 
+	*ppevent = pevent;
+	pevent = NULL;
+
+out:
+	if (pevent)
+		pevent_free(pevent);
 	return size;
 }
-- 
1.7.11.7


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

* [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (4 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 5/9] perf util: Handle failure case in trace_report() Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 14:50   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 7/9] perf util: Get rid of read_or_die() " Namhyung Kim
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Check return value of malloc() and fail if error.  Now read_string()
can return NULL also check its return value and bail out.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-read.c | 90 ++++++++++++++++++++++++--------------
 1 file changed, 57 insertions(+), 33 deletions(-)

diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 129362b97ca5..62dd2168f4f5 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -48,16 +48,6 @@ static int long_size;
 static ssize_t calc_data_size;
 static bool repipe;
 
-static void *malloc_or_die(int size)
-{
-	void *ret;
-
-	ret = malloc(size);
-	if (!ret)
-		die("malloc");
-	return ret;
-}
-
 static int do_read(int fd, void *buf, int size)
 {
 	int rsize = size;
@@ -158,48 +148,57 @@ static char *read_string(void)
 	if (calc_data_size)
 		calc_data_size += size;
 
-	str = malloc_or_die(size);
-	memcpy(str, buf, size);
+	str = malloc(size);
+	if (str)
+		memcpy(str, buf, size);
 
 	return str;
 }
 
-static void read_proc_kallsyms(struct pevent *pevent)
+static int read_proc_kallsyms(struct pevent *pevent)
 {
 	unsigned int size;
 	char *buf;
 
 	size = read4(pevent);
 	if (!size)
-		return;
+		return 0;
+
+	buf = malloc(size + 1);
+	if (buf == NULL)
+		return -1;
 
-	buf = malloc_or_die(size + 1);
 	read_or_die(buf, size);
 	buf[size] = '\0';
 
 	parse_proc_kallsyms(pevent, buf, size);
 
 	free(buf);
+	return 0;
 }
 
-static void read_ftrace_printk(struct pevent *pevent)
+static int read_ftrace_printk(struct pevent *pevent)
 {
 	unsigned int size;
 	char *buf;
 
 	size = read4(pevent);
 	if (!size)
-		return;
+		return 0;
+
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
 
-	buf = malloc_or_die(size);
 	read_or_die(buf, size);
 
 	parse_ftrace_printk(pevent, buf, size);
 
 	free(buf);
+	return 0;
 }
 
-static void read_header_files(struct pevent *pevent)
+static int read_header_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	char *header_event;
@@ -224,65 +223,87 @@ static void read_header_files(struct pevent *pevent)
 		die("did not read header event");
 
 	size = read8(pevent);
-	header_event = malloc_or_die(size);
+	header_event = malloc(size);
+	if (header_event == NULL)
+		return -1;
+
 	read_or_die(header_event, size);
 	free(header_event);
+	return 0;
 }
 
-static void read_ftrace_file(struct pevent *pevent, unsigned long long size)
+static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
 {
 	char *buf;
 
-	buf = malloc_or_die(size);
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
+
 	read_or_die(buf, size);
 	parse_ftrace_file(pevent, buf, size);
 	free(buf);
+	return 0;
 }
 
-static void read_event_file(struct pevent *pevent, char *sys,
+static int read_event_file(struct pevent *pevent, char *sys,
 			    unsigned long long size)
 {
 	char *buf;
 
-	buf = malloc_or_die(size);
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
+
 	read_or_die(buf, size);
 	parse_event_file(pevent, buf, size, sys);
 	free(buf);
+	return 0;
 }
 
-static void read_ftrace_files(struct pevent *pevent)
+static int read_ftrace_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	int count;
 	int i;
+	int ret;
 
 	count = read4(pevent);
 
 	for (i = 0; i < count; i++) {
 		size = read8(pevent);
-		read_ftrace_file(pevent, size);
+		ret = read_ftrace_file(pevent, size);
+		if (ret)
+			return ret;
 	}
+	return 0;
 }
 
-static void read_event_files(struct pevent *pevent)
+static int read_event_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	char *sys;
 	int systems;
 	int count;
 	int i,x;
+	int ret;
 
 	systems = read4(pevent);
 
 	for (i = 0; i < systems; i++) {
 		sys = read_string();
+		if (sys == NULL)
+			return -1;
 
 		count = read4(pevent);
 		for (x=0; x < count; x++) {
 			size = read8(pevent);
-			read_event_file(pevent, sys, size);
+			ret = read_event_file(pevent, sys, size);
+			if (ret)
+				return ret;
 		}
 	}
+	return 0;
 }
 
 ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
@@ -312,6 +333,8 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 		die("not a trace file (missing 'tracing' tag)");
 
 	version = read_string();
+	if (version == NULL)
+		return -1;
 	if (show_version)
 		printf("version = %s\n", version);
 	free(version);
@@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 
 	page_size = read4(pevent);
 
-	read_header_files(pevent);
-	read_ftrace_files(pevent);
-	read_event_files(pevent);
-	read_proc_kallsyms(pevent);
-	read_ftrace_printk(pevent);
+	if (read_header_files(pevent) ||
+	    read_ftrace_files(pevent) ||
+	    read_event_files(pevent) ||
+	    read_proc_kallsyms(pevent) ||
+	    read_ftrace_printk(pevent))
+		goto out;
 
 	size = calc_data_size - 1;
 	calc_data_size = 0;
-- 
1.7.11.7


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

* [PATCH 7/9] perf util: Get rid of read_or_die() in trace-event-read.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (5 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 14:54   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c Namhyung Kim
  2013-03-19  8:53 ` [PATCH 9/9] perf util: Cleanup calc_data_size logic Namhyung Kim
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Rename it to do_read and original do_read to __do_read, and check
their return value.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-read.c | 80 +++++++++++++++++++++++++++-----------
 1 file changed, 57 insertions(+), 23 deletions(-)

diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 62dd2168f4f5..87f0ccd54cdc 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -48,7 +48,7 @@ static int long_size;
 static ssize_t calc_data_size;
 static bool repipe;
 
-static int do_read(int fd, void *buf, int size)
+static int __do_read(int fd, void *buf, int size)
 {
 	int rsize = size;
 
@@ -61,8 +61,10 @@ static int do_read(int fd, void *buf, int size)
 		if (repipe) {
 			int retw = write(STDOUT_FILENO, buf, ret);
 
-			if (retw <= 0 || retw != ret)
-				die("repiping input file");
+			if (retw <= 0 || retw != ret) {
+				pr_debug("repiping input file");
+				return -1;
+			}
 		}
 
 		size -= ret;
@@ -72,14 +74,16 @@ static int do_read(int fd, void *buf, int size)
 	return rsize;
 }
 
-static int read_or_die(void *data, int size)
+static int do_read(void *data, int size)
 {
 	int r;
 
-	r = do_read(input_fd, data, size);
-	if (r <= 0)
-		die("reading input file (size expected=%d received=%d)",
-		    size, r);
+	r = __do_read(input_fd, data, size);
+	if (r <= 0) {
+		pr_debug("reading input file (size expected=%d received=%d)",
+			 size, r);
+		return -1;
+	}
 
 	if (calc_data_size)
 		calc_data_size += r;
@@ -95,7 +99,7 @@ static void skip(int size)
 
 	while (size) {
 		r = size > BUFSIZ ? BUFSIZ : size;
-		read_or_die(buf, r);
+		do_read(buf, r);
 		size -= r;
 	};
 }
@@ -104,7 +108,8 @@ static unsigned int read4(struct pevent *pevent)
 {
 	unsigned int data;
 
-	read_or_die(&data, 4);
+	if (do_read(&data, 4) < 0)
+		return 0;
 	return __data2host4(pevent, data);
 }
 
@@ -112,7 +117,8 @@ static unsigned long long read8(struct pevent *pevent)
 {
 	unsigned long long data;
 
-	read_or_die(&data, 8);
+	if (do_read(&data, 8) < 0)
+		return 0;
 	return __data2host8(pevent, data);
 }
 
@@ -168,7 +174,10 @@ static int read_proc_kallsyms(struct pevent *pevent)
 	if (buf == NULL)
 		return -1;
 
-	read_or_die(buf, size);
+	if (do_read(buf, size) < 0) {
+		free(buf);
+		return -1;
+	}
 	buf[size] = '\0';
 
 	parse_proc_kallsyms(pevent, buf, size);
@@ -182,6 +191,7 @@ static int read_ftrace_printk(struct pevent *pevent)
 	unsigned int size;
 	char *buf;
 
+	/* it can have 0 size */
 	size = read4(pevent);
 	if (!size)
 		return 0;
@@ -190,7 +200,10 @@ static int read_ftrace_printk(struct pevent *pevent)
 	if (buf == NULL)
 		return -1;
 
-	read_or_die(buf, size);
+	if (do_read(buf, size) < 0) {
+		free(buf);
+		return -1;
+	}
 
 	parse_ftrace_printk(pevent, buf, size);
 
@@ -203,8 +216,10 @@ static int read_header_files(struct pevent *pevent)
 	unsigned long long size;
 	char *header_event;
 	char buf[BUFSIZ];
+	int ret = 0;
 
-	read_or_die(buf, 12);
+	if (do_read(buf, 12) < 0)
+		return -1;
 
 	if (memcmp(buf, "header_page", 12) != 0)
 		die("did not read header page");
@@ -218,7 +233,9 @@ static int read_header_files(struct pevent *pevent)
 	 */
 	long_size = header_page_size_size;
 
-	read_or_die(buf, 13);
+	if (do_read(buf, 13) < 0)
+		return -1;
+
 	if (memcmp(buf, "header_event", 13) != 0)
 		die("did not read header event");
 
@@ -227,9 +244,11 @@ static int read_header_files(struct pevent *pevent)
 	if (header_event == NULL)
 		return -1;
 
-	read_or_die(header_event, size);
+	if (do_read(header_event, size) < 0)
+		ret = -1;
+
 	free(header_event);
-	return 0;
+	return ret;
 }
 
 static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
@@ -240,7 +259,11 @@ static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
 	if (buf == NULL)
 		return -1;
 
-	read_or_die(buf, size);
+	if (do_read(buf, size) < 0) {
+		free(buf);
+		return -1;
+	}
+
 	parse_ftrace_file(pevent, buf, size);
 	free(buf);
 	return 0;
@@ -255,7 +278,11 @@ static int read_event_file(struct pevent *pevent, char *sys,
 	if (buf == NULL)
 		return -1;
 
-	read_or_die(buf, size);
+	if (do_read(buf, size) < 0) {
+		free(buf);
+		return -1;
+	}
+
 	parse_event_file(pevent, buf, size, sys);
 	free(buf);
 	return 0;
@@ -296,6 +323,7 @@ static int read_event_files(struct pevent *pevent)
 			return -1;
 
 		count = read4(pevent);
+
 		for (x=0; x < count; x++) {
 			size = read8(pevent);
 			ret = read_event_file(pevent, sys, size);
@@ -324,11 +352,13 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 
 	input_fd = fd;
 
-	read_or_die(buf, 3);
+	if (do_read(buf, 3) < 0)
+		return -1;
 	if (memcmp(buf, test, 3) != 0)
 		die("no trace data in the file");
 
-	read_or_die(buf, 7);
+	if (do_read(buf, 7) < 0)
+		return -1;
 	if (memcmp(buf, "tracing", 7) != 0)
 		die("not a trace file (missing 'tracing' tag)");
 
@@ -339,7 +369,8 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 		printf("version = %s\n", version);
 	free(version);
 
-	read_or_die(buf, 1);
+	if (do_read(buf, 1) < 0)
+		return -1;
 	file_bigendian = buf[0];
 	host_bigendian = bigendian();
 
@@ -349,10 +380,13 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 		goto out;
 	}
 
-	read_or_die(buf, 1);
+	if (do_read(buf, 1) < 0)
+		goto out;
 	long_size = buf[0];
 
 	page_size = read4(pevent);
+	if (!page_size)
+		goto out;
 
 	if (read_header_files(pevent) ||
 	    read_ftrace_files(pevent) ||
-- 
1.7.11.7


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

* [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (6 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 7/9] perf util: Get rid of read_or_die() " Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  2013-03-19 14:55   ` Steven Rostedt
  2013-03-19  8:53 ` [PATCH 9/9] perf util: Cleanup calc_data_size logic Namhyung Kim
  8 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Convert them to pr_debug() and propagate error code.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-read.c | 44 +++++++++++++++++++++++++-------------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 87f0ccd54cdc..7ce901643205 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -132,17 +132,23 @@ static char *read_string(void)
 
 	for (;;) {
 		r = read(input_fd, &c, 1);
-		if (r < 0)
-			die("reading input file");
+		if (r < 0) {
+			pr_debug("reading input file");
+			goto out;
+		}
 
-		if (!r)
-			die("no data");
+		if (!r) {
+			pr_debug("no data");
+			goto out;
+		}
 
 		if (repipe) {
 			int retw = write(STDOUT_FILENO, &c, 1);
 
-			if (retw <= 0 || retw != r)
-				die("repiping input file string");
+			if (retw <= 0 || retw != r) {
+				pr_debug("repiping input file string");
+				goto out;
+			}
 		}
 
 		buf[size++] = c;
@@ -157,7 +163,7 @@ static char *read_string(void)
 	str = malloc(size);
 	if (str)
 		memcpy(str, buf, size);
-
+out:
 	return str;
 }
 
@@ -221,8 +227,10 @@ static int read_header_files(struct pevent *pevent)
 	if (do_read(buf, 12) < 0)
 		return -1;
 
-	if (memcmp(buf, "header_page", 12) != 0)
-		die("did not read header page");
+	if (memcmp(buf, "header_page", 12) != 0) {
+		pr_debug("did not read header page");
+		return -1;
+	}
 
 	size = read8(pevent);
 	skip(size);
@@ -236,8 +244,10 @@ static int read_header_files(struct pevent *pevent)
 	if (do_read(buf, 13) < 0)
 		return -1;
 
-	if (memcmp(buf, "header_event", 13) != 0)
-		die("did not read header event");
+	if (memcmp(buf, "header_event", 13) != 0) {
+		pr_debug("did not read header event");
+		return -1;
+	}
 
 	size = read8(pevent);
 	header_event = malloc(size);
@@ -354,13 +364,17 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 
 	if (do_read(buf, 3) < 0)
 		return -1;
-	if (memcmp(buf, test, 3) != 0)
-		die("no trace data in the file");
+	if (memcmp(buf, test, 3) != 0) {
+		pr_debug("no trace data in the file");
+		return -1;
+	}
 
 	if (do_read(buf, 7) < 0)
 		return -1;
-	if (memcmp(buf, "tracing", 7) != 0)
-		die("not a trace file (missing 'tracing' tag)");
+	if (memcmp(buf, "tracing", 7) != 0) {
+		pr_debug("not a trace file (missing 'tracing' tag)");
+		return -1;
+	}
 
 	version = read_string();
 	if (version == NULL)
-- 
1.7.11.7


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

* [PATCH 9/9] perf util: Cleanup calc_data_size logic
  2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
                   ` (7 preceding siblings ...)
  2013-03-19  8:53 ` [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c Namhyung Kim
@ 2013-03-19  8:53 ` Namhyung Kim
  8 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-19  8:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

It's for calculating whole trace data size during reading.  However
relation functions are called only in this file, no need to
conditionalize it with tricky +1 offset and rename the variable to
more meaningful name like trace_data_size.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-read.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 7ce901643205..6b0a2c2a4091 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -45,7 +45,7 @@ int file_bigendian;
 int host_bigendian;
 static int long_size;
 
-static ssize_t calc_data_size;
+static ssize_t trace_data_size;
 static bool repipe;
 
 static int __do_read(int fd, void *buf, int size)
@@ -85,8 +85,7 @@ static int do_read(void *data, int size)
 		return -1;
 	}
 
-	if (calc_data_size)
-		calc_data_size += r;
+	trace_data_size += r;
 
 	return r;
 }
@@ -157,8 +156,7 @@ static char *read_string(void)
 			break;
 	}
 
-	if (calc_data_size)
-		calc_data_size += size;
+	trace_data_size += size;
 
 	str = malloc(size);
 	if (str)
@@ -357,9 +355,7 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 
 	*ppevent = NULL;
 
-	calc_data_size = 1;
 	repipe = __repipe;
-
 	input_fd = fd;
 
 	if (do_read(buf, 3) < 0)
@@ -409,8 +405,7 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 	    read_ftrace_printk(pevent))
 		goto out;
 
-	size = calc_data_size - 1;
-	calc_data_size = 0;
+	size = trace_data_size;
 	repipe = false;
 
 	if (show_funcs) {
-- 
1.7.11.7


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

* Re: [PATCH 1/9] perf util: Let get_tracing_file() can return NULL
  2013-03-19  8:53 ` [PATCH 1/9] perf util: Let get_tracing_file() can return NULL Namhyung Kim
@ 2013-03-19 13:54   ` Steven Rostedt
  2013-03-20  0:53     ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 13:54 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> From: Namhyung Kim <namhyung.kim@lge.com>
> 
> So that it can be used by other places.
> 
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/util/trace-event-info.c | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
> index 5729f434c5b1..f241343b7d48 100644
> --- a/tools/perf/util/trace-event-info.c
> +++ b/tools/perf/util/trace-event-info.c
> @@ -62,7 +62,7 @@ static const char *find_debugfs(void)
>  	const char *path = perf_debugfs_mount(NULL);
>  
>  	if (!path)
> -		die("Your kernel not support debugfs filesystem");
> +		pr_err("Your kernel not support debugfs filesystem");

"Your kernel does not support the debugfs filesystem"

I know you just did a s/die/pr_err/ but might as well fix the grammar
too ;-)

>  
>  	return path;
>  }
> @@ -81,8 +81,12 @@ static const char *find_tracing_dir(void)
>  		return tracing;
>  
>  	debugfs = find_debugfs();
> +	if (!debugfs)
> +		return NULL;
>  
> -	tracing = malloc_or_die(strlen(debugfs) + 9);
> +	tracing = malloc(strlen(debugfs) + 9);
> +	if (!tracing)
> +		return NULL;
>  
>  	sprintf(tracing, "%s/tracing", debugfs);
>  
> @@ -99,7 +103,9 @@ static char *get_tracing_file(const char *name)
>  	if (!tracing)
>  		return NULL;
>  
> -	file = malloc_or_die(strlen(tracing) + strlen(name) + 2);
> +	file = malloc(strlen(tracing) + strlen(name) + 2);
> +	if (!file)
> +		return NULL;

Should have clean up as well. That is, if file fails, we need to free
tracing. Otherwise there's a memory leak.

>  
>  	sprintf(file, "%s/%s", tracing, name);
>  	return file;
> @@ -170,6 +176,9 @@ static void read_header_files(void)
>  	struct stat st;
>  
>  	path = get_tracing_file("events/header_page");
> +	if (!path)
> +		die("can't get tracing/events/header_page");
> +
>  	if (stat(path, &st) < 0)
>  		die("can't read '%s'", path);
>  
> @@ -178,6 +187,9 @@ static void read_header_files(void)
>  	put_tracing_file(path);
>  
>  	path = get_tracing_file("events/header_event");
> +	if (!path)
> +		die("can't get tracing/events/header_event");
> +
>  	if (stat(path, &st) < 0)
>  		die("can't read '%s'", path);
>  
> @@ -251,6 +263,8 @@ static void read_ftrace_files(struct tracepoint_path *tps)
>  	char *path;
>  
>  	path = get_tracing_file("events/ftrace");
> +	if (!path)
> +		die("can't get tracing/events/ftrace");
>  
>  	copy_event_system(path, tps);
>  
> @@ -279,6 +293,8 @@ static void read_event_files(struct tracepoint_path *tps)
>  	int ret;
>  
>  	path = get_tracing_file("events");
> +	if (!path)
> +		die("can't get tracing/events");
>  
>  	dir = opendir(path);
>  	if (!dir)
> @@ -343,6 +359,9 @@ static void read_ftrace_printk(void)
>  	int ret;
>  
>  	path = get_tracing_file("printk_formats");
> +	if (!path)
> +		die("can't get tracing/printk_formats");
> +

OK, so we are just moving die to the caller? I'm fine with that. If we
can get the utilities to remove die, that's a big step.

-- Steve

>  	ret = stat(path, &st);
>  	if (ret < 0) {
>  		/* not found */



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

* Re: [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19  8:53 ` [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c Namhyung Kim
@ 2013-03-19 14:35   ` Steven Rostedt
  2013-03-19 14:49     ` Peter Zijlstra
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:35 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:

>  struct tracing_data *tracing_data_get(struct list_head *pattrs,
> @@ -465,6 +516,7 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
>  {
>  	struct tracepoint_path *tps;
>  	struct tracing_data *tdata;
> +	int err1, err2, err3, err4, err5, err6;
>  
>  	output_fd = fd;
>  
> @@ -498,12 +550,12 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
>  		output_fd = temp_fd;
>  	}
>  
> -	tracing_data_header();
> -	read_header_files();
> -	read_ftrace_files(tps);
> -	read_event_files(tps);
> -	read_proc_kallsyms();
> -	read_ftrace_printk();
> +	err1 = tracing_data_header();
> +	err2 = read_header_files();
> +	err3 = read_ftrace_files(tps);
> +	err4 = read_event_files(tps);
> +	err5 = read_proc_kallsyms();
> +	err6 = read_ftrace_printk();

ugly ugly ugly

What about:
	int err = 0;

	err += tracing_data_header();
	err += read_header_files();
	[...]

	if (err < 0) {
		free(tdata);
		tdata = NULL;
	}

Also, is the only clean up needed be freeing tdata?

-- Steve


>  
>  	/*
>  	 * All tracing data are stored by now, we can restore
> @@ -515,22 +567,31 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
>  		output_fd = fd;
>  	}
>  
> +	if (err1 + err2 + err3 + err4 + err5 + err6 < 0) {
> +		free(tdata);
> +		tdata = NULL;
> +	}
> +
>  	put_tracepoints_path(tps);
>  	return tdata;
>  }
>  



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

* Re: [PATCH 5/9] perf util: Handle failure case in trace_report()
  2013-03-19  8:53 ` [PATCH 5/9] perf util: Handle failure case in trace_report() Namhyung Kim
@ 2013-03-19 14:47   ` Steven Rostedt
  2013-03-20  1:12     ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:47 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:

> @@ -3100,7 +3105,7 @@ int perf_event__process_tracing_data(union perf_event *event,
>  		}
>  	}
>  
> -	if (size_read + padding != size) {
> +	if (size_read + padding != size || session->pevent == NULL) {
>  		pr_err("%s: tracing data size mismatch", __func__);

This is a strange error to give when pevent is NULL. Could have been a
malloc failure.


>  		return -1;
>  	}
> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> index 7cb24635adf2..129362b97ca5 100644
> --- a/tools/perf/util/trace-event-read.c
> +++ b/tools/perf/util/trace-event-read.c
> @@ -293,7 +293,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>  	int show_version = 0;
>  	int show_funcs = 0;
>  	int show_printk = 0;
> -	ssize_t size;
> +	ssize_t size = -1;
> +	struct pevent *pevent;
> +
> +	*ppevent = NULL;
>  
>  	calc_data_size = 1;
>  	repipe = __repipe;
> @@ -317,34 +320,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>  	file_bigendian = buf[0];
>  	host_bigendian = bigendian();
>  
> -	*ppevent = read_trace_init(file_bigendian, host_bigendian);
> -	if (*ppevent == NULL)
> -		die("read_trace_init failed");
> +	pevent = read_trace_init(file_bigendian, host_bigendian);
> +	if (pevent == NULL) {

Shouldn't we still set *ppevent to NULL? Or will the user now need to
make sure that its pevent is NULL and always check for error?

-- Steve


> +		pr_err("read_trace_init failed");
> +		goto out;
> +	}
>  
>  	read_or_die(buf, 1);
>  	long_size = buf[0];
>  
> -	page_size = read4(*ppevent);
> -
> -	read_header_files(*ppevent);
> +	page_size = read4(pevent);
>  
> -	read_ftrace_files(*ppevent);
> -	read_event_files(*ppevent);
> -	read_proc_kallsyms(*ppevent);
> -	read_ftrace_printk(*ppevent);
> +	read_header_files(pevent);
> +	read_ftrace_files(pevent);
> +	read_event_files(pevent);
> +	read_proc_kallsyms(pevent);
> +	read_ftrace_printk(pevent);
>  
>  	size = calc_data_size - 1;
>  	calc_data_size = 0;
>  	repipe = false;
>  
>  	if (show_funcs) {
> -		pevent_print_funcs(*ppevent);
> -		return size;
> -	}
> -	if (show_printk) {
> -		pevent_print_printk(*ppevent);
> -		return size;
> +		pevent_print_funcs(pevent);
> +	} else if (show_printk) {
> +		pevent_print_printk(pevent);
>  	}
>  
> +	*ppevent = pevent;
> +	pevent = NULL;
> +
> +out:
> +	if (pevent)
> +		pevent_free(pevent);
>  	return size;
>  }



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

* Re: [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19 14:35   ` Steven Rostedt
@ 2013-03-19 14:49     ` Peter Zijlstra
  2013-03-19 14:59       ` Steven Rostedt
  0 siblings, 1 reply; 33+ messages in thread
From: Peter Zijlstra @ 2013-03-19 14:49 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Namhyung Kim, Arnaldo Carvalho de Melo, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 10:35 -0400, Steven Rostedt wrote:
> What about:
>         int err = 0;
> 
>         err += tracing_data_header();
>         err += read_header_files();
>         [...]
> 
>         if (err < 0) {
>                 free(tdata);
>                 tdata = NULL;
>         }
> 
> Also, is the only clean up needed be freeing tdata?

I always use err |= foo() and if (err) but I suppose it doesn't matter
the original error codes are lost both ways which doesn't seem to be a
problem here.


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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-19  8:53 ` [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c Namhyung Kim
@ 2013-03-19 14:50   ` Steven Rostedt
  2013-03-20  1:14     ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:50 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>  	free(version);
> @@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>  
>  	page_size = read4(pevent);
>  
> -	read_header_files(pevent);
> -	read_ftrace_files(pevent);
> -	read_event_files(pevent);
> -	read_proc_kallsyms(pevent);
> -	read_ftrace_printk(pevent);
> +	if (read_header_files(pevent) ||
> +	    read_ftrace_files(pevent) ||
> +	    read_event_files(pevent) ||
> +	    read_proc_kallsyms(pevent) ||
> +	    read_ftrace_printk(pevent))
> +		goto out;

I think I like the err += func() and check for err < 0, better.

-- Steve

>  
>  	size = calc_data_size - 1;
>  	calc_data_size = 0;



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

* Re: [PATCH 7/9] perf util: Get rid of read_or_die() in trace-event-read.c
  2013-03-19  8:53 ` [PATCH 7/9] perf util: Get rid of read_or_die() " Namhyung Kim
@ 2013-03-19 14:54   ` Steven Rostedt
  2013-03-20  1:24     ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:54 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> From: Namhyung Kim <namhyung.kim@lge.com>
> 
> Rename it to do_read and original do_read to __do_read, and check
> their return value.
> 
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/util/trace-event-read.c | 80 +++++++++++++++++++++++++++-----------
>  1 file changed, 57 insertions(+), 23 deletions(-)
> 
> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
> index 62dd2168f4f5..87f0ccd54cdc 100644
> --- a/tools/perf/util/trace-event-read.c
> +++ b/tools/perf/util/trace-event-read.c
> @@ -48,7 +48,7 @@ static int long_size;
>  static ssize_t calc_data_size;
>  static bool repipe;
>  
> -static int do_read(int fd, void *buf, int size)
> +static int __do_read(int fd, void *buf, int size)
>  {
>  	int rsize = size;
>  
> @@ -61,8 +61,10 @@ static int do_read(int fd, void *buf, int size)
>  		if (repipe) {
>  			int retw = write(STDOUT_FILENO, buf, ret);
>  
> -			if (retw <= 0 || retw != ret)
> -				die("repiping input file");
> +			if (retw <= 0 || retw != ret) {
> +				pr_debug("repiping input file");

Again, why debug and not err?

> +				return -1;
> +			}
>  		}
>  
>  		size -= ret;
> @@ -72,14 +74,16 @@ static int do_read(int fd, void *buf, int size)
>  	return rsize;
>  }
>  
> -static int read_or_die(void *data, int size)
> +static int do_read(void *data, int size)
>  {
>  	int r;
>  
> -	r = do_read(input_fd, data, size);
> -	if (r <= 0)
> -		die("reading input file (size expected=%d received=%d)",
> -		    size, r);
> +	r = __do_read(input_fd, data, size);
> +	if (r <= 0) {
> +		pr_debug("reading input file (size expected=%d received=%d)",
> +			 size, r);
> +		return -1;
> +	}
>  
>  	if (calc_data_size)
>  		calc_data_size += r;
> @@ -95,7 +99,7 @@ static void skip(int size)
>  
>  	while (size) {
>  		r = size > BUFSIZ ? BUFSIZ : size;
> -		read_or_die(buf, r);
> +		do_read(buf, r);

Shouldn't this check the result of do_read()?

>  		size -= r;
>  	};
>  }

-- Steve



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

* Re: [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c
  2013-03-19  8:53 ` [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c Namhyung Kim
@ 2013-03-19 14:55   ` Steven Rostedt
  2013-03-20  1:25     ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:55 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> From: Namhyung Kim <namhyung.kim@lge.com>
> 
> Convert them to pr_debug() and propagate error code.

Shouldn't they be pr_err(). I mean, if the old code would kill the
process, why just keep it as a debug output?

-- Steve

> 
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---



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

* Re: [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19 14:49     ` Peter Zijlstra
@ 2013-03-19 14:59       ` Steven Rostedt
  2013-03-19 15:04         ` Peter Zijlstra
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-19 14:59 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Namhyung Kim, Arnaldo Carvalho de Melo, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 15:49 +0100, Peter Zijlstra wrote:
> On Tue, 2013-03-19 at 10:35 -0400, Steven Rostedt wrote:
> > What about:
> >         int err = 0;
> > 
> >         err += tracing_data_header();
> >         err += read_header_files();
> >         [...]
> > 
> >         if (err < 0) {
> >                 free(tdata);
> >                 tdata = NULL;
> >         }
> > 
> > Also, is the only clean up needed be freeing tdata?
> 
> I always use err |= foo() and if (err) but I suppose it doesn't matter
> the original error codes are lost both ways which doesn't seem to be a
> problem here.

err |= foo() is fine too. Both are better that err1, err2, err3, ...,
errN :-)

-- Steve



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

* Re: [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19 14:59       ` Steven Rostedt
@ 2013-03-19 15:04         ` Peter Zijlstra
  2013-03-20  0:57           ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Peter Zijlstra @ 2013-03-19 15:04 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Namhyung Kim, Arnaldo Carvalho de Melo, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 2013-03-19 at 10:59 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 15:49 +0100, Peter Zijlstra wrote:
> > On Tue, 2013-03-19 at 10:35 -0400, Steven Rostedt wrote:
> > > What about:
> > >         int err = 0;
> > > 
> > >         err += tracing_data_header();
> > >         err += read_header_files();
> > >         [...]
> > > 
> > >         if (err < 0) {
> > >                 free(tdata);
> > >                 tdata = NULL;
> > >         }
> > > 
> > > Also, is the only clean up needed be freeing tdata?
> > 
> > I always use err |= foo() and if (err) but I suppose it doesn't matter
> > the original error codes are lost both ways which doesn't seem to be a
> > problem here.
> 
> err |= foo() is fine too. Both are better that err1, err2, err3, ...,
> errN :-)

<whinge>

The += thing has a problem where functions can return both positive and
negative values, you could get an accidental 0 (success) but coupled
with the proposed <0 test you get a much larger accident space :-)

And while totally hideous the err1..errN case preserves the actual
return codes if one would actually need those.

</whinge>

/me crawls back under his rock noaw :-)


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

* Re: [PATCH 1/9] perf util: Let get_tracing_file() can return NULL
  2013-03-19 13:54   ` Steven Rostedt
@ 2013-03-20  0:53     ` Namhyung Kim
  0 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  0:53 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

Hi Steve,

On Tue, 19 Mar 2013 09:54:21 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>> From: Namhyung Kim <namhyung.kim@lge.com>
>> 
>> So that it can be used by other places.
>> 
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Frederic Weisbecker <fweisbec@gmail.com>
>> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
>> ---
>>  tools/perf/util/trace-event-info.c | 25 ++++++++++++++++++++++---
>>  1 file changed, 22 insertions(+), 3 deletions(-)
>> 
>> diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
>> index 5729f434c5b1..f241343b7d48 100644
>> --- a/tools/perf/util/trace-event-info.c
>> +++ b/tools/perf/util/trace-event-info.c
>> @@ -62,7 +62,7 @@ static const char *find_debugfs(void)
>>  	const char *path = perf_debugfs_mount(NULL);
>>  
>>  	if (!path)
>> -		die("Your kernel not support debugfs filesystem");
>> +		pr_err("Your kernel not support debugfs filesystem");
>
> "Your kernel does not support the debugfs filesystem"
>
> I know you just did a s/die/pr_err/ but might as well fix the grammar
> too ;-)

Right, will do.

>
>>  
>>  	return path;
>>  }
>> @@ -81,8 +81,12 @@ static const char *find_tracing_dir(void)
>>  		return tracing;
>>  
>>  	debugfs = find_debugfs();
>> +	if (!debugfs)
>> +		return NULL;
>>  
>> -	tracing = malloc_or_die(strlen(debugfs) + 9);
>> +	tracing = malloc(strlen(debugfs) + 9);
>> +	if (!tracing)
>> +		return NULL;
>>  
>>  	sprintf(tracing, "%s/tracing", debugfs);
>>  
>> @@ -99,7 +103,9 @@ static char *get_tracing_file(const char *name)
>>  	if (!tracing)
>>  		return NULL;
>>  
>> -	file = malloc_or_die(strlen(tracing) + strlen(name) + 2);
>> +	file = malloc(strlen(tracing) + strlen(name) + 2);
>> +	if (!file)
>> +		return NULL;
>
> Should have clean up as well. That is, if file fails, we need to free
> tracing. Otherwise there's a memory leak.

Well, I'm not sure - there's a static pointer in the
find_tracing_dir().  If we free tracing here, we'll need to reset
tracing_found in the function also.  So I just kept it. :(

>
>>  
>>  	sprintf(file, "%s/%s", tracing, name);
>>  	return file;
>> @@ -170,6 +176,9 @@ static void read_header_files(void)
>>  	struct stat st;
>>  
>>  	path = get_tracing_file("events/header_page");
>> +	if (!path)
>> +		die("can't get tracing/events/header_page");
>> +
>>  	if (stat(path, &st) < 0)
>>  		die("can't read '%s'", path);
>>  
>> @@ -178,6 +187,9 @@ static void read_header_files(void)
>>  	put_tracing_file(path);
>>  
>>  	path = get_tracing_file("events/header_event");
>> +	if (!path)
>> +		die("can't get tracing/events/header_event");
>> +
>>  	if (stat(path, &st) < 0)
>>  		die("can't read '%s'", path);
>>  
>> @@ -251,6 +263,8 @@ static void read_ftrace_files(struct tracepoint_path *tps)
>>  	char *path;
>>  
>>  	path = get_tracing_file("events/ftrace");
>> +	if (!path)
>> +		die("can't get tracing/events/ftrace");
>>  
>>  	copy_event_system(path, tps);
>>  
>> @@ -279,6 +293,8 @@ static void read_event_files(struct tracepoint_path *tps)
>>  	int ret;
>>  
>>  	path = get_tracing_file("events");
>> +	if (!path)
>> +		die("can't get tracing/events");
>>  
>>  	dir = opendir(path);
>>  	if (!dir)
>> @@ -343,6 +359,9 @@ static void read_ftrace_printk(void)
>>  	int ret;
>>  
>>  	path = get_tracing_file("printk_formats");
>> +	if (!path)
>> +		die("can't get tracing/printk_formats");
>> +
>
> OK, so we are just moving die to the caller? I'm fine with that. If we
> can get the utilities to remove die, that's a big step.

They'll be removed on later patches, I moved them to callers since I
don't have proper error handling code at this time.

Thanks for review,
Namhyung

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

* Re: [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c
  2013-03-19 15:04         ` Peter Zijlstra
@ 2013-03-20  0:57           ` Namhyung Kim
  0 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  0:57 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 16:04:03 +0100, Peter Zijlstra wrote:
> On Tue, 2013-03-19 at 10:59 -0400, Steven Rostedt wrote:
>> On Tue, 2013-03-19 at 15:49 +0100, Peter Zijlstra wrote:
>> > On Tue, 2013-03-19 at 10:35 -0400, Steven Rostedt wrote:
>> > > What about:
>> > >         int err = 0;
>> > > 
>> > >         err += tracing_data_header();
>> > >         err += read_header_files();
>> > >         [...]
>> > > 
>> > >         if (err < 0) {
>> > >                 free(tdata);
>> > >                 tdata = NULL;
>> > >         }
>> > > 
>> > > Also, is the only clean up needed be freeing tdata?
>> > 
>> > I always use err |= foo() and if (err) but I suppose it doesn't matter
>> > the original error codes are lost both ways which doesn't seem to be a
>> > problem here.
>> 
>> err |= foo() is fine too. Both are better that err1, err2, err3, ...,
>> errN :-)
>
> <whinge>
>
> The += thing has a problem where functions can return both positive and
> negative values, you could get an accidental 0 (success) but coupled
> with the proposed <0 test you get a much larger accident space :-)
>
> And while totally hideous the err1..errN case preserves the actual
> return codes if one would actually need those.
>
> </whinge>
>
> /me crawls back under his rock noaw :-)

Sorry for the ugliness, forgot to update the code before sending ;-)

So I'll convert them to err |= foo() style as I don't care about the
actual return value at this time.

Thanks,
Namhyung

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

* Re: [PATCH 5/9] perf util: Handle failure case in trace_report()
  2013-03-19 14:47   ` Steven Rostedt
@ 2013-03-20  1:12     ` Namhyung Kim
  2013-03-20  1:54       ` Steven Rostedt
  0 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  1:12 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 10:47:53 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>
>> @@ -3100,7 +3105,7 @@ int perf_event__process_tracing_data(union perf_event *event,
>>  		}
>>  	}
>>  
>> -	if (size_read + padding != size) {
>> +	if (size_read + padding != size || session->pevent == NULL) {
>>  		pr_err("%s: tracing data size mismatch", __func__);
>
> This is a strange error to give when pevent is NULL. Could have been a
> malloc failure.

Hmm.. right.  I was just too lazy. ;)

Will break NULL check and print "failed to process tracing data" as we
set it to NULL if something broken.

>
>
>>  		return -1;
>>  	}
>> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
>> index 7cb24635adf2..129362b97ca5 100644
>> --- a/tools/perf/util/trace-event-read.c
>> +++ b/tools/perf/util/trace-event-read.c
>> @@ -293,7 +293,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>>  	int show_version = 0;
>>  	int show_funcs = 0;
>>  	int show_printk = 0;
>> -	ssize_t size;
>> +	ssize_t size = -1;
>> +	struct pevent *pevent;
>> +
>> +	*ppevent = NULL;
>>  
>>  	calc_data_size = 1;
>>  	repipe = __repipe;
>> @@ -317,34 +320,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>>  	file_bigendian = buf[0];
>>  	host_bigendian = bigendian();
>>  
>> -	*ppevent = read_trace_init(file_bigendian, host_bigendian);
>> -	if (*ppevent == NULL)
>> -		die("read_trace_init failed");
>> +	pevent = read_trace_init(file_bigendian, host_bigendian);
>> +	if (pevent == NULL) {
>
> Shouldn't we still set *ppevent to NULL? Or will the user now need to
> make sure that its pevent is NULL and always check for error?

I thought it's impossible to check return value for error since we don't
know how large a tracing data is, so I decided to init *ppevent to NULL
at the beginning and set it to a valid pevent right before return.  Thus
user need to check NULL before using it.

In the above case of perf_event__process_tracing_data(), it's a pipe
mode and we can know its size since it's saved in a temp file.

Thanks,
Namhyung

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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-19 14:50   ` Steven Rostedt
@ 2013-03-20  1:14     ` Namhyung Kim
  2013-03-20  1:55       ` Steven Rostedt
  0 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  1:14 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 10:50:02 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>>  	free(version);
>> @@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>>  
>>  	page_size = read4(pevent);
>>  
>> -	read_header_files(pevent);
>> -	read_ftrace_files(pevent);
>> -	read_event_files(pevent);
>> -	read_proc_kallsyms(pevent);
>> -	read_ftrace_printk(pevent);
>> +	if (read_header_files(pevent) ||
>> +	    read_ftrace_files(pevent) ||
>> +	    read_event_files(pevent) ||
>> +	    read_proc_kallsyms(pevent) ||
>> +	    read_ftrace_printk(pevent))
>> +		goto out;
>
> I think I like the err += func() and check for err < 0, better.

Okay, I'll change them to err |= func() style if you're fine as Peter
suggested.

Thanks,
Namhyung

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

* Re: [PATCH 7/9] perf util: Get rid of read_or_die() in trace-event-read.c
  2013-03-19 14:54   ` Steven Rostedt
@ 2013-03-20  1:24     ` Namhyung Kim
  2013-03-20  1:59       ` Steven Rostedt
  0 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  1:24 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 10:54:27 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>> From: Namhyung Kim <namhyung.kim@lge.com>
>> 
>> Rename it to do_read and original do_read to __do_read, and check
>> their return value.
>> 
>> Cc: Steven Rostedt <rostedt@goodmis.org>
>> Cc: Frederic Weisbecker <fweisbec@gmail.com>
>> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
>> ---
>>  tools/perf/util/trace-event-read.c | 80 +++++++++++++++++++++++++++-----------
>>  1 file changed, 57 insertions(+), 23 deletions(-)
>> 
>> diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
>> index 62dd2168f4f5..87f0ccd54cdc 100644
>> --- a/tools/perf/util/trace-event-read.c
>> +++ b/tools/perf/util/trace-event-read.c
>> @@ -48,7 +48,7 @@ static int long_size;
>>  static ssize_t calc_data_size;
>>  static bool repipe;
>>  
>> -static int do_read(int fd, void *buf, int size)
>> +static int __do_read(int fd, void *buf, int size)
>>  {
>>  	int rsize = size;
>>  
>> @@ -61,8 +61,10 @@ static int do_read(int fd, void *buf, int size)
>>  		if (repipe) {
>>  			int retw = write(STDOUT_FILENO, buf, ret);
>>  
>> -			if (retw <= 0 || retw != ret)
>> -				die("repiping input file");
>> +			if (retw <= 0 || retw != ret) {
>> +				pr_debug("repiping input file");
>
> Again, why debug and not err?

Well, there's a pr_err() at the caller of top-level trace_report() in
case of error.  So if we use pr_err() there'll be multiple error message
for one failure and I don't think it's so helpful to normal users.  If
one really wants to know what happens inside, she will set -v to see
this low-level debug message.

Does that make sense?

>
>> +				return -1;
>> +			}
>>  		}
>>  
>>  		size -= ret;
>> @@ -72,14 +74,16 @@ static int do_read(int fd, void *buf, int size)
>>  	return rsize;
>>  }
>>  
>> -static int read_or_die(void *data, int size)
>> +static int do_read(void *data, int size)
>>  {
>>  	int r;
>>  
>> -	r = do_read(input_fd, data, size);
>> -	if (r <= 0)
>> -		die("reading input file (size expected=%d received=%d)",
>> -		    size, r);
>> +	r = __do_read(input_fd, data, size);
>> +	if (r <= 0) {
>> +		pr_debug("reading input file (size expected=%d received=%d)",
>> +			 size, r);
>> +		return -1;
>> +	}
>>  
>>  	if (calc_data_size)
>>  		calc_data_size += r;
>> @@ -95,7 +99,7 @@ static void skip(int size)
>>  
>>  	while (size) {
>>  		r = size > BUFSIZ ? BUFSIZ : size;
>> -		read_or_die(buf, r);
>> +		do_read(buf, r);
>
> Shouldn't this check the result of do_read()?

I was not so sure about this, but I skipped the check since all it does
is to "skip" and comment said "If it fails, the next read will report
it". :-)

Thanks,
Namhyung

>
>>  		size -= r;
>>  	};
>>  }
>
> -- Steve

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

* Re: [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c
  2013-03-19 14:55   ` Steven Rostedt
@ 2013-03-20  1:25     ` Namhyung Kim
  2013-03-20 13:27       ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  1:25 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 10:55:28 -0400, Steven Rostedt wrote:
> On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>> From: Namhyung Kim <namhyung.kim@lge.com>
>> 
>> Convert them to pr_debug() and propagate error code.
>
> Shouldn't they be pr_err(). I mean, if the old code would kill the
> process, why just keep it as a debug output?

Please see my other reply.

Arnaldo, can you give me your direction/preference?

Thanks,
Namhyung

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

* Re: [PATCH 5/9] perf util: Handle failure case in trace_report()
  2013-03-20  1:12     ` Namhyung Kim
@ 2013-03-20  1:54       ` Steven Rostedt
  0 siblings, 0 replies; 33+ messages in thread
From: Steven Rostedt @ 2013-03-20  1:54 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Wed, 2013-03-20 at 10:12 +0900, Namhyung Kim wrote:

> >> +++ b/tools/perf/util/trace-event-read.c
> >> @@ -293,7 +293,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
> >>  	int show_version = 0;
> >>  	int show_funcs = 0;
> >>  	int show_printk = 0;
> >> -	ssize_t size;
> >> +	ssize_t size = -1;
> >> +	struct pevent *pevent;
> >> +
> >> +	*ppevent = NULL;
> >>  
> >>  	calc_data_size = 1;
> >>  	repipe = __repipe;
> >> @@ -317,34 +320,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
> >>  	file_bigendian = buf[0];
> >>  	host_bigendian = bigendian();
> >>  
> >> -	*ppevent = read_trace_init(file_bigendian, host_bigendian);
> >> -	if (*ppevent == NULL)
> >> -		die("read_trace_init failed");
> >> +	pevent = read_trace_init(file_bigendian, host_bigendian);
> >> +	if (pevent == NULL) {
> >
> > Shouldn't we still set *ppevent to NULL? Or will the user now need to
> > make sure that its pevent is NULL and always check for error?
> 
> I thought it's impossible to check return value for error since we don't
> know how large a tracing data is, so I decided to init *ppevent to NULL
> at the beginning and set it to a valid pevent right before return.  Thus
> user need to check NULL before using it.
> 
> In the above case of perf_event__process_tracing_data(), it's a pipe
> mode and we can know its size since it's saved in a temp file.
> 

My fault, I missed the addition of *ppevent = NULL at the beginning.
Ignore this comment.

-- Steve



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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-20  1:14     ` Namhyung Kim
@ 2013-03-20  1:55       ` Steven Rostedt
  2013-03-20  3:00         ` Namhyung Kim
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-20  1:55 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Wed, 2013-03-20 at 10:14 +0900, Namhyung Kim wrote:
> On Tue, 19 Mar 2013 10:50:02 -0400, Steven Rostedt wrote:
> > On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> >>  	free(version);
> >> @@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
> >>  
> >>  	page_size = read4(pevent);
> >>  
> >> -	read_header_files(pevent);
> >> -	read_ftrace_files(pevent);
> >> -	read_event_files(pevent);
> >> -	read_proc_kallsyms(pevent);
> >> -	read_ftrace_printk(pevent);
> >> +	if (read_header_files(pevent) ||
> >> +	    read_ftrace_files(pevent) ||
> >> +	    read_event_files(pevent) ||
> >> +	    read_proc_kallsyms(pevent) ||
> >> +	    read_ftrace_printk(pevent))
> >> +		goto out;
> >
> > I think I like the err += func() and check for err < 0, better.
> 
> Okay, I'll change them to err |= func() style if you're fine as Peter
> suggested.

+= or |= I'm not picky ;-)

-- Steve



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

* Re: [PATCH 7/9] perf util: Get rid of read_or_die() in trace-event-read.c
  2013-03-20  1:24     ` Namhyung Kim
@ 2013-03-20  1:59       ` Steven Rostedt
  0 siblings, 0 replies; 33+ messages in thread
From: Steven Rostedt @ 2013-03-20  1:59 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Wed, 2013-03-20 at 10:24 +0900, Namhyung Kim wrote:

> >> @@ -61,8 +61,10 @@ static int do_read(int fd, void *buf, int size)
> >>  		if (repipe) {
> >>  			int retw = write(STDOUT_FILENO, buf, ret);
> >>  
> >> -			if (retw <= 0 || retw != ret)
> >> -				die("repiping input file");
> >> +			if (retw <= 0 || retw != ret) {
> >> +				pr_debug("repiping input file");
> >
> > Again, why debug and not err?
> 
> Well, there's a pr_err() at the caller of top-level trace_report() in
> case of error.  So if we use pr_err() there'll be multiple error message
> for one failure and I don't think it's so helpful to normal users.  If
> one really wants to know what happens inside, she will set -v to see
> this low-level debug message.
> 
> Does that make sense?
> 

I haven't looked at the context of all the changes as to where they are
called from. I'm fine if we have a methodology of having pr_err() at the
top level and pr_debug() within the nested code. It looked to me that
the choices were somewhat random, but then again, I was missing context
to the code.

As long as a pr_err() that gives the user enough information to know
what went wrong is displayed, I'm fine with other errors using
pr_debug().

-- Steve



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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-20  1:55       ` Steven Rostedt
@ 2013-03-20  3:00         ` Namhyung Kim
  2013-03-20  3:13           ` Steven Rostedt
  0 siblings, 1 reply; 33+ messages in thread
From: Namhyung Kim @ 2013-03-20  3:00 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Tue, 19 Mar 2013 21:55:02 -0400, Steven Rostedt wrote:
> On Wed, 2013-03-20 at 10:14 +0900, Namhyung Kim wrote:
>> On Tue, 19 Mar 2013 10:50:02 -0400, Steven Rostedt wrote:
>> > On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
>> >>  	free(version);
>> >> @@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
>> >>  
>> >>  	page_size = read4(pevent);
>> >>  
>> >> -	read_header_files(pevent);
>> >> -	read_ftrace_files(pevent);
>> >> -	read_event_files(pevent);
>> >> -	read_proc_kallsyms(pevent);
>> >> -	read_ftrace_printk(pevent);
>> >> +	if (read_header_files(pevent) ||
>> >> +	    read_ftrace_files(pevent) ||
>> >> +	    read_event_files(pevent) ||
>> >> +	    read_proc_kallsyms(pevent) ||
>> >> +	    read_ftrace_printk(pevent))
>> >> +		goto out;
>> >
>> > I think I like the err += func() and check for err < 0, better.
>> 
>> Okay, I'll change them to err |= func() style if you're fine as Peter
>> suggested.
>
> += or |= I'm not picky ;-)

Ah, one thing I also care was the short-circuit logic.  I think we don't
need to call later functions if one fails, do we?

Thanks,
Namhyung

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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-20  3:00         ` Namhyung Kim
@ 2013-03-20  3:13           ` Steven Rostedt
  2013-03-20 13:04             ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 33+ messages in thread
From: Steven Rostedt @ 2013-03-20  3:13 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Paul Mackerras,
	Ingo Molnar, Namhyung Kim, LKML, Frederic Weisbecker

On Wed, 2013-03-20 at 12:00 +0900, Namhyung Kim wrote:
> On Tue, 19 Mar 2013 21:55:02 -0400, Steven Rostedt wrote:
> > On Wed, 2013-03-20 at 10:14 +0900, Namhyung Kim wrote:
> >> On Tue, 19 Mar 2013 10:50:02 -0400, Steven Rostedt wrote:
> >> > On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> >> >>  	free(version);
> >> >> @@ -331,11 +354,12 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
> >> >>  
> >> >>  	page_size = read4(pevent);
> >> >>  
> >> >> -	read_header_files(pevent);
> >> >> -	read_ftrace_files(pevent);
> >> >> -	read_event_files(pevent);
> >> >> -	read_proc_kallsyms(pevent);
> >> >> -	read_ftrace_printk(pevent);
> >> >> +	if (read_header_files(pevent) ||
> >> >> +	    read_ftrace_files(pevent) ||
> >> >> +	    read_event_files(pevent) ||
> >> >> +	    read_proc_kallsyms(pevent) ||
> >> >> +	    read_ftrace_printk(pevent))
> >> >> +		goto out;
> >> >
> >> > I think I like the err += func() and check for err < 0, better.
> >> 
> >> Okay, I'll change them to err |= func() style if you're fine as Peter
> >> suggested.
> >
> > += or |= I'm not picky ;-)
> 
> Ah, one thing I also care was the short-circuit logic.  I think we don't
> need to call later functions if one fails, do we?

Yeah, good point. It still looks ugly, but it does make sense.

-- Steve



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

* Re: [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-20  3:13           ` Steven Rostedt
@ 2013-03-20 13:04             ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 33+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-03-20 13:04 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, LKML, Frederic Weisbecker

Em Tue, Mar 19, 2013 at 11:13:25PM -0400, Steven Rostedt escreveu:
> On Wed, 2013-03-20 at 12:00 +0900, Namhyung Kim wrote:
> > On Tue, 19 Mar 2013 21:55:02 -0400, Steven Rostedt wrote:
> > > On Wed, 2013-03-20 at 10:14 +0900, Namhyung Kim wrote:
> > >> On Tue, 19 Mar 2013 10:50:02 -0400, Steven Rostedt wrote:
> > >> > On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> > >> > I think I like the err += func() and check for err < 0, better.

> > >> Okay, I'll change them to err |= func() style if you're fine as Peter
> > >> suggested.

> > > += or |= I'm not picky ;-)

> > Ah, one thing I also care was the short-circuit logic.  I think we don't
> > need to call later functions if one fails, do we?

> Yeah, good point. It still looks ugly, but it does make sense.

Yes, I dislike all this += or |=, it should be normal exception
handling, just like everywhere in the kernel codebase:

	err = foo();
	if (err)
		goto out_err;

	err = bar();
	if (err)
		goto out_foo;

	err = baz();
	if (err)
		goto out_bar;

	err = new_foo();
	if (err)
		goto out_baz;

	return 0;
out_baz:
	baz_cleanup();
out_bar:
	bar_cleanup();
out_foo:
	foo_cleanup();
out_err:
	return err;

----

	That way exception handling code lies at the end of the
function, i.e. in source and binary code it has a lower chance of
polluting brain and CPU caches, and we don't need to call N functions
if we'll bail out when the one of them fails.

	I.e. nothing new here, just follow kernel coding style, move
along :-)

- Arnaldo

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

* Re: [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c
  2013-03-20  1:25     ` Namhyung Kim
@ 2013-03-20 13:27       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 33+ messages in thread
From: Arnaldo Carvalho de Melo @ 2013-03-20 13:27 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Peter Zijlstra, Paul Mackerras, Ingo Molnar,
	Namhyung Kim, LKML, Frederic Weisbecker

Em Wed, Mar 20, 2013 at 10:25:52AM +0900, Namhyung Kim escreveu:
> On Tue, 19 Mar 2013 10:55:28 -0400, Steven Rostedt wrote:
> > On Tue, 2013-03-19 at 17:53 +0900, Namhyung Kim wrote:
> >> Convert them to pr_debug() and propagate error code.

> > Shouldn't they be pr_err(). I mean, if the old code would kill the
> > process, why just keep it as a debug output?

> Please see my other reply.

Ditto.
 
> Arnaldo, can you give me your direction/preference?

Yeah, I think that lower levels should emit a debug if it helps
developers and advanced users to remedy or at least understand the
situation.

The builtin-foo.c top level and the [TG]UI routines are the ones that
must emit messages to the user.

- Arnaldo

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

* [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c
  2013-03-21  7:18 [PATCHSET 0/9] perf util: Cleanup die() and its friends (v2) Namhyung Kim
@ 2013-03-21  7:18 ` Namhyung Kim
  0 siblings, 0 replies; 33+ messages in thread
From: Namhyung Kim @ 2013-03-21  7:18 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar, Namhyung Kim, LKML,
	Steven Rostedt, Frederic Weisbecker

From: Namhyung Kim <namhyung.kim@lge.com>

Check return value of malloc() and fail if error.  Now read_string()
can return NULL also check its return value and bail out.

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/trace-event-read.c | 100 +++++++++++++++++++++++++------------
 1 file changed, 67 insertions(+), 33 deletions(-)

diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index 9bf64986a968..dc599fd27c47 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -48,16 +48,6 @@ static int long_size;
 static ssize_t calc_data_size;
 static bool repipe;
 
-static void *malloc_or_die(int size)
-{
-	void *ret;
-
-	ret = malloc(size);
-	if (!ret)
-		die("malloc");
-	return ret;
-}
-
 static int do_read(int fd, void *buf, int size)
 {
 	int rsize = size;
@@ -158,48 +148,57 @@ static char *read_string(void)
 	if (calc_data_size)
 		calc_data_size += size;
 
-	str = malloc_or_die(size);
-	memcpy(str, buf, size);
+	str = malloc(size);
+	if (str)
+		memcpy(str, buf, size);
 
 	return str;
 }
 
-static void read_proc_kallsyms(struct pevent *pevent)
+static int read_proc_kallsyms(struct pevent *pevent)
 {
 	unsigned int size;
 	char *buf;
 
 	size = read4(pevent);
 	if (!size)
-		return;
+		return 0;
+
+	buf = malloc(size + 1);
+	if (buf == NULL)
+		return -1;
 
-	buf = malloc_or_die(size + 1);
 	read_or_die(buf, size);
 	buf[size] = '\0';
 
 	parse_proc_kallsyms(pevent, buf, size);
 
 	free(buf);
+	return 0;
 }
 
-static void read_ftrace_printk(struct pevent *pevent)
+static int read_ftrace_printk(struct pevent *pevent)
 {
 	unsigned int size;
 	char *buf;
 
 	size = read4(pevent);
 	if (!size)
-		return;
+		return 0;
+
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
 
-	buf = malloc_or_die(size);
 	read_or_die(buf, size);
 
 	parse_ftrace_printk(pevent, buf, size);
 
 	free(buf);
+	return 0;
 }
 
-static void read_header_files(struct pevent *pevent)
+static int read_header_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	char *header_event;
@@ -224,65 +223,87 @@ static void read_header_files(struct pevent *pevent)
 		die("did not read header event");
 
 	size = read8(pevent);
-	header_event = malloc_or_die(size);
+	header_event = malloc(size);
+	if (header_event == NULL)
+		return -1;
+
 	read_or_die(header_event, size);
 	free(header_event);
+	return 0;
 }
 
-static void read_ftrace_file(struct pevent *pevent, unsigned long long size)
+static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
 {
 	char *buf;
 
-	buf = malloc_or_die(size);
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
+
 	read_or_die(buf, size);
 	parse_ftrace_file(pevent, buf, size);
 	free(buf);
+	return 0;
 }
 
-static void read_event_file(struct pevent *pevent, char *sys,
+static int read_event_file(struct pevent *pevent, char *sys,
 			    unsigned long long size)
 {
 	char *buf;
 
-	buf = malloc_or_die(size);
+	buf = malloc(size);
+	if (buf == NULL)
+		return -1;
+
 	read_or_die(buf, size);
 	parse_event_file(pevent, buf, size, sys);
 	free(buf);
+	return 0;
 }
 
-static void read_ftrace_files(struct pevent *pevent)
+static int read_ftrace_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	int count;
 	int i;
+	int ret;
 
 	count = read4(pevent);
 
 	for (i = 0; i < count; i++) {
 		size = read8(pevent);
-		read_ftrace_file(pevent, size);
+		ret = read_ftrace_file(pevent, size);
+		if (ret)
+			return ret;
 	}
+	return 0;
 }
 
-static void read_event_files(struct pevent *pevent)
+static int read_event_files(struct pevent *pevent)
 {
 	unsigned long long size;
 	char *sys;
 	int systems;
 	int count;
 	int i,x;
+	int ret;
 
 	systems = read4(pevent);
 
 	for (i = 0; i < systems; i++) {
 		sys = read_string();
+		if (sys == NULL)
+			return -1;
 
 		count = read4(pevent);
 		for (x=0; x < count; x++) {
 			size = read8(pevent);
-			read_event_file(pevent, sys, size);
+			ret = read_event_file(pevent, sys, size);
+			if (ret)
+				return ret;
 		}
 	}
+	return 0;
 }
 
 ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
@@ -295,6 +316,7 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 	int show_printk = 0;
 	ssize_t size = -1;
 	struct pevent *pevent;
+	int err;
 
 	*ppevent = NULL;
 
@@ -312,6 +334,8 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 		die("not a trace file (missing 'tracing' tag)");
 
 	version = read_string();
+	if (version == NULL)
+		return -1;
 	if (show_version)
 		printf("version = %s\n", version);
 	free(version);
@@ -331,11 +355,21 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
 
 	page_size = read4(pevent);
 
-	read_header_files(pevent);
-	read_ftrace_files(pevent);
-	read_event_files(pevent);
-	read_proc_kallsyms(pevent);
-	read_ftrace_printk(pevent);
+	err = read_header_files(pevent);
+	if (err)
+		goto out;
+	err = read_ftrace_files(pevent);
+	if (err)
+		goto out;
+	err = read_event_files(pevent);
+	if (err)
+		goto out;
+	err = read_proc_kallsyms(pevent);
+	if (err)
+		goto out;
+	err = read_ftrace_printk(pevent);
+	if (err)
+		goto out;
 
 	size = calc_data_size - 1;
 	calc_data_size = 0;
-- 
1.7.11.7


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

end of thread, other threads:[~2013-03-21  7:19 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-19  8:53 [PATCHSET 0/9] perf util: Cleanup die() and its friends Namhyung Kim
2013-03-19  8:53 ` [PATCH 1/9] perf util: Let get_tracing_file() can return NULL Namhyung Kim
2013-03-19 13:54   ` Steven Rostedt
2013-03-20  0:53     ` Namhyung Kim
2013-03-19  8:53 ` [PATCH 2/9] perf util: Get rid of malloc_or_die() in trace-event-info.c Namhyung Kim
2013-03-19  8:53 ` [PATCH 3/9] perf util: Get rid of write_or_die() from trace-event-info.c Namhyung Kim
2013-03-19 14:35   ` Steven Rostedt
2013-03-19 14:49     ` Peter Zijlstra
2013-03-19 14:59       ` Steven Rostedt
2013-03-19 15:04         ` Peter Zijlstra
2013-03-20  0:57           ` Namhyung Kim
2013-03-19  8:53 ` [PATCH 4/9] perf util: Get rid of die() calls " Namhyung Kim
2013-03-19  8:53 ` [PATCH 5/9] perf util: Handle failure case in trace_report() Namhyung Kim
2013-03-19 14:47   ` Steven Rostedt
2013-03-20  1:12     ` Namhyung Kim
2013-03-20  1:54       ` Steven Rostedt
2013-03-19  8:53 ` [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c Namhyung Kim
2013-03-19 14:50   ` Steven Rostedt
2013-03-20  1:14     ` Namhyung Kim
2013-03-20  1:55       ` Steven Rostedt
2013-03-20  3:00         ` Namhyung Kim
2013-03-20  3:13           ` Steven Rostedt
2013-03-20 13:04             ` Arnaldo Carvalho de Melo
2013-03-19  8:53 ` [PATCH 7/9] perf util: Get rid of read_or_die() " Namhyung Kim
2013-03-19 14:54   ` Steven Rostedt
2013-03-20  1:24     ` Namhyung Kim
2013-03-20  1:59       ` Steven Rostedt
2013-03-19  8:53 ` [PATCH 8/9] perf util: Get rid of die() calls in trace-data-read.c Namhyung Kim
2013-03-19 14:55   ` Steven Rostedt
2013-03-20  1:25     ` Namhyung Kim
2013-03-20 13:27       ` Arnaldo Carvalho de Melo
2013-03-19  8:53 ` [PATCH 9/9] perf util: Cleanup calc_data_size logic Namhyung Kim
2013-03-21  7:18 [PATCHSET 0/9] perf util: Cleanup die() and its friends (v2) Namhyung Kim
2013-03-21  7:18 ` [PATCH 6/9] perf util: Get rid of malloc_or_die() in trace-event-read.c Namhyung Kim

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.