Pass stats structure so that it can point separate object when used in
multi-thread environment.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/perf/util/session.c | 71 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 45 insertions(+), 26 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index bc738216de36..0d080a95d2ff 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -18,6 +18,7 @@
 #include "auxtrace.h"
 
 static int perf_session__deliver_event(struct perf_session *session,
+                                      struct events_stats *stats,
                                       union perf_event *event,
                                       struct perf_sample *sample,
                                       struct perf_tool *tool,
@@ -106,7 +107,8 @@ static int ordered_events__deliver_event(struct 
ordered_events *oe,
                return ret;
        }
 
-       return perf_session__deliver_event(session, event->event, &sample,
+       return perf_session__deliver_event(session, &session->evlist->stats,
+                                          event->event, &sample,
                                           session->tool, event->file_offset);
 }
 
@@ -942,6 +944,7 @@ static struct machine *machines__find_for_cpumode(struct 
machines *machines,
 }
 
 static int deliver_sample_value(struct perf_evlist *evlist,
+                               struct events_stats *stats,
                                struct perf_tool *tool,
                                union perf_event *event,
                                struct perf_sample *sample,
@@ -957,7 +960,7 @@ static int deliver_sample_value(struct perf_evlist *evlist,
        }
 
        if (!sid || sid->evsel == NULL) {
-               ++evlist->stats.nr_unknown_id;
+               ++stats->nr_unknown_id;
                return 0;
        }
 
@@ -965,6 +968,7 @@ static int deliver_sample_value(struct perf_evlist *evlist,
 }
 
 static int deliver_sample_group(struct perf_evlist *evlist,
+                               struct events_stats *stats,
                                struct perf_tool *tool,
                                union  perf_event *event,
                                struct perf_sample *sample,
@@ -974,7 +978,7 @@ static int deliver_sample_group(struct perf_evlist *evlist,
        u64 i;
 
        for (i = 0; i < sample->read.group.nr; i++) {
-               ret = deliver_sample_value(evlist, tool, event, sample,
+               ret = deliver_sample_value(evlist, stats, tool, event, sample,
                                           &sample->read.group.values[i],
                                           machine);
                if (ret)
@@ -986,6 +990,7 @@ static int deliver_sample_group(struct perf_evlist *evlist,
 
 static int
  perf_evlist__deliver_sample(struct perf_evlist *evlist,
+                            struct events_stats *stats,
                             struct perf_tool *tool,
                             union  perf_event *event,
                             struct perf_sample *sample,
@@ -1002,14 +1007,15 @@ static int
 
        /* For PERF_SAMPLE_READ we have either single or group mode. */
        if (read_format & PERF_FORMAT_GROUP)
-               return deliver_sample_group(evlist, tool, event, sample,
+               return deliver_sample_group(evlist, stats, tool, event, sample,
                                            machine);
        else
-               return deliver_sample_value(evlist, tool, event, sample,
+               return deliver_sample_value(evlist, stats, tool, event, sample,
                                            &sample->read.one, machine);
 }
 
 static int machines__deliver_event(struct machines *machines,
+                                  struct events_stats *stats,
                                   struct perf_evlist *evlist,
                                   union perf_event *event,
                                   struct perf_sample *sample,
@@ -1028,14 +1034,15 @@ static int machines__deliver_event(struct machines 
*machines,
        case PERF_RECORD_SAMPLE:
                dump_sample(evsel, event, sample);
                if (evsel == NULL) {
-                       ++evlist->stats.nr_unknown_id;
+                       ++stats->nr_unknown_id;
                        return 0;
                }
                if (machine == NULL) {
-                       ++evlist->stats.nr_unprocessable_samples;
+                       ++stats->nr_unprocessable_samples;
                        return 0;
                }
-               return perf_evlist__deliver_sample(evlist, tool, event, sample, 
evsel, machine);
+               return perf_evlist__deliver_sample(evlist, stats, tool, event,
+                                                  sample, evsel, machine);
        case PERF_RECORD_MMAP:
                return tool->mmap(tool, event, sample, machine);
        case PERF_RECORD_MMAP2:
@@ -1048,7 +1055,7 @@ static int machines__deliver_event(struct machines 
*machines,
                return tool->exit(tool, event, sample, machine);
        case PERF_RECORD_LOST:
                if (tool->lost == perf_event__process_lost)
-                       evlist->stats.total_lost += event->lost.lost;
+                       stats->total_lost += event->lost.lost;
                return tool->lost(tool, event, sample, machine);
        case PERF_RECORD_READ:
                return tool->read(tool, event, sample, evsel, machine);
@@ -1061,12 +1068,13 @@ static int machines__deliver_event(struct machines 
*machines,
        case PERF_RECORD_ITRACE_START:
                return tool->itrace_start(tool, event, sample, machine);
        default:
-               ++evlist->stats.nr_unknown_events;
+               ++stats->nr_unknown_events;
                return -1;
        }
 }
 
 static int perf_session__deliver_event(struct perf_session *session,
+                                      struct events_stats *stats,
                                       union perf_event *event,
                                       struct perf_sample *sample,
                                       struct perf_tool *tool,
@@ -1080,8 +1088,9 @@ static int perf_session__deliver_event(struct 
perf_session *session,
        if (ret > 0)
                return 0;
 
-       return machines__deliver_event(&session->machines, session->evlist,
-                                      event, sample, tool, file_offset);
+       return machines__deliver_event(&session->machines, stats,
+                                      session->evlist, event, sample,
+                                      tool, file_offset);
 }
 
 static s64 perf_session__process_user_event(struct perf_session *session,
@@ -1146,7 +1155,8 @@ int perf_session__deliver_synth_event(struct perf_session 
*session,
        if (event->header.type >= PERF_RECORD_USER_TYPE_START)
                return perf_session__process_user_event(session, event, 0);
 
-       return machines__deliver_event(&session->machines, evlist, event, 
sample, tool, 0);
+       return machines__deliver_event(&session->machines, &evlist->stats,
+                                      evlist, event, sample, tool, 0);
 }
 
 static void event_swap(union perf_event *event, bool sample_id_all)
@@ -1214,7 +1224,9 @@ int perf_session__peek_event(struct perf_session 
*session, off_t file_offset,
 }
 
 static s64 perf_session__process_event(struct perf_session *session,
-                                      union perf_event *event, u64 file_offset)
+                                      struct events_stats *stats,
+                                      union perf_event *event,
+                                      u64 file_offset)
 {
        struct perf_evlist *evlist = session->evlist;
        struct perf_tool *tool = session->tool;
@@ -1227,7 +1239,7 @@ static s64 perf_session__process_event(struct 
perf_session *session,
        if (event->header.type >= PERF_RECORD_HEADER_MAX)
                return -EINVAL;
 
-       events_stats__inc(&evlist->stats, event->header.type);
+       events_stats__inc(stats, event->header.type);
 
        if (event->header.type >= PERF_RECORD_USER_TYPE_START)
                return perf_session__process_user_event(session, event, 
file_offset);
@@ -1245,8 +1257,8 @@ static s64 perf_session__process_event(struct 
perf_session *session,
                        return ret;
        }
 
-       return perf_session__deliver_event(session, event, &sample, tool,
-                                          file_offset);
+       return perf_session__deliver_event(session, stats, event,
+                                          &sample, tool, file_offset);
 }
 
 void perf_event_header__bswap(struct perf_event_header *hdr)
@@ -1274,9 +1286,9 @@ static struct thread 
*perf_session__register_idle_thread(struct perf_session *se
        return thread;
 }
 
-static void perf_session__warn_about_errors(const struct perf_session *session)
+static void perf_session__warn_about_errors(const struct perf_session *session,
+                                           const struct events_stats *stats)
 {
-       const struct events_stats *stats = &session->evlist->stats;
        const struct ordered_events *oe = &session->ordered_events;
 
        if (session->tool->lost == perf_event__process_lost &&
@@ -1326,6 +1338,7 @@ volatile int session_done;
 static int __perf_session__process_pipe_events(struct perf_session *session)
 {
        struct ordered_events *oe = &session->ordered_events;
+       struct events_stats *stats = &session->evlist->stats;
        struct perf_tool *tool = session->tool;
        int fd = perf_data_file__fd(session->file);
        union perf_event *event;
@@ -1390,7 +1403,8 @@ static int __perf_session__process_pipe_events(struct 
perf_session *session)
                }
        }
 
-       if ((skip = perf_session__process_event(session, event, head)) < 0) {
+       if ((skip = perf_session__process_event(session, stats, event,
+                                               head)) < 0) {
                pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
                       head, event->header.size, event->header.type);
                err = -EINVAL;
@@ -1412,7 +1426,7 @@ static int __perf_session__process_pipe_events(struct 
perf_session *session)
        err = auxtrace__flush_events(session, tool);
 out_err:
        free(buf);
-       perf_session__warn_about_errors(session);
+       perf_session__warn_about_errors(session, stats);
        ordered_events__free(&session->ordered_events);
        auxtrace__free_events(session);
        return err;
@@ -1459,6 +1473,7 @@ fetch_mmaped_event(struct perf_session *session,
 #endif
 
 static int __perf_session__process_events(struct perf_session *session,
+                                         struct events_stats *stats,
                                          u64 data_offset, u64 data_size,
                                          u64 file_size)
 {
@@ -1534,7 +1549,8 @@ static int __perf_session__process_events(struct 
perf_session *session,
        size = event->header.size;
 
        if (size < sizeof(struct perf_event_header) ||
-           (skip = perf_session__process_event(session, event, file_pos)) < 0) 
{
+           (skip = perf_session__process_event(session, stats, event,
+                                               file_pos)) < 0) {
                pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
                       file_offset + head, event->header.size,
                       event->header.type);
@@ -1575,6 +1591,7 @@ static int __perf_session__process_indexed_events(struct 
perf_session *session)
        struct perf_data_file *file = session->file;
        struct perf_tool *tool = session->tool;
        u64 size = perf_data_file__size(file);
+       struct events_stats *stats = &session->evlist->stats;
        int err = 0, i;
 
        for (i = 0; i < (int)session->header.nr_index; i++) {
@@ -1591,13 +1608,14 @@ static int 
__perf_session__process_indexed_events(struct perf_session *session)
                if (i > 0)
                        tool->ordered_events = false;
 
-               err = __perf_session__process_events(session, idx->offset,
+               err = __perf_session__process_events(session, stats,
+                                                    idx->offset,
                                                     idx->size, size);
                if (err < 0)
                        break;
        }
 
-       perf_session__warn_about_errors(session);
+       perf_session__warn_about_errors(session, stats);
        return err;
 }
 
@@ -1605,6 +1623,7 @@ int perf_session__process_events(struct perf_session 
*session)
 {
        struct perf_data_file *file = session->file;
        u64 size = perf_data_file__size(file);
+       struct events_stats *stats = &session->evlist->stats;
        int err;
 
        if (perf_session__register_idle_thread(session) == NULL)
@@ -1615,12 +1634,12 @@ int perf_session__process_events(struct perf_session 
*session)
        if (perf_has_index)
                return __perf_session__process_indexed_events(session);
 
-       err = __perf_session__process_events(session,
+       err = __perf_session__process_events(session, stats,
                                             session->header.data_offset,
                                             session->header.data_size,
                                             size);
 
-       perf_session__warn_about_errors(session);
+       perf_session__warn_about_errors(session, stats);
        return err;
 }
 
-- 
2.4.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to