linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] perf: fix broken perf inject -b
@ 2012-01-13 14:47 Stephane Eranian
  2012-01-13 16:53 ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-01-13 14:47 UTC (permalink / raw)
  To: linux-kernel; +Cc: acme, peterz, mingo, robert.richter


perf inject -b was broken. It would not inject any build_ids
into the stream. Furthermore, it would strip samples from the
stream.

The reason was a missing initialization of the event attribute
structures. The perf_tool.tool.attr() callback was pointing to
a simple repipe. But there was no initialization of internal data
structures to keep track of events and event ids. That later caused
event id lookups to fail, and samples would get dropped.

The patch simply adds back the call to perf_event__process_attr()
to initialize the evlist structure. Build_ids are again injected.
The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.

Signed-off-by: Stephane Eranian <eranian@google.com>
---

diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 09c1061..f38f370 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
 static int perf_event__repipe_attr(union perf_event *event,
 				   struct perf_evlist **pevlist __used)
 {
+	int ret;
+	ret = perf_event__process_attr(event, pevlist);
+	if (ret)
+		return ret;
+
 	return perf_event__repipe_synth(NULL, event, NULL);
 }
 
@@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
 		       event->header.type);
 		goto repipe;
 	}
+	machine->pid = event->ip.pid;
 
 	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
 			      event->ip.ip, &al);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-13 14:47 [PATCH] perf: fix broken perf inject -b Stephane Eranian
@ 2012-01-13 16:53 ` Arnaldo Carvalho de Melo
  2012-01-13 16:54   ` Stephane Eranian
  0 siblings, 1 reply; 14+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-01-13 16:53 UTC (permalink / raw)
  To: Stephane Eranian; +Cc: linux-kernel, peterz, mingo, robert.richter

Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
> 
> perf inject -b was broken. It would not inject any build_ids
> into the stream. Furthermore, it would strip samples from the
> stream.

Against which tree is this patch?
 
> The reason was a missing initialization of the event attribute
> structures. The perf_tool.tool.attr() callback was pointing to
> a simple repipe. But there was no initialization of internal data
> structures to keep track of events and event ids. That later caused
> event id lookups to fail, and samples would get dropped.
> 
> The patch simply adds back the call to perf_event__process_attr()
> to initialize the evlist structure. Build_ids are again injected.
> The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.
> 
> Signed-off-by: Stephane Eranian <eranian@google.com>
> ---
> 
> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> index 09c1061..f38f370 100644
> --- a/tools/perf/builtin-inject.c
> +++ b/tools/perf/builtin-inject.c
> @@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
>  static int perf_event__repipe_attr(union perf_event *event,
>  				   struct perf_evlist **pevlist __used)
>  {
> +	int ret;
> +	ret = perf_event__process_attr(event, pevlist);
> +	if (ret)
> +		return ret;
> +
>  	return perf_event__repipe_synth(NULL, event, NULL);
>  }
>  
> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>  		       event->header.type);
>  		goto repipe;
>  	}
> +	machine->pid = event->ip.pid;
>  
>  	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
>  			      event->ip.ip, &al);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-13 16:53 ` Arnaldo Carvalho de Melo
@ 2012-01-13 16:54   ` Stephane Eranian
  2012-01-16 18:53     ` Stephane Eranian
  2012-01-26 14:16     ` Stephane Eranian
  0 siblings, 2 replies; 14+ messages in thread
From: Stephane Eranian @ 2012-01-13 16:54 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-kernel, peterz, mingo, robert.richter

On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo
<acme@redhat.com> wrote:
> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
>>
>> perf inject -b was broken. It would not inject any build_ids
>> into the stream. Furthermore, it would strip samples from the
>> stream.
>
> Against which tree is this patch?
>
3.2.0-rc7-tip.
Did that get fixed later on?

>> The reason was a missing initialization of the event attribute
>> structures. The perf_tool.tool.attr() callback was pointing to
>> a simple repipe. But there was no initialization of internal data
>> structures to keep track of events and event ids. That later caused
>> event id lookups to fail, and samples would get dropped.
>>
>> The patch simply adds back the call to perf_event__process_attr()
>> to initialize the evlist structure. Build_ids are again injected.
>> The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.
>>
>> Signed-off-by: Stephane Eranian <eranian@google.com>
>> ---
>>
>> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
>> index 09c1061..f38f370 100644
>> --- a/tools/perf/builtin-inject.c
>> +++ b/tools/perf/builtin-inject.c
>> @@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
>>  static int perf_event__repipe_attr(union perf_event *event,
>>                                  struct perf_evlist **pevlist __used)
>>  {
>> +     int ret;
>> +     ret = perf_event__process_attr(event, pevlist);
>> +     if (ret)
>> +             return ret;
>> +
>>       return perf_event__repipe_synth(NULL, event, NULL);
>>  }
>>
>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>>                      event->header.type);
>>               goto repipe;
>>       }
>> +     machine->pid = event->ip.pid;
>>
>>       thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
>>                             event->ip.ip, &al);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-13 16:54   ` Stephane Eranian
@ 2012-01-16 18:53     ` Stephane Eranian
  2012-01-30 19:00       ` Arnaldo Carvalho de Melo
  2012-01-26 14:16     ` Stephane Eranian
  1 sibling, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-01-16 18:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-kernel, peterz, mingo, robert.richter

Arnaldo,

On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo
> <acme@redhat.com> wrote:
>> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
>>>
>>> perf inject -b was broken. It would not inject any build_ids
>>> into the stream. Furthermore, it would strip samples from the
>>> stream.
>>
>> Against which tree is this patch?
>>
> 3.2.0-rc7-tip.
> Did that get fixed later on?
>
>>> The reason was a missing initialization of the event attribute
>>> structures. The perf_tool.tool.attr() callback was pointing to
>>> a simple repipe. But there was no initialization of internal data
>>> structures to keep track of events and event ids. That later caused
>>> event id lookups to fail, and samples would get dropped.
>>>
>>> The patch simply adds back the call to perf_event__process_attr()
>>> to initialize the evlist structure. Build_ids are again injected.
>>> The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.
>>>
>>> Signed-off-by: Stephane Eranian <eranian@google.com>
>>> ---
>>>
>>> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
>>> index 09c1061..f38f370 100644
>>> --- a/tools/perf/builtin-inject.c
>>> +++ b/tools/perf/builtin-inject.c
>>> @@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
>>>  static int perf_event__repipe_attr(union perf_event *event,
>>>                                  struct perf_evlist **pevlist __used)
>>>  {
>>> +     int ret;
>>> +     ret = perf_event__process_attr(event, pevlist);
>>> +     if (ret)
>>> +             return ret;
>>> +
>>>       return perf_event__repipe_synth(NULL, event, NULL);
>>>  }
>>>
>>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>>>                      event->header.type);
>>>               goto repipe;
>>>       }
>>> +     machine->pid = event->ip.pid;
>>>
I noticed that this statement conflicts with perf buildid-list (which
I am also fixing for pipe mode).
I don't quite understand why, though.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-13 16:54   ` Stephane Eranian
  2012-01-16 18:53     ` Stephane Eranian
@ 2012-01-26 14:16     ` Stephane Eranian
  2012-01-26 14:23       ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-01-26 14:16 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-kernel, peterz, mingo, robert.richter

On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo
> <acme@redhat.com> wrote:
>> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
>>>
>>> perf inject -b was broken. It would not inject any build_ids
>>> into the stream. Furthermore, it would strip samples from the
>>> stream.
>>
>> Against which tree is this patch?
>>
> 3.2.0-rc7-tip.
> Did that get fixed later on?
>
Did you look at this patch?

>>> The reason was a missing initialization of the event attribute
>>> structures. The perf_tool.tool.attr() callback was pointing to
>>> a simple repipe. But there was no initialization of internal data
>>> structures to keep track of events and event ids. That later caused
>>> event id lookups to fail, and samples would get dropped.
>>>
>>> The patch simply adds back the call to perf_event__process_attr()
>>> to initialize the evlist structure. Build_ids are again injected.
>>> The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.
>>>
>>> Signed-off-by: Stephane Eranian <eranian@google.com>
>>> ---
>>>
>>> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
>>> index 09c1061..f38f370 100644
>>> --- a/tools/perf/builtin-inject.c
>>> +++ b/tools/perf/builtin-inject.c
>>> @@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
>>>  static int perf_event__repipe_attr(union perf_event *event,
>>>                                  struct perf_evlist **pevlist __used)
>>>  {
>>> +     int ret;
>>> +     ret = perf_event__process_attr(event, pevlist);
>>> +     if (ret)
>>> +             return ret;
>>> +
>>>       return perf_event__repipe_synth(NULL, event, NULL);
>>>  }
>>>
>>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>>>                      event->header.type);
>>>               goto repipe;
>>>       }
>>> +     machine->pid = event->ip.pid;
>>>
>>>       thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
>>>                             event->ip.ip, &al);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-26 14:16     ` Stephane Eranian
@ 2012-01-26 14:23       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 14+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-01-26 14:23 UTC (permalink / raw)
  To: Stephane Eranian; +Cc: linux-kernel, peterz, mingo, robert.richter

Em Thu, Jan 26, 2012 at 03:16:15PM +0100, Stephane Eranian escreveu:
> On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> > On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo
> > <acme@redhat.com> wrote:
> >> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
> >>>
> >>> perf inject -b was broken. It would not inject any build_ids
> >>> into the stream. Furthermore, it would strip samples from the
> >>> stream.
> >>
> >> Against which tree is this patch?
> >>
> > 3.2.0-rc7-tip.
> > Did that get fixed later on?
> >
> Did you look at this patch?

Looking at it now.

- Arnaldo
 
> >>> The reason was a missing initialization of the event attribute
> >>> structures. The perf_tool.tool.attr() callback was pointing to
> >>> a simple repipe. But there was no initialization of internal data
> >>> structures to keep track of events and event ids. That later caused
> >>> event id lookups to fail, and samples would get dropped.
> >>>
> >>> The patch simply adds back the call to perf_event__process_attr()
> >>> to initialize the evlist structure. Build_ids are again injected.
> >>> The PID is also inject for PERF_RECORD_HEADER_BUILD_ID.
> >>>
> >>> Signed-off-by: Stephane Eranian <eranian@google.com>
> >>> ---
> >>>
> >>> diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
> >>> index 09c1061..f38f370 100644
> >>> --- a/tools/perf/builtin-inject.c
> >>> +++ b/tools/perf/builtin-inject.c
> >>> @@ -60,6 +60,11 @@ static int perf_event__repipe_tracing_data_synth(union perf_event *event,
> >>>  static int perf_event__repipe_attr(union perf_event *event,
> >>>                                  struct perf_evlist **pevlist __used)
> >>>  {
> >>> +     int ret;
> >>> +     ret = perf_event__process_attr(event, pevlist);
> >>> +     if (ret)
> >>> +             return ret;
> >>> +
> >>>       return perf_event__repipe_synth(NULL, event, NULL);
> >>>  }
> >>>
> >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> >>>                      event->header.type);
> >>>               goto repipe;
> >>>       }
> >>> +     machine->pid = event->ip.pid;
> >>>
> >>>       thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
> >>>                             event->ip.ip, &al);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-16 18:53     ` Stephane Eranian
@ 2012-01-30 19:00       ` Arnaldo Carvalho de Melo
  2012-01-30 19:53         ` Stephane Eranian
  0 siblings, 1 reply; 14+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-01-30 19:00 UTC (permalink / raw)
  To: Stephane Eranian; +Cc: linux-kernel, peterz, mingo, robert.richter

Em Mon, Jan 16, 2012 at 07:53:28PM +0100, Stephane Eranian escreveu:
> On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> > On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo <acme@redhat.com> wrote:
> >> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
> >>> perf inject -b was broken. It would not inject any build_ids
> >>> into the stream. Furthermore, it would strip samples from the
> >>> stream.
<SNIP>
> >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> >>>               goto repipe;
> >>>       }
> >>> +     machine->pid = event->ip.pid;

> I noticed that this statement conflicts with perf buildid-list (which
> I am also fixing for pipe mode).

> I don't quite understand why, though.

Have you reached any conclusion about this problem? I haven't looked at
it in detail, could you please elaborate more?

- Arnaldo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-30 19:00       ` Arnaldo Carvalho de Melo
@ 2012-01-30 19:53         ` Stephane Eranian
  2012-01-30 20:04           ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-01-30 19:53 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-kernel, peterz, mingo, robert.richter

On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
<acme@redhat.com> wrote:
>
> Em Mon, Jan 16, 2012 at 07:53:28PM +0100, Stephane Eranian escreveu:
> > On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> > > On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo <acme@redhat.com> wrote:
> > >> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
> > >>> perf inject -b was broken. It would not inject any build_ids
> > >>> into the stream. Furthermore, it would strip samples from the
> > >>> stream.
> <SNIP>
> > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> > >>>               goto repipe;
> > >>>       }
> > >>> +     machine->pid = event->ip.pid;
>
> > I noticed that this statement conflicts with perf buildid-list (which
> > I am also fixing for pipe mode).
>
> > I don't quite understand why, though.
>
> Have you reached any conclusion about this problem? I haven't looked at
> it in detail, could you please elaborate more?
>

I ended up removing it. But I am not sure this is correct.
Is the pid used in any way when processing buildids?

>
> - Arnaldo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-30 19:53         ` Stephane Eranian
@ 2012-01-30 20:04           ` Arnaldo Carvalho de Melo
  2012-01-30 20:09             ` Stephane Eranian
  0 siblings, 1 reply; 14+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-01-30 20:04 UTC (permalink / raw)
  To: Stephane Eranian; +Cc: linux-kernel, peterz, mingo, robert.richter

Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
> <acme@redhat.com> wrote:
> >
> > Em Mon, Jan 16, 2012 at 07:53:28PM +0100, Stephane Eranian escreveu:
> > > On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
> > > > On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo <acme@redhat.com> wrote:
> > > >> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
> > > >>> perf inject -b was broken. It would not inject any build_ids
> > > >>> into the stream. Furthermore, it would strip samples from the
> > > >>> stream.
> > <SNIP>
> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> > > >>>               goto repipe;
> > > >>>       }
> > > >>> +     machine->pid = event->ip.pid;
> >
> > > I noticed that this statement conflicts with perf buildid-list (which
> > > I am also fixing for pipe mode).
> >
> > > I don't quite understand why, though.
> >
> > Have you reached any conclusion about this problem? I haven't looked at
> > it in detail, could you please elaborate more?
> >
> 
> I ended up removing it. But I am not sure this is correct.
> Is the pid used in any way when processing buildids?

I can't think of any.

The same DSO could conceivably be present in the virtual machine, the
host, and in the workstation used for perf report.  We just use the
build-id in the perf.data file to find the right symtab.

- Arnaldo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-30 20:04           ` Arnaldo Carvalho de Melo
@ 2012-01-30 20:09             ` Stephane Eranian
  2012-01-30 20:36               ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-01-30 20:09 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: linux-kernel, peterz, mingo, robert.richter

On Mon, Jan 30, 2012 at 9:04 PM, Arnaldo Carvalho de Melo
<acme@redhat.com> wrote:
> Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
>> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
>> <acme@redhat.com> wrote:
>> >
>> > Em Mon, Jan 16, 2012 at 07:53:28PM +0100, Stephane Eranian escreveu:
>> > > On Fri, Jan 13, 2012 at 5:54 PM, Stephane Eranian <eranian@google.com> wrote:
>> > > > On Fri, Jan 13, 2012 at 5:53 PM, Arnaldo Carvalho de Melo <acme@redhat.com> wrote:
>> > > >> Em Fri, Jan 13, 2012 at 03:47:31PM +0100, Stephane Eranian escreveu:
>> > > >>> perf inject -b was broken. It would not inject any build_ids
>> > > >>> into the stream. Furthermore, it would strip samples from the
>> > > >>> stream.
>> > <SNIP>
>> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>> > > >>>               goto repipe;
>> > > >>>       }
>> > > >>> +     machine->pid = event->ip.pid;
>> >
>> > > I noticed that this statement conflicts with perf buildid-list (which
>> > > I am also fixing for pipe mode).
>> >
>> > > I don't quite understand why, though.
>> >
>> > Have you reached any conclusion about this problem? I haven't looked at
>> > it in detail, could you please elaborate more?
>> >
>>
>> I ended up removing it. But I am not sure this is correct.
>> Is the pid used in any way when processing buildids?
>
> I can't think of any.
>
> The same DSO could conceivably be present in the virtual machine, the
> host, and in the workstation used for perf report.  We just use the
> build-id in the perf.data file to find the right symtab.
>
Right, so I don't know why it's there...

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-30 20:09             ` Stephane Eranian
@ 2012-01-30 20:36               ` Arnaldo Carvalho de Melo
  2012-01-31  5:58                 ` Yanmin Zhang
  0 siblings, 1 reply; 14+ messages in thread
From: Arnaldo Carvalho de Melo @ 2012-01-30 20:36 UTC (permalink / raw)
  To: Zhang Yanmin
  Cc: Stephane Eranian, linux-kernel, peterz, mingo, robert.richter,
	Avi Kivity

Em Mon, Jan 30, 2012 at 09:09:17PM +0100, Stephane Eranian escreveu:
> On Mon, Jan 30, 2012 at 9:04 PM, Arnaldo Carvalho de Melo
> <acme@redhat.com> wrote:
> > Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
> >> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
> >> <acme@redhat.com> wrote:
> >> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> >> > > >>>               goto repipe;
> >> > > >>>       }
> >> > > >>> +     machine->pid = event->ip.pid;
> >> >
> >> > > I noticed that this statement conflicts with perf buildid-list (which
> >> > > I am also fixing for pipe mode).

> >> > > I don't quite understand why, though.

> >> > Have you reached any conclusion about this problem? I haven't looked at
> >> > it in detail, could you please elaborate more?

> >> I ended up removing it. But I am not sure this is correct.
> >> Is the pid used in any way when processing buildids?
> >
> > I can't think of any.
> >
> > The same DSO could conceivably be present in the virtual machine, the
> > host, and in the workstation used for perf report.  We just use the
> > build-id in the perf.data file to find the right symtab.

> Right, so I don't know why it's there...

This comes from a1645ce1:

commit a1645ce12adb6c9cc9e19d7695466204e3f017fe
Author: Zhang, Yanmin <yanmin_zhang@linux.intel.com>
Date:   Mon Apr 19 13:32:50 2010 +0800

    perf: 'perf kvm' tool for monitoring guest performance from host
    
    Here is the patch of userspace perf tool.
    
    Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
    Signed-off-by: Avi Kivity <avi@redhat.com>



Zhang, what was the thinking about that pid in the buildid event?

>From what I can see we can just ignore it :-\

- Arnaldo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-30 20:36               ` Arnaldo Carvalho de Melo
@ 2012-01-31  5:58                 ` Yanmin Zhang
  2012-02-02 11:22                   ` Stephane Eranian
  0 siblings, 1 reply; 14+ messages in thread
From: Yanmin Zhang @ 2012-01-31  5:58 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Stephane Eranian, linux-kernel, peterz, mingo, robert.richter,
	Avi Kivity

On Mon, 2012-01-30 at 18:36 -0200, Arnaldo Carvalho de Melo wrote:
> Em Mon, Jan 30, 2012 at 09:09:17PM +0100, Stephane Eranian escreveu:
> > On Mon, Jan 30, 2012 at 9:04 PM, Arnaldo Carvalho de Melo
> > <acme@redhat.com> wrote:
> > > Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
> > >> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
> > >> <acme@redhat.com> wrote:
> > >> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> > >> > > >>>               goto repipe;
> > >> > > >>>       }
> > >> > > >>> +     machine->pid = event->ip.pid;
> > >> >
> > >> > > I noticed that this statement conflicts with perf buildid-list (which
> > >> > > I am also fixing for pipe mode).
> 
> > >> > > I don't quite understand why, though.
> 
> > >> > Have you reached any conclusion about this problem? I haven't looked at
> > >> > it in detail, could you please elaborate more?
> 
> > >> I ended up removing it. But I am not sure this is correct.
> > >> Is the pid used in any way when processing buildids?
> > >
> > > I can't think of any.
> > >
> > > The same DSO could conceivably be present in the virtual machine, the
> > > host, and in the workstation used for perf report.  We just use the
> > > build-id in the perf.data file to find the right symtab.
> 
> > Right, so I don't know why it's there...
> 
> This comes from a1645ce1:
> 
> commit a1645ce12adb6c9cc9e19d7695466204e3f017fe
> Author: Zhang, Yanmin <yanmin_zhang@linux.intel.com>
> Date:   Mon Apr 19 13:32:50 2010 +0800
> 
>     perf: 'perf kvm' tool for monitoring guest performance from host
>     
>     Here is the patch of userspace perf tool.
>     
>     Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
>     Signed-off-by: Avi Kivity <avi@redhat.com>
> 
> 
> 
> Zhang, what was the thinking about that pid in the buildid event?
I didn't work on it for a long time because of some special reasons.
I check it quickly and below are some explanation.

machine->pid is to support KVM multiple guest os kernels.
1) The guest os kernels might be different version of kernels from host's;
2) The guest os might be Windows.

At host side, every guest os is a process of host although it's multi-threaded.
machine->pid is to save its pid. The pid of host itself is HOST_KERNEL_ID.

In guest os, there are many processes. host os doesn't know them. So currently or
when I enhanced perf to support KVM, perf filters out guest os user space
detailed event samples while still keeping guest os user space simple counters.

event->ip.pid is equal to machine->pid only when 
((event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_GUEST_KERNEL).

In function perf_event__inject_buildid, we shouldn't reset machine->pid to
event->ip.pid. They are equal to each other if it's a guest os event. Isn't it?
If the event is host event, event->ip.pid points to a real process at host
and it shouldn't be equal to machine->pid (HOST_KERNEL_ID).

Yanmin



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-01-31  5:58                 ` Yanmin Zhang
@ 2012-02-02 11:22                   ` Stephane Eranian
  2012-02-03  3:30                     ` Yanmin Zhang
  0 siblings, 1 reply; 14+ messages in thread
From: Stephane Eranian @ 2012-02-02 11:22 UTC (permalink / raw)
  To: yanmin_zhang
  Cc: Arnaldo Carvalho de Melo, linux-kernel, peterz, mingo,
	robert.richter, Avi Kivity

On Tue, Jan 31, 2012 at 6:58 AM, Yanmin Zhang
<yanmin_zhang@linux.intel.com> wrote:
> On Mon, 2012-01-30 at 18:36 -0200, Arnaldo Carvalho de Melo wrote:
>> Em Mon, Jan 30, 2012 at 09:09:17PM +0100, Stephane Eranian escreveu:
>> > On Mon, Jan 30, 2012 at 9:04 PM, Arnaldo Carvalho de Melo
>> > <acme@redhat.com> wrote:
>> > > Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
>> > >> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
>> > >> <acme@redhat.com> wrote:
>> > >> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
>> > >> > > >>>               goto repipe;
>> > >> > > >>>       }
>> > >> > > >>> +     machine->pid = event->ip.pid;
>> > >> >
>> > >> > > I noticed that this statement conflicts with perf buildid-list (which
>> > >> > > I am also fixing for pipe mode).
>>
>> > >> > > I don't quite understand why, though.
>>
>> > >> > Have you reached any conclusion about this problem? I haven't looked at
>> > >> > it in detail, could you please elaborate more?
>>
>> > >> I ended up removing it. But I am not sure this is correct.
>> > >> Is the pid used in any way when processing buildids?
>> > >
>> > > I can't think of any.
>> > >
>> > > The same DSO could conceivably be present in the virtual machine, the
>> > > host, and in the workstation used for perf report.  We just use the
>> > > build-id in the perf.data file to find the right symtab.
>>
>> > Right, so I don't know why it's there...
>>
>> This comes from a1645ce1:
>>
>> commit a1645ce12adb6c9cc9e19d7695466204e3f017fe
>> Author: Zhang, Yanmin <yanmin_zhang@linux.intel.com>
>> Date:   Mon Apr 19 13:32:50 2010 +0800
>>
>>     perf: 'perf kvm' tool for monitoring guest performance from host
>>
>>     Here is the patch of userspace perf tool.
>>
>>     Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
>>     Signed-off-by: Avi Kivity <avi@redhat.com>
>>
>>
>>
>> Zhang, what was the thinking about that pid in the buildid event?
> I didn't work on it for a long time because of some special reasons.
> I check it quickly and below are some explanation.
>
> machine->pid is to support KVM multiple guest os kernels.
> 1) The guest os kernels might be different version of kernels from host's;
> 2) The guest os might be Windows.
>
I understand that.

> At host side, every guest os is a process of host although it's multi-threaded.
Yes.
> machine->pid is to save its pid. The pid of host itself is HOST_KERNEL_ID.
>
What do you mean by the 'pid of the host'? You always capture samples on the
host on behalf of a host task. I see PID:-1 to simulate mmap of the kernel in
the perf.data file. Is that what you are referring to?

> In guest os, there are many processes. host os doesn't know them. So currently or

Yes.

> when I enhanced perf to support KVM, perf filters out guest os user space
> detailed event samples while still keeping guest os user space simple counters.
>
That is not clear to me. Are you saying, you have no visibility into
the guest OS
user space processes, samples captured at that level are attributed to
guest kernel?
Or are you simply dropping them?

> event->ip.pid is equal to machine->pid only when
> ((event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_GUEST_KERNEL).
>
> In function perf_event__inject_buildid, we shouldn't reset machine->pid to
> event->ip.pid. They are equal to each other if it's a guest os event. Isn't it?

I have not tried capturing samples on a kvm process. So I don't know.

> If the event is host event, event->ip.pid points to a real process at host
> and it shouldn't be equal to machine->pid (HOST_KERNEL_ID).
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] perf: fix broken perf inject -b
  2012-02-02 11:22                   ` Stephane Eranian
@ 2012-02-03  3:30                     ` Yanmin Zhang
  0 siblings, 0 replies; 14+ messages in thread
From: Yanmin Zhang @ 2012-02-03  3:30 UTC (permalink / raw)
  To: Stephane Eranian
  Cc: Arnaldo Carvalho de Melo, linux-kernel, peterz, mingo,
	robert.richter, Avi Kivity

On Thu, 2012-02-02 at 12:22 +0100, Stephane Eranian wrote:
> On Tue, Jan 31, 2012 at 6:58 AM, Yanmin Zhang
> <yanmin_zhang@linux.intel.com> wrote:
> > On Mon, 2012-01-30 at 18:36 -0200, Arnaldo Carvalho de Melo wrote:
> >> Em Mon, Jan 30, 2012 at 09:09:17PM +0100, Stephane Eranian escreveu:
> >> > On Mon, Jan 30, 2012 at 9:04 PM, Arnaldo Carvalho de Melo
> >> > <acme@redhat.com> wrote:
> >> > > Em Mon, Jan 30, 2012 at 08:53:26PM +0100, Stephane Eranian escreveu:
> >> > >> On Mon, Jan 30, 2012 at 8:00 PM, Arnaldo Carvalho de Melo
> >> > >> <acme@redhat.com> wrote:
> >> > >> > > >>> @@ -173,6 +178,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
> >> > >> > > >>>               goto repipe;
> >> > >> > > >>>       }
> >> > >> > > >>> +     machine->pid = event->ip.pid;
> >> > >> >
> >> > >> > > I noticed that this statement conflicts with perf buildid-list (which
> >> > >> > > I am also fixing for pipe mode).
> >>
> >> > >> > > I don't quite understand why, though.
> >>
> >> > >> > Have you reached any conclusion about this problem? I haven't looked at
> >> > >> > it in detail, could you please elaborate more?
> >>
> >> > >> I ended up removing it. But I am not sure this is correct.
> >> > >> Is the pid used in any way when processing buildids?
> >> > >
> >> > > I can't think of any.
> >> > >
> >> > > The same DSO could conceivably be present in the virtual machine, the
> >> > > host, and in the workstation used for perf report.  We just use the
> >> > > build-id in the perf.data file to find the right symtab.
> >>
> >> > Right, so I don't know why it's there...
> >>
> >> This comes from a1645ce1:
> >>
> >> commit a1645ce12adb6c9cc9e19d7695466204e3f017fe
> >> Author: Zhang, Yanmin <yanmin_zhang@linux.intel.com>
> >> Date:   Mon Apr 19 13:32:50 2010 +0800
> >>
> >>     perf: 'perf kvm' tool for monitoring guest performance from host
> >>
> >>     Here is the patch of userspace perf tool.
> >>
> >>     Signed-off-by: Zhang Yanmin <yanmin_zhang@linux.intel.com>
> >>     Signed-off-by: Avi Kivity <avi@redhat.com>
> >>
> >>
> >>
> >> Zhang, what was the thinking about that pid in the buildid event?
> > I didn't work on it for a long time because of some special reasons.
> > I check it quickly and below are some explanation.
> >
> > machine->pid is to support KVM multiple guest os kernels.
> > 1) The guest os kernels might be different version of kernels from host's;
> > 2) The guest os might be Windows.
> >
> I understand that.
> 
> > At host side, every guest os is a process of host although it's multi-threaded.
> Yes.
> > machine->pid is to save its pid. The pid of host itself is HOST_KERNEL_ID.
> >
> What do you mean by the 'pid of the host'? You always capture samples on the
> host on behalf of a host task. I see PID:-1 to simulate mmap of the kernel in
> the perf.data file. Is that what you are referring to?
Yes.

