]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - tools/perf/util/trace-event-read.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / tools / perf / util / trace-event-read.c
index b67a0ccf5ab94991653f6666dd4766864d282b3b..27420159bf6944df76eb76a45943a4810e0ba972 100644 (file)
@@ -260,39 +260,53 @@ static int read_header_files(struct pevent *pevent)
 
 static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
 {
+       int ret;
        char *buf;
 
        buf = malloc(size);
-       if (buf == NULL)
+       if (buf == NULL) {
+               pr_debug("memory allocation failure\n");
                return -1;
+       }
 
-       if (do_read(buf, size) < 0) {
-               free(buf);
-               return -1;
+       ret = do_read(buf, size);
+       if (ret < 0) {
+               pr_debug("error reading ftrace file.\n");
+               goto out;
        }
 
-       parse_ftrace_file(pevent, buf, size);
+       ret = parse_ftrace_file(pevent, buf, size);
+       if (ret < 0)
+               pr_debug("error parsing ftrace file.\n");
+out:
        free(buf);
-       return 0;
+       return ret;
 }
 
 static int read_event_file(struct pevent *pevent, char *sys,
                            unsigned long long size)
 {
+       int ret;
        char *buf;
 
        buf = malloc(size);
-       if (buf == NULL)
+       if (buf == NULL) {
+               pr_debug("memory allocation failure\n");
                return -1;
+       }
 
-       if (do_read(buf, size) < 0) {
+       ret = do_read(buf, size);
+       if (ret < 0) {
                free(buf);
-               return -1;
+               goto out;
        }
 
-       parse_event_file(pevent, buf, size, sys);
+       ret = parse_event_file(pevent, buf, size, sys);
+       if (ret < 0)
+               pr_debug("error parsing event file.\n");
+out:
        free(buf);
-       return 0;
+       return ret;
 }
 
 static int read_ftrace_files(struct pevent *pevent)
@@ -341,6 +355,36 @@ static int read_event_files(struct pevent *pevent)
        return 0;
 }
 
+static int read_saved_cmdline(struct pevent *pevent)
+{
+       unsigned long long size;
+       char *buf;
+       int ret;
+
+       /* it can have 0 size */
+       size = read8(pevent);
+       if (!size)
+               return 0;
+
+       buf = malloc(size + 1);
+       if (buf == NULL) {
+               pr_debug("memory allocation failure\n");
+               return -1;
+       }
+
+       ret = do_read(buf, size);
+       if (ret < 0) {
+               pr_debug("error reading saved cmdlines\n");
+               goto out;
+       }
+
+       parse_saved_cmdline(pevent, buf, size);
+       ret = 0;
+out:
+       free(buf);
+       return ret;
+}
+
 ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
 {
        char buf[BUFSIZ];
@@ -379,10 +423,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
                return -1;
        if (show_version)
                printf("version = %s\n", version);
-       free(version);
 
-       if (do_read(buf, 1) < 0)
+       if (do_read(buf, 1) < 0) {
+               free(version);
                return -1;
+       }
        file_bigendian = buf[0];
        host_bigendian = bigendian();
 
@@ -423,6 +468,11 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
        err = read_ftrace_printk(pevent);
        if (err)
                goto out;
+       if (atof(version) >= 0.6) {
+               err = read_saved_cmdline(pevent);
+               if (err)
+                       goto out;
+       }
 
        size = trace_data_size;
        repipe = false;
@@ -438,5 +488,6 @@ ssize_t trace_report(int fd, struct trace_event *tevent, bool __repipe)
 out:
        if (pevent)
                trace_event__cleanup(tevent);
+       free(version);
        return size;
 }