• Arnaldo Carvalho de Melo's avatar
    perf annotate: Introduce --ignore-vmlinux command line option · be316409
    Arnaldo Carvalho de Melo authored
    This is already present in 'perf top', albeit undocumented (will fix),
    and is useful to use /proc/kcore instead of vmlinux and then get what is
    really in place, not what the kernel starts with, before alternatives,
    ftrace .text patching, etc, see the differences:
    
      # perf annotate --stdio2 _raw_spin_lock_irqsave
      _raw_spin_lock_irqsave() /lib/modules/4.16.0-rc4/build/vmlinux
      Event: anon group { cycles, instructions }
    
        0.00   3.17      → callq  __fentry__
        0.00   7.94        push   %rbx
        7.69  36.51      → callq  __page_file_index
                           mov    %rax,%rbx
        7.69   3.17      → callq  *ffffffff82225cd0
                           xor    %eax,%eax
                           mov    $0x1,%edx
       80.77  49.21        lock   cmpxchg %edx,(%rdi)
                           test   %eax,%eax
                         ↓ jne    2b
        3.85   0.00        mov    %rbx,%rax
                           pop    %rbx
                         ← retq
                     2b:   mov    %eax,%esi
                         → callq  queued_spin_lock_slowpath
                           mov    %rbx,%rax
                           pop    %rbx
                         ← retq
      [root@jouet ~]# perf annotate --ignore-vmlinux --stdio2 _raw_spin_lock_irqsave
      _raw_spin_lock_irqsave() /proc/kcore
      Event: anon group { cycles, instructions }
    
        0.00   3.17        nop
        0.00   7.94        push   %rbx
        0.00  23.81        pushfq
        7.69  12.70        pop    %rax
                           nop
                           mov    %rax,%rbx
        7.69   3.17        cli
                           nop
                           xor    %eax,%eax
                           mov    $0x1,%edx
       80.77  49.21        lock   cmpxchg %edx,(%rdi)
                           test   %eax,%eax
                         ↓ jne    2b
        3.85   0.00        mov    %rbx,%rax
                           pop    %rbx
                         ← retq
                     2b:   mov    %eax,%esi
                         → callq  *ffffffff820e96b0
                           mov    %rbx,%rax
                           pop    %rbx
                         ← retq
      #
    
    Diff of the output of those commands:
    
      # perf annotate --stdio2 _raw_spin_lock_irqsave > /tmp/vmlinux
      # perf annotate --ignore-vmlinux --stdio2 _raw_spin_lock_irqsave > /tmp/kcore
      # diff -y /tmp/vmlinux /tmp/kcore
      _raw_spin_lock_irqsave() vmlinux             | _raw_spin_lock_irqsave() /proc/kcore
      Event: anon group { cycles, instructions }     Event: anon group { cycles, instructions }
    
       0.00  3.17  → callq __fentry__              |  0.00  3.17     nop
       0.00  7.94    push  %rbx                       0.00  7.94     push  %rbx
       7.69 36.51  → callq __page_file_index       |  0.00 23.81     pushfq
                                                   >  7.69 12.70     pop   %rax
                                                   >                 nop
                     mov   %rax,%rbx                                 mov   %rax,%rbx
       7.69  3.17  → callq *ffffffff82225cd0       |  7.69  3.17     cli
                                                   >                 nop
                     xor   %eax,%eax                                 xor   %eax,%eax
                     mov   $0x1,%edx                                 mov   $0x1,%edx
      80.77 49.21    lock  cmpxchg %edx,(%rdi)       80.77 49.21     lock  cmpxchg %edx,(%rdi)
                     test  %eax,%eax                                 test  %eax,%eax
                   ↓ jne   2b                                      ↓ jne   2b
       3.85  0.00    mov   %rbx,%rax                  3.85  0.00     mov   %rbx,%rax
                     pop   %rbx                                      pop   %rbx
                   ← retq                                          ← retq
                2b:  mov   %eax,%esi                            2b:  mov   %eax,%esi
                   → callq queued_spin_lock_slowpath|              → callq *ffffffff820e96b0
                     mov   %rbx,%rax                                 mov   %rbx,%rax
                     pop   %rbx                                      pop   %rbx
                   ← retq                                          ← retq
      #
    
    This should be further streamlined by doing both annotations and
    allowing the TUI to toggle initial/current, and show the patched
    instructions in a slightly different color.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jin Yao <yao.jin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: https://lkml.kernel.org/n/tip-wz8d269hxkcwaczr0r4rhyjg@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    be316409
builtin-annotate.c 15.9 KB