2018-03-09 03:11:40

by Kim Phillips

[permalink] [raw]
Subject: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Based on prior work:

https://lkml.org/lkml/2014/5/6/395

and how other arches add libdw unwind support. Includes support for
running the unwind test, e.g., on a system with only elfutils' libdw
0.170, the test now runs, and successfully:

$ ./perf test unwind
56: Test dwarf unwind : Ok

Reported-by: Christian Hansen <[email protected]>
Originally-by: Jean Pihet <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Kim Phillips <[email protected]>
---
tools/perf/Makefile.config | 2 +-
tools/perf/arch/arm64/include/arch-tests.h | 12 ++++++
tools/perf/arch/arm64/tests/Build | 3 ++
tools/perf/arch/arm64/tests/arch-tests.c | 16 ++++++++
tools/perf/arch/arm64/util/Build | 1 +
tools/perf/arch/arm64/util/unwind-libdw.c | 60 ++++++++++++++++++++++++++++++
6 files changed, 93 insertions(+), 1 deletion(-)
create mode 100644 tools/perf/arch/arm64/include/arch-tests.h
create mode 100644 tools/perf/arch/arm64/tests/arch-tests.c
create mode 100644 tools/perf/arch/arm64/util/unwind-libdw.c

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 89cb2a36b8ff..98ff73648b51 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -75,7 +75,7 @@ endif
# Disable it on all other architectures in case libdw unwind
# support is detected in system. Add supported architectures
# to the check.
-ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc s390))
+ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390))
NO_LIBDW_DWARF_UNWIND := 1
endif

diff --git a/tools/perf/arch/arm64/include/arch-tests.h b/tools/perf/arch/arm64/include/arch-tests.h
new file mode 100644
index 000000000000..90ec4c8cb880
--- /dev/null
+++ b/tools/perf/arch/arm64/include/arch-tests.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef ARCH_TESTS_H
+#define ARCH_TESTS_H
+
+#ifdef HAVE_DWARF_UNWIND_SUPPORT
+struct thread;
+struct perf_sample;
+#endif
+
+extern struct test arch_tests[];
+
+#endif
diff --git a/tools/perf/arch/arm64/tests/Build b/tools/perf/arch/arm64/tests/Build
index b30eff9bcc83..ca5630e73474 100644
--- a/tools/perf/arch/arm64/tests/Build
+++ b/tools/perf/arch/arm64/tests/Build
@@ -1,2 +1,5 @@
libperf-y += regs_load.o
libperf-y += dwarf-unwind.o
+
+libperf-y += arch-tests.o
+
diff --git a/tools/perf/arch/arm64/tests/arch-tests.c b/tools/perf/arch/arm64/tests/arch-tests.c
new file mode 100644
index 000000000000..5b1543c98022
--- /dev/null
+++ b/tools/perf/arch/arm64/tests/arch-tests.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <string.h>
+#include "tests/tests.h"
+#include "arch-tests.h"
+
+struct test arch_tests[] = {
+#ifdef HAVE_DWARF_UNWIND_SUPPORT
+ {
+ .desc = "DWARF unwind",
+ .func = test__dwarf_unwind,
+ },
+#endif
+ {
+ .func = NULL,
+ },
+};
diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index c0b8dfef98ba..68f8a8eb3ad0 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -2,6 +2,7 @@ libperf-y += header.o
libperf-y += sym-handling.o
libperf-$(CONFIG_DWARF) += dwarf-regs.o
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
+libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o

libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
../../arm/util/auxtrace.o \
diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/arch/arm64/util/unwind-libdw.c
new file mode 100644
index 000000000000..7623d85e77f3
--- /dev/null
+++ b/tools/perf/arch/arm64/util/unwind-libdw.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <elfutils/libdwfl.h>
+#include "../../util/unwind-libdw.h"
+#include "../../util/perf_regs.h"
+#include "../../util/event.h"
+
+bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
+{
+ struct unwind_info *ui = arg;
+ struct regs_dump *user_regs = &ui->sample->user_regs;
+ Dwarf_Word dwarf_regs[PERF_REG_ARM64_MAX], dwarf_pc;
+
+#define REG(r) ({ \
+ Dwarf_Word val = 0; \
+ perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \
+ val; \
+})
+
+ dwarf_regs[0] = REG(X0);
+ dwarf_regs[1] = REG(X1);
+ dwarf_regs[2] = REG(X2);
+ dwarf_regs[3] = REG(X3);
+ dwarf_regs[4] = REG(X4);
+ dwarf_regs[5] = REG(X5);
+ dwarf_regs[6] = REG(X6);
+ dwarf_regs[7] = REG(X7);
+ dwarf_regs[8] = REG(X8);
+ dwarf_regs[9] = REG(X9);
+ dwarf_regs[10] = REG(X10);
+ dwarf_regs[11] = REG(X11);
+ dwarf_regs[12] = REG(X12);
+ dwarf_regs[13] = REG(X13);
+ dwarf_regs[14] = REG(X14);
+ dwarf_regs[15] = REG(X15);
+ dwarf_regs[16] = REG(X16);
+ dwarf_regs[17] = REG(X17);
+ dwarf_regs[18] = REG(X18);
+ dwarf_regs[19] = REG(X19);
+ dwarf_regs[20] = REG(X20);
+ dwarf_regs[21] = REG(X21);
+ dwarf_regs[22] = REG(X22);
+ dwarf_regs[23] = REG(X23);
+ dwarf_regs[24] = REG(X24);
+ dwarf_regs[25] = REG(X25);
+ dwarf_regs[26] = REG(X26);
+ dwarf_regs[27] = REG(X27);
+ dwarf_regs[28] = REG(X28);
+ dwarf_regs[29] = REG(X29);
+ dwarf_regs[30] = REG(LR);
+ dwarf_regs[31] = REG(SP);
+
+ if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX,
+ dwarf_regs))
+ return false;
+
+ dwarf_pc = REG(PC);
+ dwfl_thread_state_register_pc(thread, dwarf_pc);
+
+ return true;
+}
--
2.16.2



2018-03-09 15:07:38

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Em Thu, Mar 08, 2018 at 09:10:30PM -0600, Kim Phillips escreveu:
> Based on prior work:
>
> https://lkml.org/lkml/2014/5/6/395

Thanks, looks good, applying.

Jean, is everything ok with you on this?

- Arnaldo

