Merge remote-tracking branch 'torvalds/master' into perf/core
[linux-2.6-microblaze.git] / tools / perf / util / session.c
index 859832a..86145dd 100644 (file)
@@ -29,6 +29,7 @@
 #include "thread-stack.h"
 #include "sample-raw.h"
 #include "stat.h"
+#include "tsc.h"
 #include "ui/progress.h"
 #include "../perf.h"
 #include "arch/common.h"
@@ -451,6 +452,16 @@ static int process_stat_round_stub(struct perf_session *perf_session __maybe_unu
        return 0;
 }
 
+static int process_event_time_conv_stub(struct perf_session *perf_session __maybe_unused,
+                                       union perf_event *event)
+{
+       if (dump_trace)
+               perf_event__fprintf_time_conv(event, stdout);
+
+       dump_printf(": unhandled!\n");
+       return 0;
+}
+
 static int perf_session__process_compressed_event_stub(struct perf_session *session __maybe_unused,
                                                       union perf_event *event __maybe_unused,
                                                       u64 file_offset __maybe_unused)
@@ -532,7 +543,7 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
        if (tool->stat_round == NULL)
                tool->stat_round = process_stat_round_stub;
        if (tool->time_conv == NULL)
-               tool->time_conv = process_event_op2_stub;
+               tool->time_conv = process_event_time_conv_stub;
        if (tool->feature == NULL)
                tool->feature = process_event_op2_stub;
        if (tool->compressed == NULL)
@@ -893,7 +904,7 @@ static void perf_event__cpu_map_swap(union perf_event *event,
        struct perf_record_record_cpu_map *mask;
        unsigned i;
 
-       data->type = bswap_64(data->type);
+       data->type = bswap_16(data->type);
 
        switch (data->type) {
        case PERF_CPU_MAP__CPUS:
@@ -926,7 +937,7 @@ static void perf_event__stat_config_swap(union perf_event *event,
 {
        u64 size;
 
-       size  = event->stat_config.nr * sizeof(event->stat_config.data[0]);
+       size  = bswap_64(event->stat_config.nr) * sizeof(event->stat_config.data[0]);
        size += 1; /* nr item itself */
        mem_bswap_64(&event->stat_config.nr, size);
 }
@@ -949,6 +960,19 @@ static void perf_event__stat_round_swap(union perf_event *event,
        event->stat_round.time = bswap_64(event->stat_round.time);
 }
 
+static void perf_event__time_conv_swap(union perf_event *event,
+                                      bool sample_id_all __maybe_unused)
+{
+       event->time_conv.time_shift = bswap_64(event->time_conv.time_shift);
+       event->time_conv.time_mult  = bswap_64(event->time_conv.time_mult);
+       event->time_conv.time_zero  = bswap_64(event->time_conv.time_zero);
+
+       if (event_contains(event->time_conv, time_cycles)) {
+               event->time_conv.time_cycles = bswap_64(event->time_conv.time_cycles);
+               event->time_conv.time_mask = bswap_64(event->time_conv.time_mask);
+       }
+}
+
 typedef void (*perf_event__swap_op)(union perf_event *event,
                                    bool sample_id_all);
 
@@ -985,7 +1009,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
        [PERF_RECORD_STAT]                = perf_event__stat_swap,
        [PERF_RECORD_STAT_ROUND]          = perf_event__stat_round_swap,
        [PERF_RECORD_EVENT_UPDATE]        = perf_event__event_update_swap,
-       [PERF_RECORD_TIME_CONV]           = perf_event__all64_swap,
+       [PERF_RECORD_TIME_CONV]           = perf_event__time_conv_swap,
        [PERF_RECORD_HEADER_MAX]          = NULL,
 };
 
@@ -1069,7 +1093,7 @@ static void callchain__lbr_callstack_printf(struct perf_sample *sample)
                 * in "to" register.
                 * For example, there is a call stack
                 * "A"->"B"->"C"->"D".
-                * The LBR registers will recorde like
+                * The LBR registers will be recorded like
                 * "C"->"D", "B"->"C", "A"->"B".
                 * So only the first "to" register and all "from"
                 * registers are needed to construct the whole stack.
@@ -1302,8 +1326,10 @@ static void dump_sample(struct evsel *evsel, union perf_event *event,
 
        if (sample_type & PERF_SAMPLE_WEIGHT_TYPE) {
                printf("... weight: %" PRIu64 "", sample->weight);
-                       if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT)
+                       if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT) {
                                printf(",0x%"PRIx16"", sample->ins_lat);
+                               printf(",0x%"PRIx16"", sample->p_stage_cyc);
+                       }
                printf("\n");
        }
 
@@ -1584,7 +1610,7 @@ static s64 perf_session__process_user_event(struct perf_session *session,
                return tool->event_update(tool, event, &session->evlist);
        case PERF_RECORD_HEADER_EVENT_TYPE:
                /*
-                * Depreceated, but we need to handle it for sake
+                * Deprecated, but we need to handle it for sake
                 * of old data files create in pipe mode.
                 */
                return 0;
@@ -1697,6 +1723,7 @@ int perf_session__peek_event(struct perf_session *session, off_t file_offset,
        if (event->header.size < hdr_sz || event->header.size > buf_sz)
                return -1;
 
+       buf += hdr_sz;
        rest = event->header.size - hdr_sz;
 
        if (readn(fd, buf, rest) != (ssize_t)rest)
@@ -2129,6 +2156,7 @@ struct reader {
        u64              data_size;
        u64              data_offset;
        reader_cb_t      process;
+       bool             in_place_update;
 };
 
 static int
@@ -2162,7 +2190,9 @@ reader__process_events(struct reader *rd, struct perf_session *session,
        mmap_prot  = PROT_READ;
        mmap_flags = MAP_SHARED;
 
-       if (session->header.needs_swap) {
+       if (rd->in_place_update) {
+               mmap_prot  |= PROT_WRITE;
+       } else if (session->header.needs_swap) {
                mmap_prot  |= PROT_WRITE;
                mmap_flags = MAP_PRIVATE;
        }
@@ -2248,6 +2278,7 @@ static int __perf_session__process_events(struct perf_session *session)
                .data_size      = session->header.data_size,
                .data_offset    = session->header.data_offset,
                .process        = process_simple,
+               .in_place_update = session->data->in_place_update,
        };
        struct ordered_events *oe = &session->ordered_events;
        struct perf_tool *tool = session->tool;
@@ -2350,7 +2381,8 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp
        return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
 }
 
-size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
+size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp,
+                                      bool skip_empty)
 {
        size_t ret;
        const char *msg = "";
@@ -2360,7 +2392,7 @@ size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
 
        ret = fprintf(fp, "\nAggregated stats:%s\n", msg);
 
-       ret += events_stats__fprintf(&session->evlist->stats, fp);
+       ret += events_stats__fprintf(&session->evlist->stats, fp, skip_empty);
        return ret;
 }