Merge branch 'cando' into for-linus
[linux-2.6-microblaze.git] / tools / perf / util / event.c
index 2f33ca9..50771b5 100644 (file)
@@ -7,6 +7,23 @@
 #include "strlist.h"
 #include "thread.h"
 
+const char *event__name[] = {
+       [0]                      = "TOTAL",
+       [PERF_RECORD_MMAP]       = "MMAP",
+       [PERF_RECORD_LOST]       = "LOST",
+       [PERF_RECORD_COMM]       = "COMM",
+       [PERF_RECORD_EXIT]       = "EXIT",
+       [PERF_RECORD_THROTTLE]   = "THROTTLE",
+       [PERF_RECORD_UNTHROTTLE] = "UNTHROTTLE",
+       [PERF_RECORD_FORK]       = "FORK",
+       [PERF_RECORD_READ]       = "READ",
+       [PERF_RECORD_SAMPLE]     = "SAMPLE",
+       [PERF_RECORD_HEADER_ATTR]        = "ATTR",
+       [PERF_RECORD_HEADER_EVENT_TYPE]  = "EVENT_TYPE",
+       [PERF_RECORD_HEADER_TRACING_DATA]        = "TRACING_DATA",
+       [PERF_RECORD_HEADER_BUILD_ID]    = "BUILD_ID",
+};
+
 static pid_t event__synthesize_comm(pid_t pid, int full,
                                    event__handler_t process,
                                    struct perf_session *session)
@@ -288,7 +305,7 @@ int event__synthesize_kernel_mmap(event__handler_t process,
         */
        struct process_symbol_args args = { .name = symbol_name, };
 
-       mmap_name = machine__mmap_name(machine, name_buff);
+       mmap_name = machine__mmap_name(machine, name_buff, sizeof(name_buff));
        if (machine__is_host(machine)) {
                /*
                 * kernel uses PERF_RECORD_MISC_USER for user space maps,
@@ -368,7 +385,7 @@ int event__process_comm(event_t *self, struct perf_session *session)
 int event__process_lost(event_t *self, struct perf_session *session)
 {
        dump_printf(": id:%Ld: lost:%Ld\n", self->lost.id, self->lost.lost);
-       session->events_stats.lost += self->lost.lost;
+       session->hists.stats.total_lost += self->lost.lost;
        return 0;
 }
 
@@ -399,7 +416,7 @@ static int event__process_kernel_mmap(event_t *self,
                goto out_problem;
        }
 
-       machine__mmap_name(machine, kmmap_prefix);
+       machine__mmap_name(machine, kmmap_prefix, sizeof(kmmap_prefix));
        if (machine__is_host(machine))
                kernel_type = DSO_TYPE_KERNEL;
        else
@@ -429,9 +446,8 @@ static int event__process_kernel_mmap(event_t *self,
                } else
                        strcpy(short_module_name, self->mmap.filename);
 
-               map = map_groups__new_module(&machine->kmaps,
-                                            self->mmap.start,
-                                            self->mmap.filename, machine);
+               map = machine__new_module(machine, self->mmap.start,
+                                         self->mmap.filename);
                if (map == NULL)
                        goto out_problem;
 
@@ -454,9 +470,7 @@ static int event__process_kernel_mmap(event_t *self,
                        goto out_problem;
 
                kernel->kernel = kernel_type;
-               if (__map_groups__create_kernel_maps(&machine->kmaps,
-                                                    machine->vmlinux_maps,
-                                                    kernel) < 0)
+               if (__machine__create_kernel_maps(machine, kernel) < 0)
                        goto out_problem;
 
                event_set_kernel_mmap_len(machine->vmlinux_maps, self);
@@ -496,8 +510,10 @@ int event__process_mmap(event_t *self, struct perf_session *session)
                return 0;
        }
 
-       thread = perf_session__findnew(session, self->mmap.pid);
        machine = perf_session__find_host_machine(session);
+       if (machine == NULL)
+               goto out_problem;
+       thread = perf_session__findnew(session, self->mmap.pid);
        map = map__new(&machine->user_dsos, self->mmap.start,
                        self->mmap.len, self->mmap.pgoff,
                        self->mmap.pid, self->mmap.filename,
@@ -555,6 +571,10 @@ void thread__find_addr_map(struct thread *self,
        if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) {
                al->level = 'k';
                machine = perf_session__find_host_machine(session);
+               if (machine == NULL) {
+                       al->map = NULL;
+                       return;
+               }
                mg = &machine->kmaps;
        } else if (cpumode == PERF_RECORD_MISC_USER && perf_host) {
                al->level = '.';
@@ -562,7 +582,7 @@ void thread__find_addr_map(struct thread *self,
        } else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) {
                al->level = 'g';
                machine = perf_session__find_machine(session, pid);
-               if (!machine) {
+               if (machine == NULL) {
                        al->map = NULL;
                        return;
                }
@@ -629,8 +649,10 @@ static void dso__calc_col_width(struct dso *self)
        if (!symbol_conf.col_width_list_str && !symbol_conf.field_sep &&
            (!symbol_conf.dso_list ||
             strlist__has_entry(symbol_conf.dso_list, self->name))) {
-               unsigned int slen = strlen(self->name);
-               if (slen > dsos__col_width)
+               u16 slen = self->short_name_len;
+               if (verbose)
+                       slen = self->long_name_len;
+               if (dsos__col_width < slen)
                        dsos__col_width = slen;
        }
 
@@ -651,6 +673,16 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session,
                goto out_filtered;
 
        dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid);
+       /*
+        * Have we already created the kernel maps for the host machine?
+        *
+        * This should have happened earlier, when we processed the kernel MMAP
+        * events, but for older perf.data files there was no such thing, so do
+        * it now.
+        */
+       if (cpumode == PERF_RECORD_MISC_KERNEL &&
+           session->host_machine.vmlinux_maps[MAP__FUNCTION] == NULL)
+               machine__create_kernel_maps(&session->host_machine);
 
        thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
                              self->ip.pid, self->ip.ip, al);
@@ -677,6 +709,13 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session,
                        dso__calc_col_width(al->map->dso);
 
                al->sym = map__find_symbol(al->map, al->addr, filter);
+       } else {
+               const unsigned int unresolved_col_width = BITS_PER_LONG / 4;
+
+               if (dsos__col_width < unresolved_col_width &&
+                   !symbol_conf.col_width_list_str && !symbol_conf.field_sep &&
+                   !symbol_conf.dso_list)
+                       dsos__col_width = unresolved_col_width;
        }
 
        if (symbol_conf.sym_list && al->sym &&
@@ -716,6 +755,7 @@ int event__parse_sample(event_t *event, u64 type, struct sample_data *data)
                array++;
        }
 
+       data->id = -1ULL;
        if (type & PERF_SAMPLE_ID) {
                data->id = *array;
                array++;