> and how other arches add libdw unwind support. Includes support for
> running the unwind test, e.g., on a system with only elfutils' libdw
> 0.170, the test now runs, and successfully:
>
> $ ./perf test unwind
> 56: Test dwarf unwind : Ok
>
> Reported-by: Christian Hansen <[email protected]>
> Originally-by: Jean Pihet <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Cc: Ingo Molnar <[email protected]>
> Cc: Arnaldo Carvalho de Melo <[email protected]>
> Cc: Alexander Shishkin <[email protected]>
> Cc: Jiri Olsa <[email protected]>
> Cc: Namhyung Kim <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Kim Phillips <[email protected]>
> ---
> tools/perf/Makefile.config | 2 +-
> tools/perf/arch/arm64/include/arch-tests.h | 12 ++++++
> tools/perf/arch/arm64/tests/Build | 3 ++
> tools/perf/arch/arm64/tests/arch-tests.c | 16 ++++++++
> tools/perf/arch/arm64/util/Build | 1 +
> tools/perf/arch/arm64/util/unwind-libdw.c | 60 ++++++++++++++++++++++++++++++
> 6 files changed, 93 insertions(+), 1 deletion(-)
> create mode 100644 tools/perf/arch/arm64/include/arch-tests.h
> create mode 100644 tools/perf/arch/arm64/tests/arch-tests.c
> create mode 100644 tools/perf/arch/arm64/util/unwind-libdw.c
>
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index 89cb2a36b8ff..98ff73648b51 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -75,7 +75,7 @@ endif
> # Disable it on all other architectures in case libdw unwind
> # support is detected in system. Add supported architectures
> # to the check.
> -ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc s390))
> +ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390))
> NO_LIBDW_DWARF_UNWIND := 1
> endif
>
> diff --git a/tools/perf/arch/arm64/include/arch-tests.h b/tools/perf/arch/arm64/include/arch-tests.h
> new file mode 100644
> index 000000000000..90ec4c8cb880
> --- /dev/null
> +++ b/tools/perf/arch/arm64/include/arch-tests.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef ARCH_TESTS_H
> +#define ARCH_TESTS_H
> +
> +#ifdef HAVE_DWARF_UNWIND_SUPPORT
> +struct thread;
> +struct perf_sample;
> +#endif
> +
> +extern struct test arch_tests[];
> +
> +#endif
> diff --git a/tools/perf/arch/arm64/tests/Build b/tools/perf/arch/arm64/tests/Build
> index b30eff9bcc83..ca5630e73474 100644
> --- a/tools/perf/arch/arm64/tests/Build
> +++ b/tools/perf/arch/arm64/tests/Build
> @@ -1,2 +1,5 @@
> libperf-y += regs_load.o
> libperf-y += dwarf-unwind.o
> +
> +libperf-y += arch-tests.o
> +
> diff --git a/tools/perf/arch/arm64/tests/arch-tests.c b/tools/perf/arch/arm64/tests/arch-tests.c
> new file mode 100644
> index 000000000000..5b1543c98022
> --- /dev/null
> +++ b/tools/perf/arch/arm64/tests/arch-tests.c
> @@ -0,0 +1,16 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#include <string.h>
> +#include "tests/tests.h"
> +#include "arch-tests.h"
> +
> +struct test arch_tests[] = {
> +#ifdef HAVE_DWARF_UNWIND_SUPPORT
> + {
> + .desc = "DWARF unwind",
> + .func = test__dwarf_unwind,
> + },
> +#endif
> + {
> + .func = NULL,
> + },
> +};
> diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
> index c0b8dfef98ba..68f8a8eb3ad0 100644
> --- a/tools/perf/arch/arm64/util/Build
> +++ b/tools/perf/arch/arm64/util/Build
> @@ -2,6 +2,7 @@ libperf-y += header.o
> libperf-y += sym-handling.o
> libperf-$(CONFIG_DWARF) += dwarf-regs.o
> libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
> +libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
>
> libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
> ../../arm/util/auxtrace.o \
> diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/arch/arm64/util/unwind-libdw.c
> new file mode 100644
> index 000000000000..7623d85e77f3
> --- /dev/null
> +++ b/tools/perf/arch/arm64/util/unwind-libdw.c
> @@ -0,0 +1,60 @@
> +// SPDX-License-Identifier: GPL-2.0
> +#include <elfutils/libdwfl.h>
> +#include "../../util/unwind-libdw.h"
> +#include "../../util/perf_regs.h"
> +#include "../../util/event.h"
> +
> +bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
> +{
> + struct unwind_info *ui = arg;
> + struct regs_dump *user_regs = &ui->sample->user_regs;
> + Dwarf_Word dwarf_regs[PERF_REG_ARM64_MAX], dwarf_pc;
> +
> +#define REG(r) ({ \
> + Dwarf_Word val = 0; \
> + perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \
> + val; \
> +})
> +
> + dwarf_regs[0] = REG(X0);
> + dwarf_regs[1] = REG(X1);
> + dwarf_regs[2] = REG(X2);
> + dwarf_regs[3] = REG(X3);
> + dwarf_regs[4] = REG(X4);
> + dwarf_regs[5] = REG(X5);
> + dwarf_regs[6] = REG(X6);
> + dwarf_regs[7] = REG(X7);
> + dwarf_regs[8] = REG(X8);
> + dwarf_regs[9] = REG(X9);
> + dwarf_regs[10] = REG(X10);
> + dwarf_regs[11] = REG(X11);
> + dwarf_regs[12] = REG(X12);
> + dwarf_regs[13] = REG(X13);
> + dwarf_regs[14] = REG(X14);
> + dwarf_regs[15] = REG(X15);
> + dwarf_regs[16] = REG(X16);
> + dwarf_regs[17] = REG(X17);
> + dwarf_regs[18] = REG(X18);
> + dwarf_regs[19] = REG(X19);
> + dwarf_regs[20] = REG(X20);
> + dwarf_regs[21] = REG(X21);
> + dwarf_regs[22] = REG(X22);
> + dwarf_regs[23] = REG(X23);
> + dwarf_regs[24] = REG(X24);
> + dwarf_regs[25] = REG(X25);
> + dwarf_regs[26] = REG(X26);
> + dwarf_regs[27] = REG(X27);
> + dwarf_regs[28] = REG(X28);
> + dwarf_regs[29] = REG(X29);
> + dwarf_regs[30] = REG(LR);
> + dwarf_regs[31] = REG(SP);
> +
> + if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX,
> + dwarf_regs))
> + return false;
> +
> + dwarf_pc = REG(PC);
> + dwfl_thread_state_register_pc(thread, dwarf_pc);
> +
> + return true;
> +}
> --
> 2.16.2

2018-03-09 18:09:03

by Kim Phillips

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

On Fri, 9 Mar 2018 12:06:27 -0300
Arnaldo Carvalho de Melo <[email protected]> wrote:

Hi Arnaldo,

> Em Thu, Mar 08, 2018 at 09:10:30PM -0600, Kim Phillips escreveu:
> > Based on prior work:
> >
> > https://lkml.org/lkml/2014/5/6/395
>
> Thanks, looks good, applying.
>
> Jean, is everything ok with you on this?

By now your email to Jean should have bounced with "The email account
that you tried to reach does not exist." Removing Jean from Cc.

It seems like you're applying patches. There are a couple that have
slipped through the cracks: Can you please take a look at applying them?

- "perf tools: Fixing uninitialised variable"
https://patchwork.kernel.org/patch/10179381/

- "perf unwind: Report error from dwfl_attach_state"
https://patchwork.kernel.org/patch/10211483/
[Martin, I guess it would help if you replied-all that patch and
added your signed-off-by.]