> 
> > In guest os, there are many processes. host os doesn't know them. So currently or
> 
> Yes.
> 
> > when I enhanced perf to support KVM, perf filters out guest os user space
> > detailed event samples while still keeping guest os user space simple counters.
> >
> That is not clear to me. Are you saying, you have no visibility into
> the guest OS
> user space processes, samples captured at that level are attributed to
> guest kernel?
> Or are you simply dropping them?
It depends specific perf subcommand.
1) With per top, besides the specific function symbol statistics, it also shows
the total percent of host_kernel/host_user/guest_kernel/guest_user.
With the function symbol statistics, we drop guest user space data.
With the total percent, we keep them into the calculation of guest user.
static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
{
	...
                case PERF_RECORD_MISC_GUEST_USER:
                        ++top->guest_us_samples;
                        /*
                         * TODO: we don't process guest user from host side
                         * except simple counting.
                         */
                        /* Fall thru */
                default:
                        continue;
                }
	...
}

2) With other subcommands, it seems perf would drop guest user space statistics. Sorry
for my old memory.

> 
> > event->ip.pid is equal to machine->pid only when
> > ((event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_GUEST_KERNEL).
> >
> > In function perf_event__inject_buildid, we shouldn't reset machine->pid to
> > event->ip.pid. They are equal to each other if it's a guest os event. Isn't it?
> 
> I have not tried capturing samples on a kvm process. So I don't know.
There is a local team here working on performance tuning/benchmarking. They
use 'perf kvm' to collect/analyze their guest os performance.



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2012-02-03  3:30 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-13 14:47 [PATCH] perf: fix broken perf inject -b Stephane Eranian
2012-01-13 16:53 ` Arnaldo Carvalho de Melo
2012-01-13 16:54   ` Stephane Eranian
2012-01-16 18:53     ` Stephane Eranian
2012-01-30 19:00       ` Arnaldo Carvalho de Melo
2012-01-30 19:53         ` Stephane Eranian
2012-01-30 20:04           ` Arnaldo Carvalho de Melo
2012-01-30 20:09             ` Stephane Eranian
2012-01-30 20:36               ` Arnaldo Carvalho de Melo
2012-01-31  5:58                 ` Yanmin Zhang
2012-02-02 11:22                   ` Stephane Eranian
2012-02-03  3:30                     ` Yanmin Zhang
2012-01-26 14:16     ` Stephane Eranian
2012-01-26 14:23       ` Arnaldo Carvalho de Melo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).