Skip to content

Commit

Permalink
perf report: Update for the new FORK/EXIT events
Browse files Browse the repository at this point in the history
Since FORK is now also issued for threads, detect those by
comparing the parent and child PID.

Teach it about EXIT events and ignore them.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Aug 2, 2009
1 parent 9f498cc commit 27d028d
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ struct comm_event {
struct fork_event {
struct perf_event_header header;
u32 pid, ppid;
u32 tid, ptid;
};

struct lost_event {
Expand Down Expand Up @@ -1608,15 +1609,27 @@ process_comm_event(event_t *event, unsigned long offset, unsigned long head)
}

static int
process_fork_event(event_t *event, unsigned long offset, unsigned long head)
process_task_event(event_t *event, unsigned long offset, unsigned long head)
{
struct thread *thread = threads__findnew(event->fork.pid);
struct thread *parent = threads__findnew(event->fork.ppid);

dprintf("%p [%p]: PERF_EVENT_FORK: %d:%d\n",
dprintf("%p [%p]: PERF_EVENT_%s: (%d:%d):(%d:%d)\n",
(void *)(offset + head),
(void *)(long)(event->header.size),
event->fork.pid, event->fork.ppid);
event->header.type == PERF_EVENT_FORK ? "FORK" : "EXIT",
event->fork.pid, event->fork.tid,
event->fork.ppid, event->fork.ptid);

/*
* A thread clone will have the same PID for both
* parent and child.
*/
if (thread == parent)
return 0;

if (event->header.type == PERF_EVENT_EXIT)
return 0;

if (!thread || !parent || thread__fork(thread, parent)) {
dprintf("problem processing PERF_EVENT_FORK, skipping event.\n");
Expand Down Expand Up @@ -1706,7 +1719,8 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
return process_comm_event(event, offset, head);

case PERF_EVENT_FORK:
return process_fork_event(event, offset, head);
case PERF_EVENT_EXIT:
return process_task_event(event, offset, head);

case PERF_EVENT_LOST:
return process_lost_event(event, offset, head);
Expand Down

0 comments on commit 27d028d

Please sign in to comment.