- "perf unwind: Unwind with libdw doesn't take symfs into account"
https://patchwork.kernel.org/patch/10211599/

Thanks,

Kim

2018-03-09 18:25:54

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Em Fri, Mar 09, 2018 at 12:07:20PM -0600, Kim Phillips escreveu:
> On Fri, 9 Mar 2018 12:06:27 -0300
> Arnaldo Carvalho de Melo <[email protected]> wrote:
>
> Hi Arnaldo,
>
> > Em Thu, Mar 08, 2018 at 09:10:30PM -0600, Kim Phillips escreveu:
> > > Based on prior work:
> > >
> > > https://lkml.org/lkml/2014/5/6/395
> >
> > Thanks, looks good, applying.
> >
> > Jean, is everything ok with you on this?
>
> By now your email to Jean should have bounced with "The email account
> that you tried to reach does not exist." Removing Jean from Cc.
>
> It seems like you're applying patches. There are a couple that have
> slipped through the cracks: Can you please take a look at applying them?
>
> - "perf tools: Fixing uninitialised variable"
> https://patchwork.kernel.org/patch/10179381/

[acme@jouet perf]$ git tag --contains d2785de15f1bd42d613d56bbac5a007e7293b874
perf-core-for-mingo-4.17-20180216

commit d2785de15f1bd42d613d56bbac5a007e7293b874
Author: Mathieu Poirier <[email protected]>
AuthorDate: Mon Feb 12 13:32:37 2018 -0700
Commit: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Fri Feb 16 14:55:40 2018 -0300

perf auxtrace arm: Fixing uninitialised variable

When working natively on arm64 the compiler gets pesky and complains
that variable 'i' is uninitialised, something that breaks the
compilation. Here no further checks are needed since variable
'found_spe' can only be true if variable 'i' has been initialised as
part of the for loop.

Signed-off-by: Mathieu Poirier <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>

diff --git a/tools/perf/arch/arm/util/auxtrace.c b/tools/perf/arch/arm/util/auxtrace.c
index 2323581b157d..fa639e3e52ac 100644
--- a/tools/perf/arch/arm/util/auxtrace.c
+++ b/tools/perf/arch/arm/util/auxtrace.c
@@ -68,7 +68,7 @@ struct auxtrace_record
bool found_spe = false;
static struct perf_pmu **arm_spe_pmus = NULL;
static int nr_spes = 0;
- int i;
+ int i = 0;

> - "perf unwind: Report error from dwfl_attach_state"
> https://patchwork.kernel.org/patch/10211483/
> [Martin, I guess it would help if you replied-all that patch and
> added your signed-off-by.]

Right, the S-o-B is needed

> - "perf unwind: Unwind with libdw doesn't take symfs into account"
> https://patchwork.kernel.org/patch/10211599/

This one has the S-o-B, applying, Jiri, holler if you disagree,

- Arnaldo

> Thanks,
>
> Kim

2018-03-09 18:51:05

by Martin Vuille

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Hi,

I made two other submissions that may also have been overlooked:

https://patchwork.kernel.org/patch/10211401/ -- This one has the S-o-B

https://patchwork.kernel.org/patch/10211473/ -- RFC, was looking for comments, has the S-o-B


For https://patchwork.kernel.org/patch/10211483/, I'm not sure how to go about doing a reply to all.

I had some email problems and was cut-off from the list for a while.

MV


