2021-02-10 19:40:24

by Nicholas Fraser

[permalink] [raw]
Subject: [PATCH 3/4] perf archive: Fix filtering of empty build-ids

A non-existent build-id used to be treated as all-zero SHA-1 hash.
Build-ids are now variable width. A non-existent build-id is an empty
string and "perf buildid-list" pads this with spaces.

This fixes "perf-archive" to skip missing build-ids by skipping lines
that start with a padding space rather than with zeroes.

Signed-off-by: Nicholas Fraser <[email protected]>
---
tools/perf/perf-archive.sh | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/perf/perf-archive.sh b/tools/perf/perf-archive.sh
index 0cfb3e2cefef..133f0eddbcc4 100644
--- a/tools/perf/perf-archive.sh
+++ b/tools/perf/perf-archive.sh
@@ -20,9 +20,8 @@ else
fi

BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX)
-NOBUILDID=0000000000000000000000000000000000000000

-perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS
+perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS
if [ ! -s $BUILDIDS ] ; then
echo "perf archive: no build-ids found"
rm $BUILDIDS || true
--
2.30.0


2021-02-12 12:30:58

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf archive: Fix filtering of empty build-ids

Em Wed, Feb 10, 2021 at 02:17:49PM -0500, Nicholas Fraser escreveu:
> A non-existent build-id used to be treated as all-zero SHA-1 hash.
> Build-ids are now variable width. A non-existent build-id is an empty
> string and "perf buildid-list" pads this with spaces.
>
> This fixes "perf-archive" to skip missing build-ids by skipping lines
> that start with a padding space rather than with zeroes.
>
> Signed-off-by: Nicholas Fraser <[email protected]>
> ---
> tools/perf/perf-archive.sh | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/tools/perf/perf-archive.sh b/tools/perf/perf-archive.sh
> index 0cfb3e2cefef..133f0eddbcc4 100644
> --- a/tools/perf/perf-archive.sh
> +++ b/tools/perf/perf-archive.sh
> @@ -20,9 +20,8 @@ else
> fi
>
> BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX)
> -NOBUILDID=0000000000000000000000000000000000000000
>
> -perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS
> +perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS
> if [ ! -s $BUILDIDS ] ; then
> echo "perf archive: no build-ids found"
> rm $BUILDIDS || true

What should we do when using older files? We have to support both cases.

- Arnaldo

2021-02-12 18:52:43

by Nicholas Fraser

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf archive: Fix filtering of empty build-ids

The current version of "perf buildid-list" prints missing build-ids as
blank even when loading perf.data files generated from older versions of
perf. I've tested with a few older versions.

Since perf-archive is an external script that calls back into perf, it
could in theory find a different older version that still returns zeroes.
We could make it look for a matching perf, e.g. "$(dirname "$0")/perf".
Unfortunately that won't work in general because at least on my system
perf-archive is installed to a different path than perf.

Nick


On 2021-02-12 7:29 a.m., Arnaldo Carvalho de Melo wrote:
> Em Wed, Feb 10, 2021 at 02:17:49PM -0500, Nicholas Fraser escreveu:
>> A non-existent build-id used to be treated as all-zero SHA-1 hash.
>> Build-ids are now variable width. A non-existent build-id is an empty
>> string and "perf buildid-list" pads this with spaces.
>>
>> This fixes "perf-archive" to skip missing build-ids by skipping lines
>> that start with a padding space rather than with zeroes.
>>
>> Signed-off-by: Nicholas Fraser <[email protected]>
>> ---
>> tools/perf/perf-archive.sh | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/perf-archive.sh b/tools/perf/perf-archive.sh
>> index 0cfb3e2cefef..133f0eddbcc4 100644
>> --- a/tools/perf/perf-archive.sh
>> +++ b/tools/perf/perf-archive.sh
>> @@ -20,9 +20,8 @@ else
>> fi
>>
>> BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX)
>> -NOBUILDID=0000000000000000000000000000000000000000
>>
>> -perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS
>> +perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS
>> if [ ! -s $BUILDIDS ] ; then
>> echo "perf archive: no build-ids found"
>> rm $BUILDIDS || true
>
> What should we do when using older files? We have to support both cases.
>
> - Arnaldo
>

2021-02-12 21:09:52

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf archive: Fix filtering of empty build-ids

Em Fri, Feb 12, 2021 at 01:49:36PM -0500, Nicholas Fraser escreveu:
> The current version of "perf buildid-list" prints missing build-ids as
> blank even when loading perf.data files generated from older versions of
> perf. I've tested with a few older versions.
>
> Since perf-archive is an external script that calls back into perf, it
> could in theory find a different older version that still returns zeroes.
> We could make it look for a matching perf, e.g. "$(dirname "$0")/perf".
> Unfortunately that won't work in general because at least on my system
> perf-archive is installed to a different path than perf.

It shouldn't try to find a "matching perf" as the userspace perf is not
in lockstep with the kernel perf subsystem :-)

If a current 'perf archive' is called on some perf.data file, it should
know that a zero-filled or a blank filled build-id means the same and
act accordingly.

- Arnaldo

> Nick
>
>
> On 2021-02-12 7:29 a.m., Arnaldo Carvalho de Melo wrote:
> > Em Wed, Feb 10, 2021 at 02:17:49PM -0500, Nicholas Fraser escreveu:
> >> A non-existent build-id used to be treated as all-zero SHA-1 hash.
> >> Build-ids are now variable width. A non-existent build-id is an empty
> >> string and "perf buildid-list" pads this with spaces.
> >>
> >> This fixes "perf-archive" to skip missing build-ids by skipping lines
> >> that start with a padding space rather than with zeroes.
> >>
> >> Signed-off-by: Nicholas Fraser <[email protected]>
> >> ---
> >> tools/perf/perf-archive.sh | 3 +--
> >> 1 file changed, 1 insertion(+), 2 deletions(-)
> >>
> >> diff --git a/tools/perf/perf-archive.sh b/tools/perf/perf-archive.sh
> >> index 0cfb3e2cefef..133f0eddbcc4 100644
> >> --- a/tools/perf/perf-archive.sh
> >> +++ b/tools/perf/perf-archive.sh
> >> @@ -20,9 +20,8 @@ else
> >> fi
> >>
> >> BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX)
> >> -NOBUILDID=0000000000000000000000000000000000000000
> >>
> >> -perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS
> >> +perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS
> >> if [ ! -s $BUILDIDS ] ; then
> >> echo "perf archive: no build-ids found"
> >> rm $BUILDIDS || true
> >
> > What should we do when using older files? We have to support both cases.
> >
> > - Arnaldo
> >

--

- Arnaldo