Re: [PATCH v2] perf tool: Fix ppid for synthesized fork events

From: Don Zickus
Date: Fri Mar 27 2015 - 16:25:34 EST


On Fri, Mar 27, 2015 at 02:10:54PM -0600, David Ahern wrote:
> On 3/27/15 1:49 PM, Don Zickus wrote:
> >diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
> >index 1c8fbc9..7ee3823 100644
> >--- a/tools/perf/util/thread.c
> >+++ b/tools/perf/util/thread.c
> >@@ -187,6 +187,7 @@ static int thread__clone_map_groups(struct thread *thread,
> > if (thread->pid_ == parent->pid_)
> > return 0;
>
> There's your answer ... the 2 lines above.
>
> >
> >+ printf("DON:\n");
> > /* But this one is new process, copy maps. */
> > for (i = 0; i < MAP__NR_TYPES; ++i)
> > if (map_groups__clone(thread->mg, parent->mg, i) < 0)
> >
> >before David's patch, we do _not_ see any DON markers. After David's patch
> >we see a 1:1 match of DON markers to the number of threads currently running
> >in the system.
>
> Your "speed up" is based on the assumption that all synthesized
> threads are their own parent which is wrong. ie., ppid != tgid of
> the process.

Actually, we originally intended the opposite I think. We were trying to
get perf to avoid reading /proc/<pid>/maps and do the slow and painful ascii
to binary parsing by re-using a similar map (from a forked parent).

Our speed up may have been implemented incorrectly and dumb luck got us a
speed up, but we didn't mean to assume ppid != tgid, IIRC. :-)

I think your's and acme's explaination makes sense. As a result, we are ok
with this patch.

You mentioned a v2, splitting up the patch. I will wait for that patch and
ack it.

Thanks!

Cheers,
Don


>
> Before ppid was getting initialized to -1. If you just make that
> change to revert to the -1:
>
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index d5efa5092ce6..ce4ca061c2e5 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -150,8 +150,8 @@ static int perf_event__synthesize_fork(struct
> perf_tool *tool,
> {
> memset(&event->fork, 0, sizeof(event->fork) + machine->id_hdr_size);
>
> - event->fork.ppid = tgid;
> - event->fork.ptid = tgid;
> + event->fork.ppid = -1;
> + event->fork.ptid = -1;
> event->fork.pid = tgid;
> event->fork.tid = pid;
> event->fork.header.type = PERF_RECORD_FORK;
>
> You see the "DON" messages.
>
> David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/