On 03/09/18 13:24, Arnaldo Carvalho de Melo wrote:
> Em Fri, Mar 09, 2018 at 12:07:20PM -0600, Kim Phillips escreveu:
>> On Fri, 9 Mar 2018 12:06:27 -0300
>> Arnaldo Carvalho de Melo <[email protected]> wrote:
>>
>> Hi Arnaldo,
>>
>>> Em Thu, Mar 08, 2018 at 09:10:30PM -0600, Kim Phillips escreveu:
>>>> Based on prior work:
>>>>
>>>> https://lkml.org/lkml/2014/5/6/395
>>> Thanks, looks good, applying.
>>>
>>> Jean, is everything ok with you on this?
>> By now your email to Jean should have bounced with "The email account
>> that you tried to reach does not exist." Removing Jean from Cc.
>>
>> It seems like you're applying patches. There are a couple that have
>> slipped through the cracks: Can you please take a look at applying them?
>>
>> - "perf tools: Fixing uninitialised variable"
>> https://patchwork.kernel.org/patch/10179381/
> [acme@jouet perf]$ git tag --contains d2785de15f1bd42d613d56bbac5a007e7293b874
> perf-core-for-mingo-4.17-20180216
>
> commit d2785de15f1bd42d613d56bbac5a007e7293b874
> Author: Mathieu Poirier <[email protected]>
> AuthorDate: Mon Feb 12 13:32:37 2018 -0700
> Commit: Arnaldo Carvalho de Melo <[email protected]>
> CommitDate: Fri Feb 16 14:55:40 2018 -0300
>
> perf auxtrace arm: Fixing uninitialised variable
>
> When working natively on arm64 the compiler gets pesky and complains
> that variable 'i' is uninitialised, something that breaks the
> compilation. Here no further checks are needed since variable
> 'found_spe' can only be true if variable 'i' has been initialised as
> part of the for loop.
>
> Signed-off-by: Mathieu Poirier <[email protected]>
> Cc: Alexander Shishkin <[email protected]>
> Cc: Jin Yao <[email protected]>
> Cc: Namhyung Kim <[email protected]>
> Cc: Peter Zijlstra <[email protected]>
> Cc: [email protected]
> Link: http://lkml.kernel.org/r/[email protected]
> Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
>
> diff --git a/tools/perf/arch/arm/util/auxtrace.c b/tools/perf/arch/arm/util/auxtrace.c
> index 2323581b157d..fa639e3e52ac 100644
> --- a/tools/perf/arch/arm/util/auxtrace.c
> +++ b/tools/perf/arch/arm/util/auxtrace.c
> @@ -68,7 +68,7 @@ struct auxtrace_record
> bool found_spe = false;
> static struct perf_pmu **arm_spe_pmus = NULL;
> static int nr_spes = 0;
> - int i;
> + int i = 0;
>
>> - "perf unwind: Report error from dwfl_attach_state"
>> https://patchwork.kernel.org/patch/10211483/
>> [Martin, I guess it would help if you replied-all that patch and
>> added your signed-off-by.]
> Right, the S-o-B is needed
>
>> - "perf unwind: Unwind with libdw doesn't take symfs into account"
>> https://patchwork.kernel.org/patch/10211599/
> This one has the S-o-B, applying, Jiri, holler if you disagree,
>
> - Arnaldo
>
>> Thanks,
>>
>> Kim
> --
> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html


2018-03-09 19:16:23

by Kim Phillips

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

On Fri, 9 Mar 2018 13:49:50 -0500
Martin Vuille <[email protected]> wrote:

> For https://patchwork.kernel.org/patch/10211483/, I'm not sure how to go about doing a reply to all.

Hit reply-all from the copy in your Sent folder.

Kim

2018-03-09 19:19:35

by Martin Vuille

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Yes, thought of doing that.

Unfortunately it was sent directly from git, so I do not have a copy of the message that was sent.

MV


On 03/09/18 14:15, Kim Phillips wrote:
> On Fri, 9 Mar 2018 13:49:50 -0500
> Martin Vuille <[email protected]> wrote:
>
>> For https://patchwork.kernel.org/patch/10211483/, I'm not sure how to go about doing a reply to all.
> Hit reply-all from the copy in your Sent folder.
>
> Kim
> --
> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html


2018-03-09 19:31:46

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Em Fri, Mar 09, 2018 at 01:49:50PM -0500, Martin Vuille escreveu:
> Hi,
>
> I made two other submissions that may also have been overlooked:
>
> https://patchwork.kernel.org/patch/10211401/ -- This one has the S-o-B

Ok, replied to that one, I can't see where is it that the symfs is being
first appended, please clarify that in the patch commit log message.

> https://patchwork.kernel.org/patch/10211473/ -- RFC, was looking for comments, has the S-o-B

[RFC,1/1] perf annotate: Don't prepend symfs path to vmlinux path

So, lemme try to provide the precise steps to reproduce this problem:

[root@jouet ~]# perf record -F 10000 sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.017 MB perf.data (11 samples) ]
[root@jouet ~]# perf buildid-list
44d954246227536955cb1ecbe9ef2a05665876b6 /lib/modules/4.16.0-rc4/build/vmlinux
87ae276466bc68e958c9817f11d5e09f14510585 [vdso]
3113881229974f02113945e92c1a4d4f146e061c /usr/lib64/libc-2.26.so
[root@jouet ~]#

then we go on and remove that buildid from the cache:

[root@jouet ~]# perf record -F 10000 sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.017 MB perf.data (10 samples) ]
[root@jouet ~]# perf report --dso \[kernel.vmlinux\] | grep -v ^# | head -5
38.00% sleep [k] filemap_map_pages
19.68% sleep [k] elf_map
2.69% perf [k] perf_iterate_ctx
0.29% perf [k] end_repeat_nmi
0.04% perf [k] native_sched_clock
[root@jouet ~]#
[root@jouet ~]# perf buildid-list
44d954246227536955cb1ecbe9ef2a05665876b6 /lib/modules/4.16.0-rc4/build/vmlinux
87ae276466bc68e958c9817f11d5e09f14510585 [vdso]
3113881229974f02113945e92c1a4d4f146e061c /usr/lib64/libc-2.26.so
[root@jouet ~]# ls -la ~/.debug/.build-id/44/d954246227536955cb1ecbe9ef2a05665876b6
lrwxrwxrwx. 1 root root 77 Mar 9 16:14 /root/.debug/.build-id/44/d954246227536955cb1ecbe9ef2a05665876b6 -> ../../home/build/v4.16.0-rc4/vmlinux/44d954246227536955cb1ecbe9ef2a05665876b6
[root@jouet ~]# ls -la ~/.debug/home/build/v4.16.0-rc4/vmlinux/44d954246227536955cb1ecbe9ef2a05665876b6/
total 510840
drwxr-xr-x. 2 root root 4096 Mar 9 16:14 .
drwxr-xr-x. 3 root root 4096 Mar 6 11:35 ..
-rwxr-xr-x. 1 root root 523085744 Mar 6 11:35 elf
-rw-r--r--. 1 root root 0 Mar 9 16:14 probes
[root@jouet ~]# perf buildid-cache --remove /lib/modules/4.16.0-rc4/build/vmlinux
[root@jouet ~]# ls -la ~/.debug/.build-id/44/d954246227536955cb1ecbe9ef2a05665876b6
ls: cannot access '/root/.debug/.build-id/44/d954246227536955cb1ecbe9ef2a05665876b6': No such file or directory
[root@jouet ~]# ls -la ~/.debug/home/build/v4.16.0-rc4/vmlinux/44d954246227536955cb1ecbe9ef2a05665876b6/
ls: cannot access '/root/.debug/home/build/v4.16.0-rc4/vmlinux/44d954246227536955cb1ecbe9ef2a05665876b6/': No such file or directory
[root@jouet ~]#

Ok, so now I do:

[root@jouet ~]# perf annotate --stdio --vmlinux /lib/modules/4.16.0-rc4/build/vmlinux filemap_map_pages
Failed to open [kernel.kallsyms]_text, continuing without symbols
Error:
The perf.data file has no samples!
[root@jouet ~]#


But I ran out of time today, this one needs a bit more investigation, I
couldn't get to that dso__disassemble_filename() in the above case :-\

> For https://patchwork.kernel.org/patch/10211483/, I'm not sure how to go about doing a reply to all.

So, no need for that, just state here that you provide your Signed-off-by: to
it and I'll add it, which is what I'm doing now since this seems to be your
intent, right?

I'll just add another Link: tag pointing to your reply to -this- message,
if it comes with a S-o-B for https://patchwork.kernel.org/patch/10211483/, ok?

- Arnaldo

> I had some email problems and was cut-off from the list for a while.
>
> MV
>
>
> On 03/09/18 13:24, Arnaldo Carvalho de Melo wrote:
> > Em Fri, Mar 09, 2018 at 12:07:20PM -0600, Kim Phillips escreveu:
> > > On Fri, 9 Mar 2018 12:06:27 -0300
> > > Arnaldo Carvalho de Melo <[email protected]> wrote:
> > >
> > > Hi Arnaldo,
> > >
> > > > Em Thu, Mar 08, 2018 at 09:10:30PM -0600, Kim Phillips escreveu:
> > > > > Based on prior work:
> > > > >
> > > > > https://lkml.org/lkml/2014/5/6/395
> > > > Thanks, looks good, applying.
> > > >
> > > > Jean, is everything ok with you on this?
> > > By now your email to Jean should have bounced with "The email account
> > > that you tried to reach does not exist." Removing Jean from Cc.
> > >
> > > It seems like you're applying patches. There are a couple that have
> > > slipped through the cracks: Can you please take a look at applying them?
> > >
> > > - "perf tools: Fixing uninitialised variable"
> > > https://patchwork.kernel.org/patch/10179381/
> > [acme@jouet perf]$ git tag --contains d2785de15f1bd42d613d56bbac5a007e7293b874
> > perf-core-for-mingo-4.17-20180216
> >
> > commit d2785de15f1bd42d613d56bbac5a007e7293b874
> > Author: Mathieu Poirier <[email protected]>
> > AuthorDate: Mon Feb 12 13:32:37 2018 -0700
> > Commit: Arnaldo Carvalho de Melo <[email protected]>
> > CommitDate: Fri Feb 16 14:55:40 2018 -0300
> >
> > perf auxtrace arm: Fixing uninitialised variable
> > When working natively on arm64 the compiler gets pesky and complains
> > that variable 'i' is uninitialised, something that breaks the
> > compilation. Here no further checks are needed since variable
> > 'found_spe' can only be true if variable 'i' has been initialised as
> > part of the for loop.
> > Signed-off-by: Mathieu Poirier <[email protected]>
> > Cc: Alexander Shishkin <[email protected]>
> > Cc: Jin Yao <[email protected]>
> > Cc: Namhyung Kim <[email protected]>
> > Cc: Peter Zijlstra <[email protected]>
> > Cc: [email protected]
> > Link: http://lkml.kernel.org/r/[email protected]
> > Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
> >
> > diff --git a/tools/perf/arch/arm/util/auxtrace.c b/tools/perf/arch/arm/util/auxtrace.c
> > index 2323581b157d..fa639e3e52ac 100644
> > --- a/tools/perf/arch/arm/util/auxtrace.c
> > +++ b/tools/perf/arch/arm/util/auxtrace.c
> > @@ -68,7 +68,7 @@ struct auxtrace_record
> > bool found_spe = false;
> > static struct perf_pmu **arm_spe_pmus = NULL;
> > static int nr_spes = 0;
> > - int i;
> > + int i = 0;
> > > - "perf unwind: Report error from dwfl_attach_state"
> > > https://patchwork.kernel.org/patch/10211483/
> > > [Martin, I guess it would help if you replied-all that patch and
> > > added your signed-off-by.]
> > Right, the S-o-B is needed
> > > - "perf unwind: Unwind with libdw doesn't take symfs into account"
> > > https://patchwork.kernel.org/patch/10211599/
> > This one has the S-o-B, applying, Jiri, holler if you disagree,
> >
> > - Arnaldo
> > > Thanks,
> > >
> > > Kim
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html

