All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@redhat.com>
Cc: Wang Nan <wangnan0@huawei.com>, Ingo Molnar <mingo@redhat.com>,
	Namhyung Kim <namhyung@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Li Zefan <lizefan@huawei.com>
Subject: Re: [PATCH] perf callchain: separate eh/debug frame offset cache.
Date: Thu, 19 Mar 2015 11:03:52 -0300	[thread overview]
Message-ID: <20150319140352.GJ2983@kernel.org> (raw)
In-Reply-To: <550A6AA0.1000005@huawei.com>

Em Thu, Mar 19, 2015 at 02:20:16PM +0800, Wang Nan escreveu:
> Hi Ingo,
> 
>> Could you please collect this patch? It fixes a bug which prevent unwind for ARM.

Hi Jiri, can I have your Acked-by for this change, since you worked on
this unwind code the most?

- Arnaldo
 
> 
> On 2015/3/13 17:44, Namhyung Kim wrote:
> > Hi Wang,
> > 
> > On Fri, Mar 13, 2015 at 03:02:56PM +0800, Wang Nan wrote:
> >> Commit f1f13af99a90 ("perf callchain: Cache eh/debug frame offset for
> >> dwarf unwind") introduces a cache for .debug_frame and .eh_frame_hdr.
> >> Unfortunately, it makes them share a same cache (dso->frame_offset).
> >> Which causes unwind failure on ARM:
> >>
> >>    $ perf test unwind
> >>   Test dwarf unwind: FAILED!
> >>
> >> The reason is that, if a dso has '.debug_frame' but doesn't have
> >> '.eh_frame_hdr' (like ARM), dso->frame_offset will be filled by offset
> >> of '.debug_frame' during the first time calling of find_proc_info() ->
> >> read_unwind_spec_debug_frame(), and be regarded to '.eh_frame_hdr' when
> >> the second time calling of find_proc_info() ->
> >> read_unwind_spec_eh_frame(), since '.eh_frame_hdr' is checked prior to
> >> '.debug_frame'.
> >>
> >> This patch solves the problem by creating two cache fields for
> >> '.eh_frame_hdr' and '.debug_frame'.
> >>
> >> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> > 
> > Acked-by: Namhyung Kim <namhyung@kernel.org>
> > 
> > Thanks,
> > Namhyung
> > 
> > 
> >> ---
> >>  tools/perf/util/dso.h              | 3 ++-
> >>  tools/perf/util/unwind-libunwind.c | 8 ++++----
> >>  2 files changed, 6 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
> >> index ced9284..408c65f 100644
> >> --- a/tools/perf/util/dso.h
> >> +++ b/tools/perf/util/dso.h
> >> @@ -139,7 +139,8 @@ struct dso {
> >>  		u32		 status_seen;
> >>  		size_t		 file_size;
> >>  		struct list_head open_entry;
> >> -		u64		 frame_offset;
> >> +		u64		 debug_frame_offset;
> >> +		u64		 eh_frame_hdr_offset;
> >>  	} data;
> >>
> >>  	union { /* Tool specific area */
> >> diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
> >> index e3c40a5..7b09a44 100644
> >> --- a/tools/perf/util/unwind-libunwind.c
> >> +++ b/tools/perf/util/unwind-libunwind.c
> >> @@ -266,7 +266,7 @@ static int read_unwind_spec_eh_frame(struct dso *dso, struct machine *machine,
> >>  				     u64 *fde_count)
> >>  {
> >>  	int ret = -EINVAL, fd;
> >> -	u64 offset = dso->data.frame_offset;
> >> +	u64 offset = dso->data.eh_frame_hdr_offset;
> >>
> >>  	if (offset == 0) {
> >>  		fd = dso__data_fd(dso, machine);
> >> @@ -275,7 +275,7 @@ static int read_unwind_spec_eh_frame(struct dso *dso, struct machine *machine,
> >>
> >>  		/* Check the .eh_frame section for unwinding info */
> >>  		offset = elf_section_offset(fd, ".eh_frame_hdr");
> >> -		dso->data.frame_offset = offset;
> >> +		dso->data.eh_frame_hdr_offset = offset;
> >>  	}
> >>
> >>  	if (offset)
> >> @@ -291,7 +291,7 @@ static int read_unwind_spec_debug_frame(struct dso *dso,
> >>  					struct machine *machine, u64 *offset)
> >>  {
> >>  	int fd;
> >> -	u64 ofs = dso->data.frame_offset;
> >> +	u64 ofs = dso->data.debug_frame_offset;
> >>
> >>  	if (ofs == 0) {
> >>  		fd = dso__data_fd(dso, machine);
> >> @@ -300,7 +300,7 @@ static int read_unwind_spec_debug_frame(struct dso *dso,
> >>
> >>  		/* Check the .debug_frame section for unwinding info */
> >>  		ofs = elf_section_offset(fd, ".debug_frame");
> >> -		dso->data.frame_offset = ofs;
> >> +		dso->data.debug_frame_offset = ofs;
> >>  	}
> >>
> >>  	*offset = ofs;
> >> --
> >> 1.8.3.4
> >>
> 

  reply	other threads:[~2015-03-19 14:03 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-13  7:02 [PATCH] perf callchain: separate eh/debug frame offset cache Wang Nan
2015-03-13  9:44 ` Namhyung Kim
2015-03-19  6:20   ` Wang Nan
2015-03-19 14:03     ` Arnaldo Carvalho de Melo [this message]
2015-03-19 14:11       ` Jiri Olsa
2015-03-22 10:13 ` [tip:perf/core] perf callchain: Separate eh/ debug " tip-bot for Wang Nan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150319140352.GJ2983@kernel.org \
    --to=acme@kernel.org \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=wangnan0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.