Skip to content
  • Naohiro Aota's avatar
    perf probe: Support signedness casting · 19f00b01
    Naohiro Aota authored
    
    
    The 'perf probe' tool detects a variable's type and use the detected
    type to add a new probe. Then, kprobes prints its variable in
    hexadecimal format if the variable is unsigned and prints in decimal if
    it is signed.
    
    We sometimes want to see unsigned variable in decimal format (i.e.
    sector_t or size_t). In that case, we need to investigate the variable's
    size manually to specify just signedness.
    
    This patch add signedness casting support. By specifying "s" or "u" as a
    type, perf-probe will investigate variable size as usual and use the
    specified signedness.
    
    E.g. without this:
    
      $ perf probe -a 'submit_bio bio->bi_iter.bi_sector'
      Added new event:
        probe:submit_bio     (on submit_bio with bi_sector=bio->bi_iter.bi_sector)
      You can now use it in all perf tools, such as:
              perf record -e probe:submit_bio -aR sleep 1
      $ cat trace_pipe|head
              dbench-9692  [003] d..1   971.096633: submit_bio: (submit_bio+0x0/0x140) bi_sector=0x3a3d00
              dbench-9692  [003] d..1   971.096685: submit_bio: (submit_bio+0x0/0x140) bi_sector=0x1a3d80
              dbench-9692  [003] d..1   971.096687: submit_bio: (submit_bio+0x0/0x140) bi_sector=0x3a3d80
    ...
      // need to investigate the variable size
      $ perf probe -a 'submit_bio bio->bi_iter.bi_sector:s64'
      Added new event:
        probe:submit_bio     (on submit_bio with bi_sector=bio->bi_iter.bi_sector:s64)
      You can now use it in all perf tools, such as:
            perf record -e probe:submit_bio -aR sleep 1
    
      With this:
    
      // just use "s" to cast its signedness
      $ perf probe -v -a 'submit_bio bio->bi_iter.bi_sector:s'
      Added new event:
        probe:submit_bio     (on submit_bio with bi_sector=bio->bi_iter.bi_sector:s)
      You can now use it in all perf tools, such as:
              perf record -e probe:submit_bio -aR sleep 1
      $ cat trace_pipe|head
              dbench-9689  [001] d..1  1212.391237: submit_bio: (submit_bio+0x0/0x140) bi_sector=128
              dbench-9689  [001] d..1  1212.391252: submit_bio: (submit_bio+0x0/0x140) bi_sector=131072
              dbench-9697  [006] d..1  1212.398611: submit_bio: (submit_bio+0x0/0x140) bi_sector=30208
    
      This commit also update perf-probe.txt to describe "types". Most parts
      are based on existing documentation: Documentation/trace/kprobetrace.txt
    
    Committer note:
    
    Testing using 'perf trace':
    
      # perf probe -a 'submit_bio bio->bi_iter.bi_sector'
      Added new event:
        probe:submit_bio     (on submit_bio with bi_sector=bio->bi_iter.bi_sector)
    
      You can now use it in all perf tools, such as:
    
    	perf record -e probe:submit_bio -aR sleep 1
    
      # trace --no-syscalls --ev probe:submit_bio
          0.000 probe:submit_bio:(ffffffffac3aee00) bi_sector=0xc133c0)
       3181.861 probe:submit_bio:(ffffffffac3aee00) bi_sector=0x6cffb8)
       3181.881 probe:submit_bio:(ffffffffac3aee00) bi_sector=0x6cffc0)
       3184.488 probe:submit_bio:(ffffffffac3aee00) bi_sector=0x6cffc8)
    <SNIP>
       4717.927 probe:submit_bio:(ffffffffac3aee00) bi_sector=0x4dc7a88)
       4717.970 probe:submit_bio:(ffffffffac3aee00) bi_sector=0x4dc7880)
      ^C[root@jouet ~]#
    
    Now, using this new feature:
    
    [root@jouet ~]# perf probe -a 'submit_bio bio->bi_iter.bi_sector:s'
    Added new event:
      probe:submit_bio     (on submit_bio with bi_sector=bio->bi_iter.bi_sector:s)
    
    You can now use it in all perf tools, such as:
    
    	perf record -e probe:submit_bio -aR sleep 1
    
      [root@jouet ~]# trace --no-syscalls --ev probe:submit_bio
         0.000 probe:submit_bio:(ffffffffac3aee00) bi_sector=7145704)
         0.017 probe:submit_bio:(ffffffffac3aee00) bi_sector=7145712)
         0.019 probe:submit_bio:(ffffffffac3aee00) bi_sector=7145720)
         2.567 probe:submit_bio:(ffffffffac3aee00) bi_sector=7145728)
      5631.919 probe:submit_bio:(ffffffffac3aee00) bi_sector=0)
      5631.941 probe:submit_bio:(ffffffffac3aee00) bi_sector=8)
      5631.945 probe:submit_bio:(ffffffffac3aee00) bi_sector=16)
      5631.948 probe:submit_bio:(ffffffffac3aee00) bi_sector=24)
      ^C#
    
    With callchains:
    
      # trace --no-syscalls --ev probe:submit_bio/max-stack=10/
         0.000 probe:submit_bio:(ffffffffac3aee00) bi_sector=50662544)
                                           submit_bio+0xa8200001 ([kernel.kallsyms])
                                           submit_bh+0xa8200013 ([kernel.kallsyms])
                                           jbd2_journal_commit_transaction+0xa8200691 ([kernel.kallsyms])
                                           kjournald2+0xa82000ca ([kernel.kallsyms])
                                           kthread+0xa82000d8 ([kernel.kallsyms])
                                           ret_from_fork+0xa820001f ([kernel.kallsyms])
         0.023 probe:submit_bio:(ffffffffac3aee00) bi_sector=50662552)
                                           submit_bio+0xa8200001 ([kernel.kallsyms])
                                           submit_bh+0xa8200013 ([kernel.kallsyms])
                                           jbd2_journal_commit_transaction+0xa8200691 ([kernel.kallsyms])
                                           kjournald2+0xa82000ca ([kernel.kallsyms])
                                           kthread+0xa82000d8 ([kernel.kallsyms])
                                           ret_from_fork+0xa820001f ([kernel.kallsyms])
         0.027 probe:submit_bio:(ffffffffac3aee00) bi_sector=50662560)
                                           submit_bio+0xa8200001 ([kernel.kallsyms])
                                           submit_bh+0xa8200013 ([kernel.kallsyms])
                                           jbd2_journal_commit_transaction+0xa8200691 ([kernel.kallsyms])
                                           kjournald2+0xa82000ca ([kernel.kallsyms])
                                           kthread+0xa82000d8 ([kernel.kallsyms])
                                           ret_from_fork+0xa820001f ([kernel.kallsyms])
         2.593 probe:submit_bio:(ffffffffac3aee00) bi_sector=50662568)
                                           submit_bio+0xa8200001 ([kernel.kallsyms])
                                           submit_bh+0xa8200013 ([kernel.kallsyms])
                                           journal_submit_commit_record+0xa82001ac ([kernel.kallsyms])
                                           jbd2_journal_commit_transaction+0xa82012e8 ([kernel.kallsyms])
                                           kjournald2+0xa82000ca ([kernel.kallsyms])
                                           kthread+0xa82000d8 ([kernel.kallsyms])
                                           ret_from_fork+0xa820001f ([kernel.kallsyms])
      ^C#
    
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@hgst.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/r/1470710408-23515-1-git-send-email-naohiro.aota@hgst.com
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    19f00b01