2018-03-09 19:36:27

by Martin Vuille

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Thanks.

I replied to your message with additional information.

I will update the commit message and resubmit the patch.

MV


On 03/09/18 14:29, Arnaldo Carvalho de Melo wrote:
> Em Fri, Mar 09, 2018 at 01:49:50PM -0500, Martin Vuille escreveu:
>> Hi,
>>
>> I made two other submissions that may also have been overlooked:
>>
>> https://patchwork.kernel.org/patch/10211401/ -- This one has the S-o-B
> Ok, replied to that one, I can't see where is it that the symfs is being
> first appended, please clarify that in the patch commit log message.
>


2018-03-13 15:25:23

by Martin Vuille

[permalink] [raw]
Subject: Re: [PATCH] perf tools arm64: Add libdw DWARF post unwind support for ARM64



On 03/09/18 13:24, Arnaldo Carvalho de Melo wrote:
>
>> - "perf unwind: Report error from dwfl_attach_state"
>> https://patchwork.kernel.org/patch/10211483/
>> [Martin, I guess it would help if you replied-all that patch and
>> added your signed-off-by.]
> Right, the S-o-B is needed

S-o-B has been provided by reply to this email. If you prefer, I can
resubmit the patch with the S-o-B included.

>
>> - "perf unwind: Unwind with libdw doesn't take symfs into account"
>> https://patchwork.kernel.org/patch/10211599/
> This one has the S-o-B, applying, Jiri, holler if you disagree,
>
> - Arnaldo
>

Thanks.

Regards,
MV

Subject: [tip:perf/core] perf tools arm64: Add libdw DWARF post unwind support for ARM64

Commit-ID: 744e9a91cf898bf027dbe65cc61a5d7565335cba
Gitweb: https://git.kernel.org/tip/744e9a91cf898bf027dbe65cc61a5d7565335cba
Author: Kim Phillips <[email protected]>
AuthorDate: Thu, 8 Mar 2018 21:10:30 -0600
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Fri, 16 Mar 2018 13:53:46 -0300

perf tools arm64: Add libdw DWARF post unwind support for ARM64

Based on prior work:

https://lkml.org/lkml/2014/5/6/395

and on how other arches add libdw unwind support. Includes support for
running the unwind test, e.g., on a system with only elfutils' libdw
0.170, the test now runs, and successfully:

$ ./perf test unwind
56: Test dwarf unwind : Ok

Originally-by: Jean Pihet <[email protected]>
Reported-by: Christian Hansen <[email protected]>
Signed-off-by: Kim Phillips <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/Makefile.config | 2 +-
tools/perf/arch/arm64/include/arch-tests.h | 12 ++++++
tools/perf/arch/arm64/tests/Build | 2 +
tools/perf/arch/arm64/tests/arch-tests.c | 16 ++++++++
tools/perf/arch/arm64/util/Build | 1 +
tools/perf/arch/arm64/util/unwind-libdw.c | 60 ++++++++++++++++++++++++++++++
6 files changed, 92 insertions(+), 1 deletion(-)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 89cb2a36b8ff..98ff73648b51 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -75,7 +75,7 @@ endif
# Disable it on all other architectures in case libdw unwind
# support is detected in system. Add supported architectures
# to the check.
-ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc s390))
+ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc s390))
NO_LIBDW_DWARF_UNWIND := 1
endif

