public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>,
	Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>,
	Jiri Olsa <jolsa@redhat.com>, Jiri Olsa <jolsa@kernel.org>
Cc: linux-kernel@vger.kernel.org, torvalds@linux-foundation.org,
	mingo@kernel.org
Subject: [PATCH 2/3] perf tools: Make fork event processing more resilient
Date: Wed, 19 Aug 2015 17:29:20 +0300	[thread overview]
Message-ID: <1439994561-27436-3-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1439994561-27436-1-git-send-email-adrian.hunter@intel.com>

When processing a fork event, the tools lookup the parent
thread by its tid.  In a couple of cases, it is possible
for that thread to have the wrong pid.  That can happen
if the data is being processed out of order, or if the
(fork) event that would have removed the erroneous
thread was lost.  Assume the latter case, print a dump
message, remove the erroneous thread, create a new one
with the correct pid, and keep going.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
 tools/perf/util/machine.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 7ff682770fdb..f1a4c833121e 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1387,6 +1387,24 @@ int machine__process_fork_event(struct machine *machine, union perf_event *event
 							event->fork.ptid);
 	int err = 0;
 
+	if (dump_trace)
+		perf_event__fprintf_task(event, stdout);
+
+	/*
+	 * There may be an existing thread that is not actually the parent,
+	 * either because we are processing events out of order, or because the
+	 * (fork) event that would have removed the thread was lost. Assume the
+	 * latter case and continue on as best we can.
+	 */
+	if (parent->pid_ != (pid_t)event->fork.ppid) {
+		dump_printf("removing erroneous parent thread %d/%d\n",
+			    parent->pid_, parent->tid);
+		machine__remove_thread(machine, parent);
+		thread__put(parent);
+		parent = machine__findnew_thread(machine, event->fork.ppid,
+						 event->fork.ptid);
+	}
+
 	/* if a thread currently exists for the thread id remove it */
 	if (thread != NULL) {
 		machine__remove_thread(machine, thread);
@@ -1395,8 +1413,6 @@ int machine__process_fork_event(struct machine *machine, union perf_event *event
 
 	thread = machine__findnew_thread(machine, event->fork.pid,
 					 event->fork.tid);
-	if (dump_trace)
-		perf_event__fprintf_task(event, stdout);
 
 	if (thread == NULL || parent == NULL ||
 	    thread__fork(thread, parent, sample->time) < 0) {
-- 
1.9.1


  parent reply	other threads:[~2015-08-19 14:32 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-19 14:29 [PATCH 0/3] perf tools: Fix buildid processing Adrian Hunter
2015-08-19 14:29 ` [PATCH 1/3] perf tools: Avoid deadlock when map_groups are broken Adrian Hunter
2015-08-20  9:59   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-08-19 14:29 ` Adrian Hunter [this message]
2015-08-20 10:00   ` [tip:perf/core] perf tools: Make fork event processing more resilient tip-bot for Adrian Hunter
2015-08-19 14:29 ` [PATCH 3/3] perf tools: Fix buildid processing Adrian Hunter
2015-08-19 15:23   ` Adrian Hunter
2015-08-19 15:42     ` Arnaldo Carvalho de Melo
2015-08-20 10:00   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-08-19 15:22 ` [PATCH 0/3] " Jiri Olsa

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=1439994561-27436-3-git-send-email-adrian.hunter@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=acme@kernel.org \
    --cc=arnaldo.melo@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox