Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-12 Thread Arnaldo Carvalho de Melo
Em Fri, Aug 12, 2016 at 04:06:55PM +1000, Anton Blanchard escreveu:
> Hi Arnaldo,
> 
> > Anyway, Anton, does this fix the problem for you?
> 
> Yes it does, thanks!

Thanks, adding a Tested-by: you.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-12 Thread Arnaldo Carvalho de Melo
Em Fri, Aug 12, 2016 at 04:06:55PM +1000, Anton Blanchard escreveu:
> Hi Arnaldo,
> 
> > Anyway, Anton, does this fix the problem for you?
> 
> Yes it does, thanks!

Thanks, adding a Tested-by: you.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-12 Thread Anton Blanchard
Hi Arnaldo,

> Anyway, Anton, does this fix the problem for you?

Yes it does, thanks!

Anton


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-12 Thread Anton Blanchard
Hi Arnaldo,

> Anyway, Anton, does this fix the problem for you?

Yes it does, thanks!

Anton


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 11:49:00AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Thu, Aug 11, 2016 at 06:51:39PM +0530, Ravi Bangoria escreveu:
> > On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:
> > > Can you please provide a better explanation? I had to look at the patch
> > > to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
> > > ifdefs while the patch description, talks about DWARF.

> > Yes. Explanation could have been better. Apologies for that.

> > arch__post_process_probe_trace_events() calls get_target_map() to prepare
> > symbol table. get_target_map() is defined inside util/probe-event.c.

> > probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
> > Hence arch__post_process_probe_trace_events() needs to be defined inside
> > #ifdef HAVE_LIBELF_SUPPORT to solve compilation error.
 
> > Please let me know if any doubts.
 
> Thanks, that is better, will add this there.

But the patch his mangled, you use:

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
Thunderbird/38.5.1

Please read Documentation/email-clients.txt, there are ways to fix the
sending of patches.

I fixed it up this time, there were two instances like:

[acme@jouet linux]$ patch -p1 < /wb/1.patch 
patching file tools/perf/arch/powerpc/util/sym-handling.c
patch:  malformed patch at line 33: @@ -118,5 +119,6 @@ void 
arch__post_process_probe_trace_events(struct 

it breaks down long lines ;-\

[acme@jouet linux]$

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 11:49:00AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Thu, Aug 11, 2016 at 06:51:39PM +0530, Ravi Bangoria escreveu:
> > On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:
> > > Can you please provide a better explanation? I had to look at the patch
> > > to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
> > > ifdefs while the patch description, talks about DWARF.

> > Yes. Explanation could have been better. Apologies for that.

> > arch__post_process_probe_trace_events() calls get_target_map() to prepare
> > symbol table. get_target_map() is defined inside util/probe-event.c.

> > probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
> > Hence arch__post_process_probe_trace_events() needs to be defined inside
> > #ifdef HAVE_LIBELF_SUPPORT to solve compilation error.
 
> > Please let me know if any doubts.
 
> Thanks, that is better, will add this there.

But the patch his mangled, you use:

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
Thunderbird/38.5.1

Please read Documentation/email-clients.txt, there are ways to fix the
sending of patches.

I fixed it up this time, there were two instances like:

[acme@jouet linux]$ patch -p1 < /wb/1.patch 
patching file tools/perf/arch/powerpc/util/sym-handling.c
patch:  malformed patch at line 33: @@ -118,5 +119,6 @@ void 
arch__post_process_probe_trace_events(struct 

it breaks down long lines ;-\

[acme@jouet linux]$

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 09:54:57AM +1000, Anton Blanchard escreveu:
> Hi,
> 
> > Powerpc has Global Entry Point and Local Entry Point for functions.
> > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > does not have LEP info.
> > 
> > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > for ppc64le. But when user tries to probe with function parameter,
> > we fall back to using dwarf(i.e. GEP) and when function called via
> > LEP, probe will never hit.
> 
> This patch causes a build failure for me on ppc64le:
> 
> libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':
> 
> tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> `get_target_map'

Humm, he sent a patch, I'm applying it, but I'm trying to figure out why
this wasn't catched by my cross compiling container :-\

Complete log and:

  CC   /tmp/build/perf/util/probe-event.o

Because:

...libelf: [ on  ]

So I would have to build with NO_LIBELF=1? /me tries... further proof I need to
build with 'make -C tools/perf build-test' for all the arches, that will test, 
among
other combos, with NO_LIBELF=1 and without :-\

# docker run --entrypoint=/bin/bash -v /home/acme/git:/git:Z --rm -ti 
docker.io/acmel/linux-perf-tools-build-ubuntu:16.04-x-powerpc64el
perfbuilder@74bca30d5b61:/$ make NO_LIBELF=1 ARCH=powerpc 
CROSS_COMPILE=powerpc64le-linux-gnu- -C /git/linux/tools/perf O=/tmp/build/perf

  LINK /tmp/build/perf/perf
/tmp/build/perf/libperf.a(libperf-in.o): In function 
`arch__post_process_probe_trace_events':
/git/linux/tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference 
to `get_target_map'
collect2: error: ld returned 1 exit status
Makefile.perf:435: recipe for target '/tmp/build/perf/perf' failed
make[1]: *** [/tmp/build/perf/perf] Error 1
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2
make: Leaving directory '/git/linux/tools/perf'
perfbuilder@74bca30d5b61:/$

Ok, reproduced, will add the NO_LIBELF=1 to the regular set of tests for 
ppc64le.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 09:54:57AM +1000, Anton Blanchard escreveu:
> Hi,
> 
> > Powerpc has Global Entry Point and Local Entry Point for functions.
> > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > does not have LEP info.
> > 
> > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > for ppc64le. But when user tries to probe with function parameter,
> > we fall back to using dwarf(i.e. GEP) and when function called via
> > LEP, probe will never hit.
> 
> This patch causes a build failure for me on ppc64le:
> 
> libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':
> 
> tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> `get_target_map'

Humm, he sent a patch, I'm applying it, but I'm trying to figure out why
this wasn't catched by my cross compiling container :-\

Complete log and:

  CC   /tmp/build/perf/util/probe-event.o

Because:

...libelf: [ on  ]

So I would have to build with NO_LIBELF=1? /me tries... further proof I need to
build with 'make -C tools/perf build-test' for all the arches, that will test, 
among
other combos, with NO_LIBELF=1 and without :-\

# docker run --entrypoint=/bin/bash -v /home/acme/git:/git:Z --rm -ti 
docker.io/acmel/linux-perf-tools-build-ubuntu:16.04-x-powerpc64el
perfbuilder@74bca30d5b61:/$ make NO_LIBELF=1 ARCH=powerpc 
CROSS_COMPILE=powerpc64le-linux-gnu- -C /git/linux/tools/perf O=/tmp/build/perf

  LINK /tmp/build/perf/perf
/tmp/build/perf/libperf.a(libperf-in.o): In function 
`arch__post_process_probe_trace_events':
/git/linux/tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference 
to `get_target_map'
collect2: error: ld returned 1 exit status
Makefile.perf:435: recipe for target '/tmp/build/perf/perf' failed
make[1]: *** [/tmp/build/perf/perf] Error 1
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2
make: Leaving directory '/git/linux/tools/perf'
perfbuilder@74bca30d5b61:/$

Ok, reproduced, will add the NO_LIBELF=1 to the regular set of tests for 
ppc64le.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 06:51:39PM +0530, Ravi Bangoria escreveu:
> 
> 
> On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:
> > Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:
> > > 
> > > On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:
> > > > Hi,
> > > > 
> > > > > Powerpc has Global Entry Point and Local Entry Point for functions.
> > > > > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > > > > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > > > > does not have LEP info.
> > > > > 
> > > > > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > > > > for ppc64le. But when user tries to probe with function parameter,
> > > > > we fall back to using dwarf(i.e. GEP) and when function called via
> > > > > LEP, probe will never hit.
> > > > This patch causes a build failure for me on ppc64le:
> > > > 
> > > > libperf.a(libperf-in.o): In function 
> > > > `arch__post_process_probe_trace_events':
> > > > 
> > > > tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> > > > `get_target_map'
> > > Thanks Anton. Sorry, I should have caught that.
> > > 
> > > @Arnaldo, Can you please pick this up. I've prepared this on top of
> > > acme/perf/core.
> > > 
> > > 
> > >  From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
> > > From: Ravi Bangoria 
> > > Date: Wed, 10 Aug 2016 23:13:45 -0500
> > > Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support
> > > 
> > > Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
> > > probe ppc64le: Fix probe location when using DWARF")
> > Can you please provide a better explanation? I had to look at the patch
> > to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
> > ifdefs while the patch description, talks about DWARF.
> 
> Yes. Explanation could have been better. Apologies for that.
> 
> arch__post_process_probe_trace_events() calls get_target_map() to prepare
> symbol table. get_target_map() is defined inside util/probe-event.c.
> 
> probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
> Hence arch__post_process_probe_trace_events() needs to be defined inside
> #ifdef HAVE_LIBELF_SUPPORT to solve compilation error.
> 
> Please let me know if any doubts.

Thanks, that is better, will add this there.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 06:51:39PM +0530, Ravi Bangoria escreveu:
> 
> 
> On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:
> > Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:
> > > 
> > > On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:
> > > > Hi,
> > > > 
> > > > > Powerpc has Global Entry Point and Local Entry Point for functions.
> > > > > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > > > > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > > > > does not have LEP info.
> > > > > 
> > > > > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > > > > for ppc64le. But when user tries to probe with function parameter,
> > > > > we fall back to using dwarf(i.e. GEP) and when function called via
> > > > > LEP, probe will never hit.
> > > > This patch causes a build failure for me on ppc64le:
> > > > 
> > > > libperf.a(libperf-in.o): In function 
> > > > `arch__post_process_probe_trace_events':
> > > > 
> > > > tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> > > > `get_target_map'
> > > Thanks Anton. Sorry, I should have caught that.
> > > 
> > > @Arnaldo, Can you please pick this up. I've prepared this on top of
> > > acme/perf/core.
> > > 
> > > 
> > >  From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
> > > From: Ravi Bangoria 
> > > Date: Wed, 10 Aug 2016 23:13:45 -0500
> > > Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support
> > > 
> > > Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
> > > probe ppc64le: Fix probe location when using DWARF")
> > Can you please provide a better explanation? I had to look at the patch
> > to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
> > ifdefs while the patch description, talks about DWARF.
> 
> Yes. Explanation could have been better. Apologies for that.
> 
> arch__post_process_probe_trace_events() calls get_target_map() to prepare
> symbol table. get_target_map() is defined inside util/probe-event.c.
> 
> probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
> Hence arch__post_process_probe_trace_events() needs to be defined inside
> #ifdef HAVE_LIBELF_SUPPORT to solve compilation error.
> 
> Please let me know if any doubts.

Thanks, that is better, will add this there.

- Arnaldo


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Ravi Bangoria



On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:

Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:


On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:

Hi,


Powerpc has Global Entry Point and Local Entry Point for functions.
LEP catches call from both the GEP and the LEP. Symbol table of ELF
contains GEP and Offset from which we can calculate LEP, but debuginfo
does not have LEP info.

Currently, perf prioritize symbol table over dwarf to probe on LEP
for ppc64le. But when user tries to probe with function parameter,
we fall back to using dwarf(i.e. GEP) and when function called via
LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'

Thanks Anton. Sorry, I should have caught that.

@Arnaldo, Can you please pick this up. I've prepared this on top of
acme/perf/core.


 From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
From: Ravi Bangoria 
Date: Wed, 10 Aug 2016 23:13:45 -0500
Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support

Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
probe ppc64le: Fix probe location when using DWARF")

Can you please provide a better explanation? I had to look at the patch
to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
ifdefs while the patch description, talks about DWARF.


Yes. Explanation could have been better. Apologies for that.

arch__post_process_probe_trace_events() calls get_target_map() to prepare
symbol table. get_target_map() is defined inside util/probe-event.c.

probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
Hence arch__post_process_probe_trace_events() needs to be defined inside
#ifdef HAVE_LIBELF_SUPPORT to solve compilation error.

Please let me know if any doubts.

Thanks,
Ravi


Anyway, Anton, does this fix the problem for you?

- Arnaldo


Signed-off-by: Ravi Bangoria 
---
  tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
b/tools/perf/arch/powerpc/util/sym-handling.c
index 8d4dc97..c27a51a 100644
--- a/tools/perf/arch/powerpc/util/sym-handling.c
+++ b/tools/perf/arch/powerpc/util/sym-handling.c
@@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
 }
  }

+#ifdef HAVE_LIBELF_SUPPORT
  void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
int ntevs)
  {
@@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct
perf_probe_event *pev,
 }
 }
  }
+#endif

  #endif
--
2.7.4




Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Ravi Bangoria



On Thursday 11 August 2016 05:20 PM, Arnaldo Carvalho de Melo wrote:

Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:


On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:

Hi,


Powerpc has Global Entry Point and Local Entry Point for functions.
LEP catches call from both the GEP and the LEP. Symbol table of ELF
contains GEP and Offset from which we can calculate LEP, but debuginfo
does not have LEP info.

Currently, perf prioritize symbol table over dwarf to probe on LEP
for ppc64le. But when user tries to probe with function parameter,
we fall back to using dwarf(i.e. GEP) and when function called via
LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'

Thanks Anton. Sorry, I should have caught that.

@Arnaldo, Can you please pick this up. I've prepared this on top of
acme/perf/core.


 From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
From: Ravi Bangoria 
Date: Wed, 10 Aug 2016 23:13:45 -0500
Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support

Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
probe ppc64le: Fix probe location when using DWARF")

Can you please provide a better explanation? I had to look at the patch
to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
ifdefs while the patch description, talks about DWARF.


Yes. Explanation could have been better. Apologies for that.

arch__post_process_probe_trace_events() calls get_target_map() to prepare
symbol table. get_target_map() is defined inside util/probe-event.c.

probe-event.c will only get included in perf binary if CONFIG_LIBELF is set.
Hence arch__post_process_probe_trace_events() needs to be defined inside
#ifdef HAVE_LIBELF_SUPPORT to solve compilation error.

Please let me know if any doubts.

Thanks,
Ravi


Anyway, Anton, does this fix the problem for you?

- Arnaldo


Signed-off-by: Ravi Bangoria 
---
  tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
b/tools/perf/arch/powerpc/util/sym-handling.c
index 8d4dc97..c27a51a 100644
--- a/tools/perf/arch/powerpc/util/sym-handling.c
+++ b/tools/perf/arch/powerpc/util/sym-handling.c
@@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
 }
  }

+#ifdef HAVE_LIBELF_SUPPORT
  void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
int ntevs)
  {
@@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct
perf_probe_event *pev,
 }
 }
  }
+#endif

  #endif
--
2.7.4




Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:
> 
> 
> On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:
> > Hi,
> > 
> > > Powerpc has Global Entry Point and Local Entry Point for functions.
> > > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > > does not have LEP info.
> > > 
> > > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > > for ppc64le. But when user tries to probe with function parameter,
> > > we fall back to using dwarf(i.e. GEP) and when function called via
> > > LEP, probe will never hit.
> > This patch causes a build failure for me on ppc64le:
> > 
> > libperf.a(libperf-in.o): In function 
> > `arch__post_process_probe_trace_events':
> > 
> > tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> > `get_target_map'
> 
> Thanks Anton. Sorry, I should have caught that.
> 
> @Arnaldo, Can you please pick this up. I've prepared this on top of
> acme/perf/core.
> 
> 
> From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
> From: Ravi Bangoria 
> Date: Wed, 10 Aug 2016 23:13:45 -0500
> Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support
> 
> Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
> probe ppc64le: Fix probe location when using DWARF")

Can you please provide a better explanation? I had to look at the patch
to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
ifdefs while the patch description, talks about DWARF.

Anyway, Anton, does this fix the problem for you?

- Arnaldo
 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
> b/tools/perf/arch/powerpc/util/sym-handling.c
> index 8d4dc97..c27a51a 100644
> --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
> }
>  }
> 
> +#ifdef HAVE_LIBELF_SUPPORT
>  void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
>int ntevs)
>  {
> @@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct
> perf_probe_event *pev,
> }
> }
>  }
> +#endif
> 
>  #endif
> -- 
> 2.7.4


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-11 Thread Arnaldo Carvalho de Melo
Em Thu, Aug 11, 2016 at 10:01:04AM +0530, Ravi Bangoria escreveu:
> 
> 
> On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:
> > Hi,
> > 
> > > Powerpc has Global Entry Point and Local Entry Point for functions.
> > > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > > does not have LEP info.
> > > 
> > > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > > for ppc64le. But when user tries to probe with function parameter,
> > > we fall back to using dwarf(i.e. GEP) and when function called via
> > > LEP, probe will never hit.
> > This patch causes a build failure for me on ppc64le:
> > 
> > libperf.a(libperf-in.o): In function 
> > `arch__post_process_probe_trace_events':
> > 
> > tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
> > `get_target_map'
> 
> Thanks Anton. Sorry, I should have caught that.
> 
> @Arnaldo, Can you please pick this up. I've prepared this on top of
> acme/perf/core.
> 
> 
> From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
> From: Ravi Bangoria 
> Date: Wed, 10 Aug 2016 23:13:45 -0500
> Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support
> 
> Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
> probe ppc64le: Fix probe location when using DWARF")

Can you please provide a better explanation? I had to look at the patch
to understand what it was fixing, and then the patch adds LIBELF_SUPPORT
ifdefs while the patch description, talks about DWARF.

Anyway, Anton, does this fix the problem for you?

- Arnaldo
 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
> b/tools/perf/arch/powerpc/util/sym-handling.c
> index 8d4dc97..c27a51a 100644
> --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
> }
>  }
> 
> +#ifdef HAVE_LIBELF_SUPPORT
>  void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
>int ntevs)
>  {
> @@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct
> perf_probe_event *pev,
> }
> }
>  }
> +#endif
> 
>  #endif
> -- 
> 2.7.4


Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-10 Thread Ravi Bangoria



On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:

Hi,


Powerpc has Global Entry Point and Local Entry Point for functions.
LEP catches call from both the GEP and the LEP. Symbol table of ELF
contains GEP and Offset from which we can calculate LEP, but debuginfo
does not have LEP info.

Currently, perf prioritize symbol table over dwarf to probe on LEP
for ppc64le. But when user tries to probe with function parameter,
we fall back to using dwarf(i.e. GEP) and when function called via
LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'


Thanks Anton. Sorry, I should have caught that.

@Arnaldo, Can you please pick this up. I've prepared this on top of 
acme/perf/core.



From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
From: Ravi Bangoria 
Date: Wed, 10 Aug 2016 23:13:45 -0500
Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support

Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
probe ppc64le: Fix probe location when using DWARF")

Signed-off-by: Ravi Bangoria 
---
 tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
b/tools/perf/arch/powerpc/util/sym-handling.c

index 8d4dc97..c27a51a 100644
--- a/tools/perf/arch/powerpc/util/sym-handling.c
+++ b/tools/perf/arch/powerpc/util/sym-handling.c
@@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
}
 }

+#ifdef HAVE_LIBELF_SUPPORT
 void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
   int ntevs)
 {
@@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct 
perf_probe_event *pev,

}
}
 }
+#endif

 #endif
--
2.7.4



Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-10 Thread Ravi Bangoria



On Thursday 11 August 2016 05:24 AM, Anton Blanchard wrote:

Hi,


Powerpc has Global Entry Point and Local Entry Point for functions.
LEP catches call from both the GEP and the LEP. Symbol table of ELF
contains GEP and Offset from which we can calculate LEP, but debuginfo
does not have LEP info.

Currently, perf prioritize symbol table over dwarf to probe on LEP
for ppc64le. But when user tries to probe with function parameter,
we fall back to using dwarf(i.e. GEP) and when function called via
LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'


Thanks Anton. Sorry, I should have caught that.

@Arnaldo, Can you please pick this up. I've prepared this on top of 
acme/perf/core.



From 89c977ae9c3ae35c78b16cddabcf2b01d3cf5cc8 Mon Sep 17 00:00:00 2001
From: Ravi Bangoria 
Date: Wed, 10 Aug 2016 23:13:45 -0500
Subject: [PATCH] perf ppc64le: Fix build failure when no dwarf support

Fix perf build failure on ppc64le because of Commit 99e608b5954c ("perf
probe ppc64le: Fix probe location when using DWARF")

Signed-off-by: Ravi Bangoria 
---
 tools/perf/arch/powerpc/util/sym-handling.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
b/tools/perf/arch/powerpc/util/sym-handling.c

index 8d4dc97..c27a51a 100644
--- a/tools/perf/arch/powerpc/util/sym-handling.c
+++ b/tools/perf/arch/powerpc/util/sym-handling.c
@@ -97,6 +97,7 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
}
 }

+#ifdef HAVE_LIBELF_SUPPORT
 void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
   int ntevs)
 {
@@ -118,5 +119,6 @@ void arch__post_process_probe_trace_events(struct 
perf_probe_event *pev,

}
}
 }
+#endif

 #endif
--
2.7.4



Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-10 Thread Anton Blanchard
Hi,

> Powerpc has Global Entry Point and Local Entry Point for functions.
> LEP catches call from both the GEP and the LEP. Symbol table of ELF
> contains GEP and Offset from which we can calculate LEP, but debuginfo
> does not have LEP info.
> 
> Currently, perf prioritize symbol table over dwarf to probe on LEP
> for ppc64le. But when user tries to probe with function parameter,
> we fall back to using dwarf(i.e. GEP) and when function called via
> LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'

Anton

> For example:
>   $ objdump -d vmlinux
> ...
> do_sys_open():
> c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> c02eb4a4:   60 00 42 38 addir2,r2,96
> c02eb4a8:   a6 02 08 7c mflrr0
> c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> 
>   $ sudo ./perf probe do_sys_open
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904
> 
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> 
> For second case, perf probed on GEP. So when function will be called
> via LEP, probe won't hit.
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.195 MB perf.data ]
> 
> To resolve this issue, let's not prioritize symbol table, let perf
> decide what it wants to use. Perf is already converting GEP to LEP
> when it uses symbol table. When perf uses debuginfo, let it find
> LEP offset form symbol table. This way we fall back to probe on LEP
> for all cases.
> 
> After patch:
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.197 MB perf.data (11 samples)
> ]
> 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 27
> + tools/perf/util/probe-event.c   |
> 37 -
> tools/perf/util/probe-event.h   |  6 - 3 files
> changed, 49 insertions(+), 21 deletions(-)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
> b/tools/perf/arch/powerpc/util/sym-handling.c index c6d0f91..8d4dc97
> 100644 --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea,
> const char *nameb) #endif
>  
>  #if defined(_CALL_ELF) && _CALL_ELF == 2
> -bool arch__prefers_symtab(void)
> -{
> - return true;
> -}
>  
>  #ifdef HAVE_LIBELF_SUPPORT
>  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct
> perf_probe_event *pev, tev->point.offset += lep_offset;
>   }
>  }
> +
> +void arch__post_process_probe_trace_events(struct perf_probe_event
> *pev,
> +int ntevs)
> +{
> + struct probe_trace_event *tev;
> + struct map *map;
> + struct symbol *sym = NULL;
> + struct rb_node *tmp;
> + int i = 0;
> +
> + map = get_target_map(pev->target, pev->uprobes);
> + if (!map || map__load(map, NULL) < 0)
> + return;
> +
> + for (i = 0; i < ntevs; i++) {
> + tev = >tevs[i];
> + map__for_each_symbol(map, sym, tmp) {
> + if (map->unmap_ip(map, sym->start) ==
> tev->point.address)
> + arch__fix_tev_from_maps(pev, tev,
> map, sym);
> + }
> + }
> +}
> +
>  #endif
> diff --git a/tools/perf/util/probe-event.c
> b/tools/perf/util/probe-event.c index 4e215e7..5efa535 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const
> char *module) return NULL;
>  }
>  
> -static struct map *get_target_map(const char *target, bool user)
> +struct map *get_target_map(const char *target, bool user)
>  {
>   /* Init maps of given executable or kernel */
>   if (user)
> @@ -703,19 +703,32 @@ post_process_kernel_probe_trace_events(struct
> probe_trace_event *tevs, return skipped;
>  }
>  
> +void __weak
> +arch__post_process_probe_trace_events(struct perf_probe_event *pev
> __maybe_unused,
> +   int ntevs __maybe_unused)
> +{
> +}
> +
>  /* Post processing the probe events */
> -static int post_process_probe_trace_events(struct 

Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-10 Thread Anton Blanchard
Hi,

> Powerpc has Global Entry Point and Local Entry Point for functions.
> LEP catches call from both the GEP and the LEP. Symbol table of ELF
> contains GEP and Offset from which we can calculate LEP, but debuginfo
> does not have LEP info.
> 
> Currently, perf prioritize symbol table over dwarf to probe on LEP
> for ppc64le. But when user tries to probe with function parameter,
> we fall back to using dwarf(i.e. GEP) and when function called via
> LEP, probe will never hit.

This patch causes a build failure for me on ppc64le:

libperf.a(libperf-in.o): In function `arch__post_process_probe_trace_events':

tools/perf/arch/powerpc/util/sym-handling.c:109: undefined reference to 
`get_target_map'

Anton

> For example:
>   $ objdump -d vmlinux
> ...
> do_sys_open():
> c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> c02eb4a4:   60 00 42 38 addir2,r2,96
> c02eb4a8:   a6 02 08 7c mflrr0
> c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> 
>   $ sudo ./perf probe do_sys_open
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904
> 
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> 
> For second case, perf probed on GEP. So when function will be called
> via LEP, probe won't hit.
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.195 MB perf.data ]
> 
> To resolve this issue, let's not prioritize symbol table, let perf
> decide what it wants to use. Perf is already converting GEP to LEP
> when it uses symbol table. When perf uses debuginfo, let it find
> LEP offset form symbol table. This way we fall back to probe on LEP
> for all cases.
> 
> After patch:
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.197 MB perf.data (11 samples)
> ]
> 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 27
> + tools/perf/util/probe-event.c   |
> 37 -
> tools/perf/util/probe-event.h   |  6 - 3 files
> changed, 49 insertions(+), 21 deletions(-)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c
> b/tools/perf/arch/powerpc/util/sym-handling.c index c6d0f91..8d4dc97
> 100644 --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea,
> const char *nameb) #endif
>  
>  #if defined(_CALL_ELF) && _CALL_ELF == 2
> -bool arch__prefers_symtab(void)
> -{
> - return true;
> -}
>  
>  #ifdef HAVE_LIBELF_SUPPORT
>  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct
> perf_probe_event *pev, tev->point.offset += lep_offset;
>   }
>  }
> +
> +void arch__post_process_probe_trace_events(struct perf_probe_event
> *pev,
> +int ntevs)
> +{
> + struct probe_trace_event *tev;
> + struct map *map;
> + struct symbol *sym = NULL;
> + struct rb_node *tmp;
> + int i = 0;
> +
> + map = get_target_map(pev->target, pev->uprobes);
> + if (!map || map__load(map, NULL) < 0)
> + return;
> +
> + for (i = 0; i < ntevs; i++) {
> + tev = >tevs[i];
> + map__for_each_symbol(map, sym, tmp) {
> + if (map->unmap_ip(map, sym->start) ==
> tev->point.address)
> + arch__fix_tev_from_maps(pev, tev,
> map, sym);
> + }
> + }
> +}
> +
>  #endif
> diff --git a/tools/perf/util/probe-event.c
> b/tools/perf/util/probe-event.c index 4e215e7..5efa535 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const
> char *module) return NULL;
>  }
>  
> -static struct map *get_target_map(const char *target, bool user)
> +struct map *get_target_map(const char *target, bool user)
>  {
>   /* Init maps of given executable or kernel */
>   if (user)
> @@ -703,19 +703,32 @@ post_process_kernel_probe_trace_events(struct
> probe_trace_event *tevs, return skipped;
>  }
>  
> +void __weak
> +arch__post_process_probe_trace_events(struct perf_probe_event *pev
> __maybe_unused,
> +   int ntevs __maybe_unused)
> +{
> +}
> +
>  /* Post processing the probe events */
> -static int post_process_probe_trace_events(struct probe_trace_event
> *tevs, +static int 

Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-09 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 09, 2016 at 11:02:40PM +0900, Masami Hiramatsu escreveu:
> On Tue,  9 Aug 2016 01:23:25 -0500
> Ravi Bangoria  wrote:
> 
> > Powerpc has Global Entry Point and Local Entry Point for functions.
> > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > does not have LEP info.
> > 
> > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > for ppc64le. But when user tries to probe with function parameter,
> > we fall back to using dwarf(i.e. GEP) and when function called via
> > LEP, probe will never hit.
> > 
> > For example:
> >   $ objdump -d vmlinux
> > ...
> > do_sys_open():
> > c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> > c02eb4a4:   60 00 42 38 addir2,r2,96
> > c02eb4a8:   a6 02 08 7c mflrr0
> > c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> > 
> >   $ sudo ./perf probe do_sys_open
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060904
> > 
> >   $ sudo ./perf probe 'do_sys_open filename:string'
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> > 
> > For second case, perf probed on GEP. So when function will be called
> > via LEP, probe won't hit.
> > 
> >   $ sudo ./perf record -a -e probe:do_sys_open ls
> > [ perf record: Woken up 1 times to write data ]
> > [ perf record: Captured and wrote 0.195 MB perf.data ]
> > 
> > To resolve this issue, let's not prioritize symbol table, let perf
> > decide what it wants to use. Perf is already converting GEP to LEP
> > when it uses symbol table. When perf uses debuginfo, let it find
> > LEP offset form symbol table. This way we fall back to probe on LEP
> > for all cases.
> > 
> > After patch:
> >   $ sudo ./perf probe 'do_sys_open filename:string'
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> > 
> >   $ sudo ./perf record -a -e probe:do_sys_open ls
> > [ perf record: Woken up 1 times to write data ]
> > [ perf record: Captured and wrote 0.197 MB perf.data (11 samples) ]
> 
> OK, I see.
> And I'd like to add note below.
> 
>  This reverts commit d5c2e2c17ae1 ("perf probe ppc64le: Prefer symbol
>  table lookup over DWARF").
> 
> Acked-by: Masami Hiramatsu 

Ok, I'll do that to expedite this a little bit, trying to get this in my
next perf/urgent pull req to Ingo, which I expect to send soon.

- Arnaldo
 
> for this series. 
> 
> Thanks,
> 
> > 
> > Signed-off-by: Ravi Bangoria 
> > ---
> >  tools/perf/arch/powerpc/util/sym-handling.c | 27 +
> >  tools/perf/util/probe-event.c   | 37 
> > -
> >  tools/perf/util/probe-event.h   |  6 -
> >  3 files changed, 49 insertions(+), 21 deletions(-)
> > 
> > diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
> > b/tools/perf/arch/powerpc/util/sym-handling.c
> > index c6d0f91..8d4dc97 100644
> > --- a/tools/perf/arch/powerpc/util/sym-handling.c
> > +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> > @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea, const 
> > char *nameb)
> >  #endif
> >  
> >  #if defined(_CALL_ELF) && _CALL_ELF == 2
> > -bool arch__prefers_symtab(void)
> > -{
> > -   return true;
> > -}
> >  
> >  #ifdef HAVE_LIBELF_SUPPORT
> >  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> > @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct perf_probe_event 
> > *pev,
> > tev->point.offset += lep_offset;
> > }
> >  }
> > +
> > +void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
> > +  int ntevs)
> > +{
> > +   struct probe_trace_event *tev;
> > +   struct map *map;
> > +   struct symbol *sym = NULL;
> > +   struct rb_node *tmp;
> > +   int i = 0;
> > +
> > +   map = get_target_map(pev->target, pev->uprobes);
> > +   if (!map || map__load(map, NULL) < 0)
> > +   return;
> > +
> > +   for (i = 0; i < ntevs; i++) {
> > +   tev = >tevs[i];
> > +   map__for_each_symbol(map, sym, tmp) {
> > +   if (map->unmap_ip(map, sym->start) == 
> > tev->point.address)
> > +   arch__fix_tev_from_maps(pev, tev, map, sym);
> > +   }
> > +   }
> > +}
> > +
> >  #endif
> > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> > index 4e215e7..5efa535 100644
> > --- a/tools/perf/util/probe-event.c
> > +++ b/tools/perf/util/probe-event.c
> > @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const char 
> > *module)
> > return NULL;
> >  }
> >  
> > -static struct map *get_target_map(const char *target, bool 

Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-09 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 09, 2016 at 11:02:40PM +0900, Masami Hiramatsu escreveu:
> On Tue,  9 Aug 2016 01:23:25 -0500
> Ravi Bangoria  wrote:
> 
> > Powerpc has Global Entry Point and Local Entry Point for functions.
> > LEP catches call from both the GEP and the LEP. Symbol table of ELF
> > contains GEP and Offset from which we can calculate LEP, but debuginfo
> > does not have LEP info.
> > 
> > Currently, perf prioritize symbol table over dwarf to probe on LEP
> > for ppc64le. But when user tries to probe with function parameter,
> > we fall back to using dwarf(i.e. GEP) and when function called via
> > LEP, probe will never hit.
> > 
> > For example:
> >   $ objdump -d vmlinux
> > ...
> > do_sys_open():
> > c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> > c02eb4a4:   60 00 42 38 addir2,r2,96
> > c02eb4a8:   a6 02 08 7c mflrr0
> > c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> > 
> >   $ sudo ./perf probe do_sys_open
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060904
> > 
> >   $ sudo ./perf probe 'do_sys_open filename:string'
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> > 
> > For second case, perf probed on GEP. So when function will be called
> > via LEP, probe won't hit.
> > 
> >   $ sudo ./perf record -a -e probe:do_sys_open ls
> > [ perf record: Woken up 1 times to write data ]
> > [ perf record: Captured and wrote 0.195 MB perf.data ]
> > 
> > To resolve this issue, let's not prioritize symbol table, let perf
> > decide what it wants to use. Perf is already converting GEP to LEP
> > when it uses symbol table. When perf uses debuginfo, let it find
> > LEP offset form symbol table. This way we fall back to probe on LEP
> > for all cases.
> > 
> > After patch:
> >   $ sudo ./perf probe 'do_sys_open filename:string'
> >   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> > p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> > 
> >   $ sudo ./perf record -a -e probe:do_sys_open ls
> > [ perf record: Woken up 1 times to write data ]
> > [ perf record: Captured and wrote 0.197 MB perf.data (11 samples) ]
> 
> OK, I see.
> And I'd like to add note below.
> 
>  This reverts commit d5c2e2c17ae1 ("perf probe ppc64le: Prefer symbol
>  table lookup over DWARF").
> 
> Acked-by: Masami Hiramatsu 

Ok, I'll do that to expedite this a little bit, trying to get this in my
next perf/urgent pull req to Ingo, which I expect to send soon.

- Arnaldo
 
> for this series. 
> 
> Thanks,
> 
> > 
> > Signed-off-by: Ravi Bangoria 
> > ---
> >  tools/perf/arch/powerpc/util/sym-handling.c | 27 +
> >  tools/perf/util/probe-event.c   | 37 
> > -
> >  tools/perf/util/probe-event.h   |  6 -
> >  3 files changed, 49 insertions(+), 21 deletions(-)
> > 
> > diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
> > b/tools/perf/arch/powerpc/util/sym-handling.c
> > index c6d0f91..8d4dc97 100644
> > --- a/tools/perf/arch/powerpc/util/sym-handling.c
> > +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> > @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea, const 
> > char *nameb)
> >  #endif
> >  
> >  #if defined(_CALL_ELF) && _CALL_ELF == 2
> > -bool arch__prefers_symtab(void)
> > -{
> > -   return true;
> > -}
> >  
> >  #ifdef HAVE_LIBELF_SUPPORT
> >  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> > @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct perf_probe_event 
> > *pev,
> > tev->point.offset += lep_offset;
> > }
> >  }
> > +
> > +void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
> > +  int ntevs)
> > +{
> > +   struct probe_trace_event *tev;
> > +   struct map *map;
> > +   struct symbol *sym = NULL;
> > +   struct rb_node *tmp;
> > +   int i = 0;
> > +
> > +   map = get_target_map(pev->target, pev->uprobes);
> > +   if (!map || map__load(map, NULL) < 0)
> > +   return;
> > +
> > +   for (i = 0; i < ntevs; i++) {
> > +   tev = >tevs[i];
> > +   map__for_each_symbol(map, sym, tmp) {
> > +   if (map->unmap_ip(map, sym->start) == 
> > tev->point.address)
> > +   arch__fix_tev_from_maps(pev, tev, map, sym);
> > +   }
> > +   }
> > +}
> > +
> >  #endif
> > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> > index 4e215e7..5efa535 100644
> > --- a/tools/perf/util/probe-event.c
> > +++ b/tools/perf/util/probe-event.c
> > @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const char 
> > *module)
> > return NULL;
> >  }
> >  
> > -static struct map *get_target_map(const char *target, bool user)
> > +struct map *get_target_map(const char *target, bool user)
> >  {
> > /* 

Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-09 Thread Masami Hiramatsu
On Tue,  9 Aug 2016 01:23:25 -0500
Ravi Bangoria  wrote:

> Powerpc has Global Entry Point and Local Entry Point for functions.
> LEP catches call from both the GEP and the LEP. Symbol table of ELF
> contains GEP and Offset from which we can calculate LEP, but debuginfo
> does not have LEP info.
> 
> Currently, perf prioritize symbol table over dwarf to probe on LEP
> for ppc64le. But when user tries to probe with function parameter,
> we fall back to using dwarf(i.e. GEP) and when function called via
> LEP, probe will never hit.
> 
> For example:
>   $ objdump -d vmlinux
> ...
> do_sys_open():
> c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> c02eb4a4:   60 00 42 38 addir2,r2,96
> c02eb4a8:   a6 02 08 7c mflrr0
> c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> 
>   $ sudo ./perf probe do_sys_open
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904
> 
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> 
> For second case, perf probed on GEP. So when function will be called
> via LEP, probe won't hit.
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.195 MB perf.data ]
> 
> To resolve this issue, let's not prioritize symbol table, let perf
> decide what it wants to use. Perf is already converting GEP to LEP
> when it uses symbol table. When perf uses debuginfo, let it find
> LEP offset form symbol table. This way we fall back to probe on LEP
> for all cases.
> 
> After patch:
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.197 MB perf.data (11 samples) ]

OK, I see.
And I'd like to add note below.

 This reverts commit d5c2e2c17ae1 ("perf probe ppc64le: Prefer symbol
 table lookup over DWARF").

Acked-by: Masami Hiramatsu 

for this series. 

Thanks,

> 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 27 +
>  tools/perf/util/probe-event.c   | 37 
> -
>  tools/perf/util/probe-event.h   |  6 -
>  3 files changed, 49 insertions(+), 21 deletions(-)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
> b/tools/perf/arch/powerpc/util/sym-handling.c
> index c6d0f91..8d4dc97 100644
> --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea, const 
> char *nameb)
>  #endif
>  
>  #if defined(_CALL_ELF) && _CALL_ELF == 2
> -bool arch__prefers_symtab(void)
> -{
> - return true;
> -}
>  
>  #ifdef HAVE_LIBELF_SUPPORT
>  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
>   tev->point.offset += lep_offset;
>   }
>  }
> +
> +void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
> +int ntevs)
> +{
> + struct probe_trace_event *tev;
> + struct map *map;
> + struct symbol *sym = NULL;
> + struct rb_node *tmp;
> + int i = 0;
> +
> + map = get_target_map(pev->target, pev->uprobes);
> + if (!map || map__load(map, NULL) < 0)
> + return;
> +
> + for (i = 0; i < ntevs; i++) {
> + tev = >tevs[i];
> + map__for_each_symbol(map, sym, tmp) {
> + if (map->unmap_ip(map, sym->start) == 
> tev->point.address)
> + arch__fix_tev_from_maps(pev, tev, map, sym);
> + }
> + }
> +}
> +
>  #endif
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 4e215e7..5efa535 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const char 
> *module)
>   return NULL;
>  }
>  
> -static struct map *get_target_map(const char *target, bool user)
> +struct map *get_target_map(const char *target, bool user)
>  {
>   /* Init maps of given executable or kernel */
>   if (user)
> @@ -703,19 +703,32 @@ post_process_kernel_probe_trace_events(struct 
> probe_trace_event *tevs,
>   return skipped;
>  }
>  
> +void __weak
> +arch__post_process_probe_trace_events(struct perf_probe_event *pev 
> __maybe_unused,
> +   int ntevs 

Re: [PATCH 2/2] perf ppc64le: Fix probe location when using DWARF

2016-08-09 Thread Masami Hiramatsu
On Tue,  9 Aug 2016 01:23:25 -0500
Ravi Bangoria  wrote:

> Powerpc has Global Entry Point and Local Entry Point for functions.
> LEP catches call from both the GEP and the LEP. Symbol table of ELF
> contains GEP and Offset from which we can calculate LEP, but debuginfo
> does not have LEP info.
> 
> Currently, perf prioritize symbol table over dwarf to probe on LEP
> for ppc64le. But when user tries to probe with function parameter,
> we fall back to using dwarf(i.e. GEP) and when function called via
> LEP, probe will never hit.
> 
> For example:
>   $ objdump -d vmlinux
> ...
> do_sys_open():
> c02eb4a0:   e8 00 4c 3c addis   r2,r12,232
> c02eb4a4:   60 00 42 38 addir2,r2,96
> c02eb4a8:   a6 02 08 7c mflrr0
> c02eb4ac:   d0 ff 41 fb std r26,-48(r1)
> 
>   $ sudo ./perf probe do_sys_open
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904
> 
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060896 filename_string=+0(%gpr4):string
> 
> For second case, perf probed on GEP. So when function will be called
> via LEP, probe won't hit.
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.195 MB perf.data ]
> 
> To resolve this issue, let's not prioritize symbol table, let perf
> decide what it wants to use. Perf is already converting GEP to LEP
> when it uses symbol table. When perf uses debuginfo, let it find
> LEP offset form symbol table. This way we fall back to probe on LEP
> for all cases.
> 
> After patch:
>   $ sudo ./perf probe 'do_sys_open filename:string'
>   $ sudo cat /sys/kernel/debug/tracing/kprobe_events
> p:probe/do_sys_open _text+3060904 filename_string=+0(%gpr4):string
> 
>   $ sudo ./perf record -a -e probe:do_sys_open ls
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.197 MB perf.data (11 samples) ]

OK, I see.
And I'd like to add note below.

 This reverts commit d5c2e2c17ae1 ("perf probe ppc64le: Prefer symbol
 table lookup over DWARF").

Acked-by: Masami Hiramatsu 

for this series. 

Thanks,

> 
> Signed-off-by: Ravi Bangoria 
> ---
>  tools/perf/arch/powerpc/util/sym-handling.c | 27 +
>  tools/perf/util/probe-event.c   | 37 
> -
>  tools/perf/util/probe-event.h   |  6 -
>  3 files changed, 49 insertions(+), 21 deletions(-)
> 
> diff --git a/tools/perf/arch/powerpc/util/sym-handling.c 
> b/tools/perf/arch/powerpc/util/sym-handling.c
> index c6d0f91..8d4dc97 100644
> --- a/tools/perf/arch/powerpc/util/sym-handling.c
> +++ b/tools/perf/arch/powerpc/util/sym-handling.c
> @@ -54,10 +54,6 @@ int arch__compare_symbol_names(const char *namea, const 
> char *nameb)
>  #endif
>  
>  #if defined(_CALL_ELF) && _CALL_ELF == 2
> -bool arch__prefers_symtab(void)
> -{
> - return true;
> -}
>  
>  #ifdef HAVE_LIBELF_SUPPORT
>  void arch__sym_update(struct symbol *s, GElf_Sym *sym)
> @@ -100,4 +96,27 @@ void arch__fix_tev_from_maps(struct perf_probe_event *pev,
>   tev->point.offset += lep_offset;
>   }
>  }
> +
> +void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
> +int ntevs)
> +{
> + struct probe_trace_event *tev;
> + struct map *map;
> + struct symbol *sym = NULL;
> + struct rb_node *tmp;
> + int i = 0;
> +
> + map = get_target_map(pev->target, pev->uprobes);
> + if (!map || map__load(map, NULL) < 0)
> + return;
> +
> + for (i = 0; i < ntevs; i++) {
> + tev = >tevs[i];
> + map__for_each_symbol(map, sym, tmp) {
> + if (map->unmap_ip(map, sym->start) == 
> tev->point.address)
> + arch__fix_tev_from_maps(pev, tev, map, sym);
> + }
> + }
> +}
> +
>  #endif
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 4e215e7..5efa535 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -178,7 +178,7 @@ static struct map *kernel_get_module_map(const char 
> *module)
>   return NULL;
>  }
>  
> -static struct map *get_target_map(const char *target, bool user)
> +struct map *get_target_map(const char *target, bool user)
>  {
>   /* Init maps of given executable or kernel */
>   if (user)
> @@ -703,19 +703,32 @@ post_process_kernel_probe_trace_events(struct 
> probe_trace_event *tevs,
>   return skipped;
>  }
>  
> +void __weak
> +arch__post_process_probe_trace_events(struct perf_probe_event *pev 
> __maybe_unused,
> +   int ntevs __maybe_unused)
> +{
> +}
> +
>  /* Post processing the probe events */
> -static int