All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
	David Carrillo-Cisneros <davidcc@google.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>, He Kuang <hekuang@huawei.com>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Paul Turner <pjt@google.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Simon Que <sque@chromium.org>,
	Stephane Eranian <eranian@google.com>,
	Wang Nan <wangnan0@huawei.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 12/18] perf inject: Copy events when reordering events in pipe mode
Date: Tue, 11 Apr 2017 21:52:09 -0300	[thread overview]
Message-ID: <20170412005215.30135-13-acme@kernel.org> (raw)
In-Reply-To: <20170412005215.30135-1-acme@kernel.org>

From: David Carrillo-Cisneros <davidcc@google.com>

__perf_session__process_pipe_events reuses the same memory buffer to
process all events in the pipe.

When reordering is needed (e.g. -b option), events are not immediately
flushed, but kept around until reordering is possible, causing
memory corruption.

The problem is usually observed by a "Unknown sample error" output. It
can easily be reproduced by:

  perf record -o - noploop | perf inject -b > output

Committer testing:

Before:

  $ perf record -o - stress -t 2 -c 2 | perf inject -b > /dev/null
  stress: info: [8297] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
  stress: info: [8297] successful run completed in 2s
  [ perf record: Woken up 3 times to write data ]
  [ perf record: Captured and wrote 0.000 MB - ]
  Warning:
  Found 1 unknown events!

  Is this an older tool processing a perf.data file generated by a more recent tool?

  If that is not the case, consider reporting to linux-kernel@vger.kernel.org.

  $

After:

  $ perf record -o - stress -t 2 -c 2 | perf inject -b > /dev/null
  stress: info: [9027] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
  stress: info: [9027] successful run completed in 2s
  [ perf record: Woken up 3 times to write data ]
  [ perf record: Captured and wrote 0.000 MB - ]
  no symbols found in /usr/bin/stress, maybe install a debug package?
  no symbols found in /usr/bin/stress, maybe install a debug package?
  $

Signed-off-by: David Carrillo-Cisneros <davidcc@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Paul Turner <pjt@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Simon Que <sque@chromium.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/20170410201432.24807-3-davidcc@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/ordered-events.c | 3 ++-
 tools/perf/util/session.c        | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/ordered-events.c b/tools/perf/util/ordered-events.c
index fe84df1875aa..e70e935b1841 100644
--- a/tools/perf/util/ordered-events.c
+++ b/tools/perf/util/ordered-events.c
@@ -79,7 +79,7 @@ static union perf_event *dup_event(struct ordered_events *oe,
 
 static void free_dup_event(struct ordered_events *oe, union perf_event *event)
 {
-	if (oe->copy_on_queue) {
+	if (event && oe->copy_on_queue) {
 		oe->cur_alloc_size -= event->header.size;
 		free(event);
 	}
@@ -150,6 +150,7 @@ void ordered_events__delete(struct ordered_events *oe, struct ordered_event *eve
 	list_move(&event->list, &oe->cache);
 	oe->nr_events--;
 	free_dup_event(oe, event->event);
+	event->event = NULL;
 }
 
 int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 24259bc2c598..a25302bc55a8 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1656,6 +1656,7 @@ static int __perf_session__process_pipe_events(struct perf_session *session)
 	buf = malloc(cur_size);
 	if (!buf)
 		return -errno;
+	ordered_events__set_copy_on_queue(oe, true);
 more:
 	event = buf;
 	err = readn(fd, event, sizeof(struct perf_event_header));
-- 
2.9.3

  parent reply	other threads:[~2017-04-12  0:53 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-12  0:51 [GIT PULL 00/18] perf/core improvements and fixes Arnaldo Carvalho de Melo
2017-04-12  0:51 ` [PATCH 01/18] perf callchains: Switch from strtok() to strtok_r() when parsing options Arnaldo Carvalho de Melo
2017-04-12  0:51 ` [PATCH 02/18] perf script: Use strtok_r() when parsing output field list Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 03/18] perf evsel: Return exact sub event which failed with EPERM for wildcards Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 04/18] perf stat: Refactor the code to strip csv output with ltrim() Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 05/18] perf ui browser: Refactor the code to parse color configs " Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 06/18] perf pmu: Refactor wordwrap() " Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 07/18] perf tools: Refactor the code to strip command name with {l,r}trim() Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 08/18] perf string: Simplify ltrim() implementation Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 09/18] perf annotate s390: Fix perf annotate error -95 (4.10 regression) Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 10/18] perf annotate s390: Implement jump types for perf annotate Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 11/18] perf inject: Don't proceed if perf_session__process_event() fails Arnaldo Carvalho de Melo
2017-04-12  0:52 ` Arnaldo Carvalho de Melo [this message]
2017-04-12  0:52 ` [PATCH 13/18] perf tools: Describe pipe mode in perf.data-file-fomat.txt Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 14/18] perf annotate: Process attr and build_id records Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 15/18] perf session: Don't rely on evlist in pipe mode Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 16/18] perf tools: Do not print missing features in pipe-mode Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 17/18] perf annotate: Refactor the code to parse disassemble lines with {l,r}trim() Arnaldo Carvalho de Melo
2017-04-12  0:52 ` [PATCH 18/18] perf annotate: Use stripped line instead of raw disassemble line Arnaldo Carvalho de Melo
2017-04-12  5:30 ` [GIT PULL 00/18] perf/core improvements and fixes Ingo Molnar
2017-04-12  7:13   ` Christian Borntraeger
2017-04-12  7:24     ` Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170412005215.30135-13-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=davidcc@google.com \
    --cc=eranian@google.com \
    --cc=hekuang@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=sque@chromium.org \
    --cc=wangnan0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.