Merge remote-tracking branch 'torvalds/master' into perf/core
[linux-2.6-microblaze.git] / tools / perf / util / session.c
index a12cf4f..86145dd 100644 (file)
@@ -904,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:
@@ -937,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);
 }
@@ -1723,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)
@@ -2155,6 +2156,7 @@ struct reader {
        u64              data_size;
        u64              data_offset;
        reader_cb_t      process;
+       bool             in_place_update;
 };
 
 static int
@@ -2188,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;
        }
@@ -2274,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;