• Namhyung Kim's avatar
    perf annotate-data: Update stack slot for the store · 895891da
    Namhyung Kim authored
    When checking the match variable at the target instruction, it might not
    have any information if it's a first write to a stack slot.  In this
    case it could spill a register value into the stack so the type info is
    in the source operand.
    
    But currently it's hard to get the operand from the checking function.
    Let's process the instruction and retry to get the type info from the
    stack if there's no information already.
    
    This is an example of __tcp_transmit_skb().  The instructions are
    
      <__tcp_transmit_skb>:
       0: nopl   0x0(%rax, %rax, 1)
       5: push   %rbp
       6: mov    %rsp, %rbp
       9: push   %r15
       b: push   %r14
       d: push   %r13
       f: push   %r12
      11: push   %rbx
      12: sub    $0x98, %rsp
      19: mov    %r8d, -0xa8(%rbp)
      ...
    
    It cannot find any variable at -0xa8(%rbp) at this point.
      -----------------------------------------------------------
      find data type for -0xa8(reg6) at __tcp_transmit_skb+0x19
      CU for net/ipv4/tcp_output.c (die:0x817f543)
      frame base: cfa=0 fbreg=6
      scope: [1/1] (die:81aac3e)
      bb: [0 - 19]
      var [0] -0x98(stack) type='struct tcp_out_options' size=0x28 (die:0x81af3df)
      var [5] reg8 type='unsigned int' size=0x4 (die:0x8180ed6)
      var [5] reg2 type='unsigned int' size=0x4 (die:0x8180ed6)
      var [5] reg1 type='int' size=0x4 (die:0x818059e)
      var [5] reg4 type='struct sk_buff*' size=0x8 (die:0x8181360)
      var [5] reg5 type='struct sock*' size=0x8 (die:0x8181a0c)
      chk [19] reg6 offset=-0xa8 ok=0 kind=0 fbreg : no type information
      no type information
    
    And it was able to find the type after processing the 'mov' instruction.
      -----------------------------------------------------------
      find data type for -0xa8(reg6) at __tcp_transmit_skb+0x19
      CU for net/ipv4/tcp_output.c (die:0x817f543)
      frame base: cfa=0 fbreg=6
      scope: [1/1] (die:81aac3e)
      bb: [0 - 19]
      var [0] -0x98(stack) type='struct tcp_out_options' size=0x28 (die:0x81af3df)
      var [5] reg8 type='unsigned int' size=0x4 (die:0x8180ed6)
      var [5] reg2 type='unsigned int' size=0x4 (die:0x8180ed6)
      var [5] reg1 type='int' size=0x4 (die:0x818059e)
      var [5] reg4 type='struct sk_buff*' size=0x8 (die:0x8181360)
      var [5] reg5 type='struct sock*' size=0x8 (die:0x8181a0c)
      chk [19] reg6 offset=-0xa8 ok=0 kind=0 fbreg : retry                    <<<--- here
      mov [19] reg8 -> -0xa8(stack) type='unsigned int' size=0x4 (die:0x8180ed6)
      chk [19] reg6 offset=-0xa8 ok=0 kind=0 fbreg : Good!
      found by insn track: -0xa8(reg6) type-offset=0
      final result:  type='unsigned int' size=0x4 (die:0x8180ed6)
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20240821232628.353177-4-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    895891da
annotate-data.c 44.5 KB