perf tools: Fix synthesizing fork_event.ppid for non-main thread
authorDavid Ahern <david.ahern@oracle.com>
Thu, 9 Apr 2015 16:48:27 +0000 (12:48 -0400)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 10 Apr 2015 13:10:55 +0000 (10:10 -0300)
Commit ca6c41c59b9 sets the ppid based on what is read from the
/proc/pid/status file when synthesizing fork events.

This is correct thing to do for new processes but not threads of a
process.

Fix ppid for threads to be the main thread when synthesizing fork events
(ie., assume main thread spawned all sub-threads in a process).

Reported-by: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
Signed-off-by: David Ahern <david.ahern@oracle.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Don Zickus <dzickus@redhat.com>
Link: http://lkml.kernel.org/r/1428598107-178999-1-git-send-email-david.ahern@oracle.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/event.c

index 5516236df6ab7ac4ab45b578162696d1e013ea9e..9d09851312522e78d3ffebc733933fa222083100 100644 (file)
@@ -183,8 +183,18 @@ static int perf_event__synthesize_fork(struct perf_tool *tool,
 {
        memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);
 
-       event->fork.ppid = ppid;
-       event->fork.ptid = ppid;
+       /*
+        * for main thread set parent to ppid from status file. For other
+        * threads set parent pid to main thread. ie., assume main thread
+        * spawns all threads in a process
+       */
+       if (tgid == pid) {
+               event->fork.ppid = ppid;
+               event->fork.ptid = ppid;
+       } else {
+               event->fork.ppid = tgid;
+               event->fork.ptid = tgid;
+       }
        event->fork.pid  = tgid;
        event->fork.tid  = pid;
        event->fork.header.type = PERF_RECORD_FORK;