2021-02-10 19:42:08

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 0/4] perf: Fix archive/debugcache PE files

Hello perf maintainers,

I have some patches to get "perf archive" working with PE binaries (e.g.
Wine DLLs or Windows executables.) The PE support in perf is fairly new and
"perf archive" hasn't been updated to work with it. In getting this working
I've come across a number of bugs in perf that these patches aim to fix.
The patches are independent and can be committed in any order.

Some of these are because build-ids are now variable width. Build-ids in PE
files are always 16-byte GUIDs; much of the existing code still assumes a
20-byte SHA-1 build-id. I've tried to make the minimal amount of changes to
allow 16-byte build-ids to work with a debugcache from a perf archive.

I'm new to kernel development so I apologize if I'm doing this incorrectly.

Thanks,

Nick

Nicholas Fraser (4):
perf buildid-cache: Don't skip 16-byte build-ids
perf report: Load PE files from debug cache only
perf archive: Fix filtering of empty build-ids
perf report: Fix return value when loading PE DSO

tools/perf/perf-archive.sh | 3 +--
tools/perf/util/build-id.c | 5 +++--
tools/perf/util/build-id.h | 4 +++-
tools/perf/util/symbol.c | 12 ++++--------
4 files changed, 11 insertions(+), 13 deletions(-)

--
2.30.0


2021-02-16 20:39:54

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 1/2] perf report: Remove redundant libbfd checks

This removes the redundant checks bfd_check_format() and
bfd_target_elf_flavour. They were previously checking different files.
---
tools/perf/util/symbol.c | 9 ---------
1 file changed, 9 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 492c873713cc..08f6f57c84fd 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1586,15 +1586,6 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
if (section)
dso->text_offset = section->vma - section->filepos;

- if (!bfd_check_format(abfd, bfd_object)) {
- pr_debug2("%s: cannot read %s bfd file.\n", __func__,
- debugfile);
- goto out_close;
- }
-
- if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
- goto out_close;
-
symbols_size = bfd_get_symtab_upper_bound(abfd);
if (symbols_size == 0) {
bfd_close(abfd);
--
2.30.1

2021-02-16 20:40:29

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 2/2] perf buildid-cache: Add test for 16-byte build-id

tests/shell/buildid.sh added an ELF executable with an MD5 build-id to
the perf debug cache but did not check whether the object was printed
by a subsequent call to "perf buildid-cache -l". It was being omitted
from the list.

A previous commit fixed the bug that left it out of the list. This adds
a test for it.
---
tools/perf/tests/shell/buildid.sh | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/tools/perf/tests/shell/buildid.sh b/tools/perf/tests/shell/buildid.sh
index 4861a20edee2..de02a23b7c7b 100755
--- a/tools/perf/tests/shell/buildid.sh
+++ b/tools/perf/tests/shell/buildid.sh
@@ -50,6 +50,12 @@ check()
exit 1
fi

+ ${perf} buildid-cache -l|grep $id
+ if [ $? -ne 0 ]; then
+ echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
+ exit 1
+ fi
+
echo "OK for ${1}"
}

--
2.30.1


2021-02-16 21:06:53

by Nicholas Fraser

[permalink] [raw]
Subject: Re: [PATCH 2/2] perf buildid-cache: Add test for 16-byte build-id

Sorry, I just realized I forgot to run checkpatch.pl on these; they're
missing the --signoff. I'll re-send.

On 2021-02-16 3:38 p.m., Nicholas Fraser wrote:
> tests/shell/buildid.sh added an ELF executable with an MD5 build-id to
> the perf debug cache but did not check whether the object was printed
> by a subsequent call to "perf buildid-cache -l". It was being omitted
> from the list.
>
> A previous commit fixed the bug that left it out of the list. This adds
> a test for it.
> ---
> tools/perf/tests/shell/buildid.sh | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/tools/perf/tests/shell/buildid.sh b/tools/perf/tests/shell/buildid.sh
> index 4861a20edee2..de02a23b7c7b 100755
> --- a/tools/perf/tests/shell/buildid.sh
> +++ b/tools/perf/tests/shell/buildid.sh
> @@ -50,6 +50,12 @@ check()
> exit 1
> fi
>
> + ${perf} buildid-cache -l|grep $id
> + if [ $? -ne 0 ]; then
> + echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
> + exit 1
> + fi
> +
> echo "OK for ${1}"
> }
>
>

2021-02-16 21:09:25

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 1/2] perf report: Remove redundant libbfd checks

This removes the redundant checks bfd_check_format() and
bfd_target_elf_flavour. They were previously checking different files.

Signed-off-by: Nicholas Fraser <[email protected]>
---
tools/perf/util/symbol.c | 9 ---------
1 file changed, 9 deletions(-)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 492c873713cc..08f6f57c84fd 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1586,15 +1586,6 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
if (section)
dso->text_offset = section->vma - section->filepos;

- if (!bfd_check_format(abfd, bfd_object)) {
- pr_debug2("%s: cannot read %s bfd file.\n", __func__,
- debugfile);
- goto out_close;
- }
-
- if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
- goto out_close;
-
symbols_size = bfd_get_symtab_upper_bound(abfd);
if (symbols_size == 0) {
bfd_close(abfd);
--
2.30.1

2021-02-16 21:12:28

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 2/2] perf buildid-cache: Add test for 16-byte build-id

