From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752776AbbERAps (ORCPT ); Sun, 17 May 2015 20:45:48 -0400 Received: from LGEMRELSE6Q.lge.com ([156.147.1.121]:56013 "EHLO lgemrelse6q.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752451AbbERAmV (ORCPT ); Sun, 17 May 2015 20:42:21 -0400 X-Original-SENDERIP: 10.177.220.203 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Adrian Hunter , Andi Kleen , Frederic Weisbecker , Stephane Eranian Subject: [PATCH 30/40] perf session: Pass struct events stats to event processing functions Date: Mon, 18 May 2015 09:30:45 +0900 Message-Id: <1431909055-21442-31-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.4.0 In-Reply-To: <1431909055-21442-1-git-send-email-namhyung@kernel.org> References: <1431909055-21442-1-git-send-email-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Pass stats structure so that it can point separate object when used in multi-thread environment. Signed-off-by: Namhyung Kim --- 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