diff --git a/tools/perf/arch/arm64/include/arch-tests.h b/tools/perf/arch/arm64/include/arch-tests.h
new file mode 100644
index 000000000000..90ec4c8cb880
--- /dev/null
+++ b/tools/perf/arch/arm64/include/arch-tests.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef ARCH_TESTS_H
+#define ARCH_TESTS_H
+
+#ifdef HAVE_DWARF_UNWIND_SUPPORT
+struct thread;
+struct perf_sample;
+#endif
+
+extern struct test arch_tests[];
+
+#endif
diff --git a/tools/perf/arch/arm64/tests/Build b/tools/perf/arch/arm64/tests/Build
index b30eff9bcc83..883c57ff0c08 100644
--- a/tools/perf/arch/arm64/tests/Build
+++ b/tools/perf/arch/arm64/tests/Build
@@ -1,2 +1,4 @@
libperf-y += regs_load.o
libperf-y += dwarf-unwind.o
+
+libperf-y += arch-tests.o
diff --git a/tools/perf/arch/arm64/tests/arch-tests.c b/tools/perf/arch/arm64/tests/arch-tests.c
new file mode 100644
index 000000000000..5b1543c98022
--- /dev/null
+++ b/tools/perf/arch/arm64/tests/arch-tests.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <string.h>
+#include "tests/tests.h"
+#include "arch-tests.h"
+
+struct test arch_tests[] = {
+#ifdef HAVE_DWARF_UNWIND_SUPPORT
+ {
+ .desc = "DWARF unwind",
+ .func = test__dwarf_unwind,
+ },
+#endif
+ {
+ .func = NULL,
+ },
+};
diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index c0b8dfef98ba..68f8a8eb3ad0 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -2,6 +2,7 @@ libperf-y += header.o
libperf-y += sym-handling.o
libperf-$(CONFIG_DWARF) += dwarf-regs.o
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
+libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o

libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
../../arm/util/auxtrace.o \
diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/arch/arm64/util/unwind-libdw.c
new file mode 100644
index 000000000000..7623d85e77f3
--- /dev/null
+++ b/tools/perf/arch/arm64/util/unwind-libdw.c
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <elfutils/libdwfl.h>
+#include "../../util/unwind-libdw.h"
+#include "../../util/perf_regs.h"
+#include "../../util/event.h"
+
+bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
+{
+ struct unwind_info *ui = arg;
+ struct regs_dump *user_regs = &ui->sample->user_regs;
+ Dwarf_Word dwarf_regs[PERF_REG_ARM64_MAX], dwarf_pc;
+
+#define REG(r) ({ \
+ Dwarf_Word val = 0; \
+ perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \
+ val; \
+})
+
+ dwarf_regs[0] = REG(X0);
+ dwarf_regs[1] = REG(X1);
+ dwarf_regs[2] = REG(X2);
+ dwarf_regs[3] = REG(X3);
+ dwarf_regs[4] = REG(X4);
+ dwarf_regs[5] = REG(X5);
+ dwarf_regs[6] = REG(X6);
+ dwarf_regs[7] = REG(X7);
+ dwarf_regs[8] = REG(X8);
+ dwarf_regs[9] = REG(X9);
+ dwarf_regs[10] = REG(X10);
+ dwarf_regs[11] = REG(X11);
+ dwarf_regs[12] = REG(X12);
+ dwarf_regs[13] = REG(X13);
+ dwarf_regs[14] = REG(X14);
+ dwarf_regs[15] = REG(X15);
+ dwarf_regs[16] = REG(X16);
+ dwarf_regs[17] = REG(X17);
+ dwarf_regs[18] = REG(X18);
+ dwarf_regs[19] = REG(X19);
+ dwarf_regs[20] = REG(X20);
+ dwarf_regs[21] = REG(X21);
+ dwarf_regs[22] = REG(X22);
+ dwarf_regs[23] = REG(X23);
+ dwarf_regs[24] = REG(X24);
+ dwarf_regs[25] = REG(X25);
+ dwarf_regs[26] = REG(X26);
+ dwarf_regs[27] = REG(X27);
+ dwarf_regs[28] = REG(X28);
+ dwarf_regs[29] = REG(X29);
+ dwarf_regs[30] = REG(LR);
+ dwarf_regs[31] = REG(SP);
+
+ if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX,
+ dwarf_regs))
+ return false;
+
+ dwarf_pc = REG(PC);
+ dwfl_thread_state_register_pc(thread, dwarf_pc);
+
+ return true;
+}