tests/shell/buildid.sh added an ELF executable with an MD5 build-id to
the perf debug cache but did not check whether the object was printed
by a subsequent call to "perf buildid-cache -l". It was being omitted
from the list.

A previous commit fixed the bug that left it out of the list. This adds
a test for it.

Signed-off-by: Nicholas Fraser <[email protected]>
---
tools/perf/tests/shell/buildid.sh | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/tools/perf/tests/shell/buildid.sh b/tools/perf/tests/shell/buildid.sh
index 4861a20edee2..de02a23b7c7b 100755
--- a/tools/perf/tests/shell/buildid.sh
+++ b/tools/perf/tests/shell/buildid.sh
@@ -50,6 +50,12 @@ check()
exit 1
fi

+ ${perf} buildid-cache -l|grep $id
+ if [ $? -ne 0 ]; then
+ echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
+ exit 1
+ fi
+
echo "OK for ${1}"
}

--
2.30.1

2021-02-17 21:22:36

by Jiri Olsa

[permalink] [raw]
Subject: Re: [PATCH 2/2] perf buildid-cache: Add test for 16-byte build-id

On Tue, Feb 16, 2021 at 04:06:44PM -0500, Nicholas Fraser wrote:
> tests/shell/buildid.sh added an ELF executable with an MD5 build-id to
> the perf debug cache but did not check whether the object was printed
> by a subsequent call to "perf buildid-cache -l". It was being omitted
> from the list.
>
> A previous commit fixed the bug that left it out of the list. This adds
> a test for it.
>
> Signed-off-by: Nicholas Fraser <[email protected]>

Acked-by: Jiri Olsa <[email protected]>

few nits below

> ---
> tools/perf/tests/shell/buildid.sh | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/tools/perf/tests/shell/buildid.sh b/tools/perf/tests/shell/buildid.sh
> index 4861a20edee2..de02a23b7c7b 100755
> --- a/tools/perf/tests/shell/buildid.sh
> +++ b/tools/perf/tests/shell/buildid.sh
> @@ -50,6 +50,12 @@ check()
> exit 1
> fi
>
> + ${perf} buildid-cache -l|grep $id

please make space before and after '|'
and use ${id} instead of $id, we use that all over the script

thanks,
jirka


> + if [ $? -ne 0 ]; then
> + echo "failed: ${id} is not reported by \"perf buildid-cache -l\""
> + exit 1
> + fi
> +
> echo "OK for ${1}"
> }
>
> --
> 2.30.1
>

2021-02-18 20:00:19

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH 1/2] perf report: Remove redundant libbfd checks

Em Tue, Feb 16, 2021 at 03:37:20PM -0500, Nicholas Fraser escreveu:
> This removes the redundant checks bfd_check_format() and
> bfd_target_elf_flavour. They were previously checking different files.

you forgot the:

Signed-off-by: Nicholas Fraser <[email protected]>

I'm adding it, ok?

I'm also addressing Jiri's remark about spaces surrounding |

- Arnaldo
> ---
> tools/perf/util/symbol.c | 9 ---------
> 1 file changed, 9 deletions(-)
>
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index 492c873713cc..08f6f57c84fd 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -1586,15 +1586,6 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
> if (section)
> dso->text_offset = section->vma - section->filepos;
>
> - if (!bfd_check_format(abfd, bfd_object)) {
> - pr_debug2("%s: cannot read %s bfd file.\n", __func__,
> - debugfile);
> - goto out_close;
> - }
> -
> - if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
> - goto out_close;
> -
> symbols_size = bfd_get_symtab_upper_bound(abfd);
> if (symbols_size == 0) {
> bfd_close(abfd);
> --
> 2.30.1

--

- Arnaldo

2021-02-18 20:01:04

by Nicholas Fraser

[permalink] [raw]
Subject: Re: [PATCH 1/2] perf report: Remove redundant libbfd checks


On 2021-02-18 2:39 p.m., Arnaldo Carvalho de Melo wrote:
> you forgot the:
>
> Signed-off-by: Nicholas Fraser <[email protected]>
>
> I'm adding it, ok?

Ah yes sorry about that, to be explicit here it is:

Signed-off-by: Nicholas Fraser <[email protected]>

>
> I'm also addressing Jiri's remark about spaces surrounding |
>

Thanks. I included this fix in my follow-up patch though so
you might get a conflict.

Nick

2021-02-18 20:01:31

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH 1/2] perf report: Remove redundant libbfd checks

Em Thu, Feb 18, 2021 at 02:42:17PM -0500, Nicholas Fraser escreveu:
>
> On 2021-02-18 2:39 p.m., Arnaldo Carvalho de Melo wrote:
> > you forgot the:
> >
> > Signed-off-by: Nicholas Fraser <[email protected]>
> >
> > I'm adding it, ok?
>
> Ah yes sorry about that, to be explicit here it is:
>
> Signed-off-by: Nicholas Fraser <[email protected]>
>
> >
> > I'm also addressing Jiri's remark about spaces surrounding |
> >
>
> Thanks. I included this fix in my follow-up patch though so
> you might get a conflict.

I'm pushing to tmp.perf/core what I have, I think there are missing
patches and the latest test isn't applying. can you please take a look
and perhaps refresh patches?

I'll start the tests now so that I can move all this to perf/core
proper.

- Arnaldo