Skip to contentSkip to conversation

perf unwind: Odd message about x86 unwind

DISCUSSION Arnaldo Carvalho de Melo 2 participants 2 messages Jun 30, 2016 – Jul 1, 2016

lore
Share & tools
lore

Arnaldo Carvalho de Melo

author Acked-by Jiri Olsa
#0 lore raw

Hi He,

While testing a patch by Peter Zijlstra to the --stdio
annotation code I came accross these messages:

[acme@jouet linux]$ perf annotate __vdso_gettimeofday 2>&1 | head -20
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
Percent | Source code & Disassembly of perf-vdso.so-E5tFUx for cycles:u
-----------------------------------------------------------------------------

         :
         :
         :
         :	Disassembly of section .text:
         :
         :	0000000000000cd0 <__vdso_gettimeofday@@LINUX_2.6>:
    0.00 :	  cd0:   push   %rbp
    0.00 :	  cd1:   mov    %rsp,%rbp
    0.00 :	  cd4:   push   %r15
    0.00 :	  cd6:   push   %r14
    0.00 :	  cd8:   push   %r13
    0.00 :	  cda:   push   %r12
    0.00 :	  cdc:   push   %rbx
    0.00 :	  cdd:   sub    $0x10,%rsp

[acme@jouet linux]$

And bisected it down to:

commit 52ffe0ff02fc053a025c381d5808e9ecd3206dfe

Author: He Kuang <[email protected]>
Date:   Fri Jun 3 03:33:22 2016 +0000

perf callchain: Support x86 target platform

Support x86(32-bit) cross platform callchain unwind.

--------------------------------------------------

The source code where this message is emitted is:

struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops; <SNIP>
unwind__prepare_access()

{
	struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops;
<SNIP>
	if (!strcmp(arch, "x86")) {
                if (dso_type != DSO__TYPE_64BIT)
                        ops = x86_32_unwind_libunwind_ops;
        }
<SNIP>
        if (!ops) {
                pr_err("unwind: target platform=%s is not supported\n", arch);
                return -1;
        }

So, this should fallback to local_unwind_libunwind_ops, why is this not being set properly?

Feature detection says:

... libunwind: [ on ]
... libdw-dwarf-unwind: [ on ]

This is:

[acme@jouet linux]$ uname -a
Linux jouet 4.5.7-300.fc24.x86_64 #1 SMP Wed Jun 8 18:12:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linuxo

Can you please check this?

- Arnaldo

#1 lore raw

hi

Quoted 69 lines · Arnaldo Carvalho de Melo

Hi He,

While testing a patch by Peter Zijlstra to the --stdio
annotation code I came accross these messages:

[acme@jouet linux]$ perf annotate __vdso_gettimeofday 2>&1 | head -20
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
Percent | Source code & Disassembly of perf-vdso.so-E5tFUx for cycles:u
-----------------------------------------------------------------------------

          :
          :
          :
          :	Disassembly of section .text:
          :
          :	0000000000000cd0 <__vdso_gettimeofday@@LINUX_2.6>:
     0.00 :	  cd0:   push   %rbp
     0.00 :	  cd1:   mov    %rsp,%rbp
     0.00 :	  cd4:   push   %r15
     0.00 :	  cd6:   push   %r14
     0.00 :	  cd8:   push   %r13
     0.00 :	  cda:   push   %r12
     0.00 :	  cdc:   push   %rbx
     0.00 :	  cdd:   sub    $0x10,%rsp

[acme@jouet linux]$

And bisected it down to:

commit 52ffe0ff02fc053a025c381d5808e9ecd3206dfe

Author: He Kuang <[email protected]>
Date:   Fri Jun 3 03:33:22 2016 +0000

perf callchain: Support x86 target platform

Support x86(32-bit) cross platform callchain unwind.

--------------------------------------------------

The source code where this message is emitted is:

struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops; <SNIP>
unwind__prepare_access()

{
	struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops;
<SNIP>
	if (!strcmp(arch, "x86")) {
                 if (dso_type != DSO__TYPE_64BIT)
                         ops = x86_32_unwind_libunwind_ops;
         }
<SNIP>
         if (!ops) {
                 pr_err("unwind: target platform=%s is not supported\n", arch);
                 return -1;
         }

So, this should fallback to local_unwind_libunwind_ops, why is this not being set properly?

Feature detection says:

... libunwind: [ on ]
... libdw-dwarf-unwind: [ on ]

Quoted 6 lines

This is:

[acme@jouet linux]$ uname -a
Linux jouet 4.5.7-300.fc24.x86_64 #1 SMP Wed Jun 8 18:12:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linuxo

Can you please check this?

I think it's because of the perf.data contains both 32bit/64bit threads while perf is only build with local unwind(unwind for x86_64).

Then I have a simple test for this:

  $ file hello_x86_64
  hello_x86_64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=adc94932cbcb2be80f3b62df530b8c109f40478a, not strippe
  $ file hello_i686
  hello_i686: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 4.5.0, not stripped
  $ perf record -o perf.data.x86_64_singlethread    hello_x86_64
  $ perf record -o perf.data.x86_64_allcpu       -a hello_x86_64
  $ perf record -o perf.data.i686_singlethread      hello_i686
  $ perf record -o perf.data.i686_allcpu         -a hello_i686

Now I get 4 perf.data files:

ID name 32bit 64bit

  1    perf.data.x86_64_singlethread    N        Y
  2    perf.data.x86_64_allcpu        N        Y
  3    perf.data.i686_singlethread    Y        N
  4    perf.data.i686_allcpu        Y        Y

Because perf only supports local unwind(for x86_64), cases contain 32bit thread should show the warnings, i.e. case3 and case4. And perf.data contains only 32bit threads will show nothing except the warnings while the one contains both 32bit/64bit will show warnings for 32bit thread and annoate the 64bit thread.

Then check:

  $ perf annotate -i perf.data.x86_64_singlethread

Percent | Source code & Disassembly of hello for cycles:pp
----------------------------------------------------------------

           :
           :
           :
           :      Disassembly of section .text:
           :
           :      00000000004005c0 <fib>:
           :      fib():
           :      #endif
  $ perf annotate -i perf.data.x86_64_allcpu

Percent | Source code & Disassembly of hello for cycles:pp
----------------------------------------------------------------

           :
           :
           :
           :      Disassembly of section .text:
           :
           :      00000000004005c0 <fib>:
           :      fib():
           :      #endif
           :
           :      volatile int z = 0;
           :
           :      int fib(int x)
  $ perf annotate -i perf.data.i686_singlethread

unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported

  $ perf annotate -i perf.data.i686_allcpu

unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported

Percent | Source code & Disassembly of perf for cycles:pp
---------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 0000000000442a8f <record__mmap_read>:
: record__mmap_read():
:
: return backward_rb_find_range(data, mask, head, start,
end);
: }

The result is the same as we expected, so if your case matches the case4, the result is right. But I think we can improve the warning message for not confusing the users.

Thank you.

Quoted 2 lines

- Arnaldo