• Alexey Budankov's avatar
    perf record: Allow mixing --user-regs with --call-graph=dwarf · d194d8fc
    Alexey Budankov authored
    When DWARF stacks were requested and at the same time that the user
    specifies a register set using the --user-regs option the full register
    context was being captured on samples:
    
      $ perf record -g --call-graph dwarf,1024 --user-regs=IP,SP,BP -- stack_test2.g.O3
    
      188143843893585 0x6b48 [0x4f8]: PERF_RECORD_SAMPLE(IP, 0x4002): 23828/23828: 0x401236 period: 1363819 addr: 0x7ffedbdd51ac
      ... FP chain: nr:0
      ... user regs: mask 0xff0fff ABI 64-bit
      .... AX    0x53b
      .... BX    0x7ffedbdd3cc0
      .... CX    0xffffffff
      .... DX    0x33d3a
      .... SI    0x7f09b74c38d0
      .... DI    0x0
      .... BP    0x401260
      .... SP    0x7ffedbdd3cc0
      .... IP    0x401236
      .... FLAGS 0x20a
      .... CS    0x33
      .... SS    0x2b
      .... R8    0x7f09b74c3800
      .... R9    0x7f09b74c2da0
      .... R10   0xfffffffffffff3ce
      .... R11   0x246
      .... R12   0x401070
      .... R13   0x7ffedbdd5db0
      .... R14   0x0
      .... R15   0x0
      ... ustack: size 1024, offset 0xe0
       . data_src: 0x5080021
       ... thread: stack_test2.g.O:23828
       ...... dso: /root/abudanko/stacks/stack_test2.g.O3
    
    I.e. the --user-regs=IP,SP,BP was being ignored, being overridden by the
    needs of --call-graph=dwarf.
    
    After applying the change in this patch the sample data contains the
    user specified register, but making sure that at least the minimal set
    of register needed for DWARF unwinding (DWARF_MINIMAL_REGS) is
    requested.
    
    The user is warned that DWARF unwinding may not work if extra registers
    end up being needed.
    
      -g call-graph dwarf,K                         full_regs
      --user-regs=user_regs                         user_regs
      -g call-graph dwarf,K --user-regs=user_regs	user_regs + DWARF_MINIMAL_REGS
    
      $ perf record -g --call-graph dwarf,1024 --user-regs=BP -- ls
      WARNING: The use of --call-graph=dwarf may require all the user registers, specifying a subset with --user-regs may render DWARF unwinding unreliable, so the minimal registers set (IP, SP) is explicitly forced.
      arch   COPYING	Documentation  include	Kbuild	 lbuild    MAINTAINERS	modules.builtin		 Module.symvers  perf.data.old	scripts   System.map  virt
      block  CREDITS	drivers        init	Kconfig  lib	   Makefile	modules.builtin.modinfo  net		 README		security  tools       vmlinux
      certs  crypto	fs	       ipc	kernel	 LICENSES  mm		modules.order		 perf.data	 samples	sound	  usr	      vmlinux.o
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.030 MB perf.data (10 samples) ]
    
      188368474305373 0x5e40 [0x470]: PERF_RECORD_SAMPLE(IP, 0x4002): 23839/23839: 0x401236 period: 1260507 addr: 0x7ffd3d85e96c
      ... FP chain: nr:0
      ... user regs: mask 0x1c0 ABI 64-bit
      .... BP    0x401260
      .... SP    0x7ffd3d85cc20
      .... IP    0x401236
      ... ustack: size 1024, offset 0x58
       . data_src: 0x5080021
    
    Committer notes:
    
    Detected build failures on arches where PERF_REGS_ is not available,
    such as debian:experimental-x-{mips,mips64,mipsel}, fedora 24 and 30 for
    ARC uClibc and glibc, reported to Alexey that provided a patch moving
    the DWARF_MINIMAL_REGS from evsel.c to util/perf_regs.h, where it is
    guarded by an HAVE_PERF_REGS_SUPPORT ifdef.
    
    Committer testing:
    
      # perf record --user-regs=bp,ax -a sleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 1.955 MB perf.data (1773 samples) ]
      # perf script -F+uregs | grep AX: | head -5
         perf 1719 [000] 181.272398:    1 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffef828fb00
         perf 1719 [000] 181.272402:    1 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffef828fb00
         perf 1719 [000] 181.272403:    8 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffef828fb00
         perf 1719 [000] 181.272405:  181 cycles: ffffffffba06a7c6 native_write_msr+0x6 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffef828fb00
         perf 1719 [000] 181.272406: 4405 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffef828fb00
      # perf record --call-graph=dwarf --user-regs=bp,ax -a sleep 1
      WARNING: The use of --call-graph=dwarf may require all the user registers, specifying a subset with --user-regs may render DWARF unwinding unreliable, so the minimal registers set (IP, SP) is explicitly forced.
      [ perf record: Woken up 55 times to write data ]
      [ perf record: Captured and wrote 24.184 MB perf.data (2841 samples) ]
      [root@quaco ~]# perf script --hide-call-graph -F+uregs | grep AX: | head -5
         perf 1729 [000] 211.268006:    1 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffc8679abb0 SP:0x7ffc8679ab78 IP:0x7fa75223a0db
         perf 1729 [000] 211.268014:    1 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffc8679abb0 SP:0x7ffc8679ab78 IP:0x7fa75223a0db
         perf 1729 [000] 211.268017:    5 cycles: ffffffffba06a7c4 native_write_msr+0x4 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffc8679abb0 SP:0x7ffc8679ab78 IP:0x7fa75223a0db
         perf 1729 [000] 211.268020:   48 cycles: ffffffffba06a7c6 native_write_msr+0x6 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffc8679abb0 SP:0x7ffc8679ab78 IP:0x7fa75223a0db
         perf 1729 [000] 211.268024:  490 cycles: ffffffffba00e471 intel_bts_enable_local+0x21 (/lib/modules/5.2.0-rc1+/build/vmlinux) ABI:2 AX:0xffffffffffffffda BP:0x7ffc8679abb0 SP:0x7ffc8679ab78 IP:0x7fa75223a0db
      #
    Signed-off-by: default avatarAlexey Budankov <alexey.budankov@linux.intel.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/e7fd37b1-af22-0d94-a0dc-5895e803bbfe@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    d194d8fc
perf_regs.h 1.16 KB