1. 22 Nov, 2019 15 commits
  2. 21 Nov, 2019 1 commit
  3. 19 Nov, 2019 9 commits
    • Jin Yao's avatar
      perf report: Jump to symbol source view from total cycles view · 848a5e50
      Jin Yao authored
      This patch supports jumping from tui total cycles view to symbol source
      view.
      
      For example,
      
        perf record -b ./div
        perf report --total-cycles
      
      In total cycles view, we can select one entry and press 'a' or press
      ENTER key to jump to symbol source view.
      
      This patch also sets sort_order to NULL in cmd_report() which will use
      the default branch sort order. The percent value in new annotate view
      will be consistent with the percent in annotate view switched from perf
      report (we observed the original percent gap with previous patches).
      
       v2:
       ---
       Fix the 'make NO_SLANG=1' error. (set __maybe_unused to
       annotation_opts in block_hists_tui_browse()).
      Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      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: Jin Yao <yao.jin@intel.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191118140849.20714-2-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      848a5e50
    • Jin Yao's avatar
      perf util: Move block TUI function to ui browsers · 5cb456af
      Jin Yao authored
      It would be nice if we could jump to the assembler/source view (like the
      normal perf report) from total cycles view.
      
      This patch moves the block_hists_tui_browse from block-info.c to
      ui/browsers/hists.c in order to reuse some browser codes (i.e
      do_annotate) for implementing new annotation view.
      
       v2:
       ---
       Fix the 'make NO_SLANG=1' error. (Change 'int block_hists_tui_browse()'
       to 'static inline int block_hists_tui_browse()')
      Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jin Yao <yao.jin@intel.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191118140849.20714-1-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5cb456af
    • Alexey Budankov's avatar
      perf session: Fix decompression of PERF_RECORD_COMPRESSED records · bb1835a3
      Alexey Budankov authored
      Avoid termination of trace loading in case the last record in the
      decompressed buffer partly resides in the following mmaped
      PERF_RECORD_COMPRESSED record.
      
      In this case NULL value returned by fetch_mmaped_event() means to
      proceed to the next mmaped record then decompress it and load compressed
      events.
      
      The issue can be reproduced like this:
      
        $ perf record -z -- some_long_running_workload
        $ perf report --stdio -vv
        decomp (B): 44519 to 163000
        decomp (B): 48119 to 174800
        decomp (B): 65527 to 131072
        fetch_mmaped_event: head=0x1ffe0 event->header_size=0x28, mmap_size=0x20000: fuzzed perf.data?
        Error:
        failed to process sample
        ...
      
      Testing:
      
        71: Zstd perf.data compression/decompression              : Ok
      
        $ tools/perf/perf report -vv --stdio
        decomp (B): 59593 to 262160
        decomp (B): 4438 to 16512
        decomp (B): 285 to 880
        Looking at the vmlinux_path (8 entries long)
        Using vmlinux for symbols
        decomp (B): 57474 to 261248
        prefetch_event: head=0x3fc78 event->header_size=0x28, mmap_size=0x3fc80: fuzzed or compressed perf.data?
        decomp (B): 25 to 32
        decomp (B): 52 to 120
        ...
      
      Fixes: 57fc032a ("perf session: Avoid infinite loop when seeing invalid header.size")
      Link: https://marc.info/?l=linux-kernel&m=156580812427554&w=2Co-developed-by: default avatarJiri Olsa <jolsa@kernel.org>
      Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
      Signed-off-by: default avatarAlexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/cf782c34-f3f8-2f9f-d6ab-145cee0d5322@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bb1835a3
    • Arnaldo Carvalho de Melo's avatar
      perf dso: Move dso_id from 'struct map' to 'struct dso' · 0e3149f8
      Arnaldo Carvalho de Melo authored
      And take it into account when looking up DSOs when we have the dso_id
      fields obtained from somewhere, like from PERF_RECORD_MMAP2 records.
      
      Instances of struct map pointing to the same DSO pathname but with
      anything in dso_id different are in fact different DSOs, so better have
      different 'struct dso' instances to reflect that. At some point we may
      want to get copies of the contents of the different objects if we want
      to do correct annotation or other analysis.
      
      With this we get 'struct map' 24 bytes leaner:
      
        $ pahole -C map ~/bin/perf
        struct map {
        	union {
        		struct rb_node     rb_node __attribute__((__aligned__(8))); /*     0    24 */
        		struct list_head   node;                 /*     0    16 */
        	} __attribute__((__aligned__(8)));               /*     0    24 */
        	u64                        start;                /*    24     8 */
        	u64                        end;                  /*    32     8 */
        	_Bool                      erange_warned:1;      /*    40: 0  1 */
        	_Bool                      priv:1;               /*    40: 1  1 */
      
        	/* XXX 6 bits hole, try to pack */
        	/* XXX 3 bytes hole, try to pack */
      
        	u32                        prot;                 /*    44     4 */
        	u64                        pgoff;                /*    48     8 */
        	u64                        reloc;                /*    56     8 */
        	/* --- cacheline 1 boundary (64 bytes) --- */
        	u64                        (*map_ip)(struct map *, u64); /*    64     8 */
        	u64                        (*unmap_ip)(struct map *, u64); /*    72     8 */
        	struct dso *               dso;                  /*    80     8 */
        	refcount_t                 refcnt;               /*    88     4 */
        	u32                        flags;                /*    92     4 */
      
        	/* size: 96, cachelines: 2, members: 13 */
        	/* sum members: 92, holes: 1, sum holes: 3 */
        	/* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
        	/* forced alignments: 1 */
        	/* last cacheline: 32 bytes */
        } __attribute__((__aligned__(8)));
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-g4hxxmraplo7wfjmk384mfsb@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0e3149f8
    • Arnaldo Carvalho de Melo's avatar
      perf dsos: Remove unused dsos__find() method · 1f74b100
      Arnaldo Carvalho de Melo authored
      Not used anywhere, nuke it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-teqz0eqcw43mnt7i3me44esw@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1f74b100
    • Arnaldo Carvalho de Melo's avatar
      perf map: Move comparision of map's dso_id to a separate function · 7b59a824
      Arnaldo Carvalho de Melo authored
      We'll use it when doing DSO lookups using dso_ids.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-u2nr1oq03o0i29w2ay9jx03s@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7b59a824
    • Arnaldo Carvalho de Melo's avatar
      perf map: Pass a dso_id to map__new() · 4a7380a5
      Arnaldo Carvalho de Melo authored
      Instead of the 4 fields, a step in the direction of moving this to
      struct dso.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-gp5s1xgxacurmih5d1l94ymy@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4a7380a5
    • Arnaldo Carvalho de Melo's avatar
      perf map: Move maj/min/ino/ino_generation to separate struct · 99459a84
      Arnaldo Carvalho de Melo authored
      And this patch highlights where these fields are being used: in the sort
      order where it uses it to compare maps and classify samples taking into
      account not just the DSO, but those DSO id fields.
      
      I think these should be used to differentiate DSOs with the same name
      but different 'struct dso_id' fields, i.e. these fields should move to
      'struct dso' and then be used as part of the key when doing lookups for
      DSOs, in addition to the DSO name.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-8v5isitqy0dup47nnwkpc80f@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      99459a84
    • Ingo Molnar's avatar
      Merge tag 'perf-core-for-mingo-5.5-20191119' of... · 8f6ee51d
      Ingo Molnar authored
      Merge tag 'perf-core-for-mingo-5.5-20191119' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
      
      Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
      
      x86/insn:
      
        Adrian Hunter:
      
        - Add some more Intel instructions to the opcode map:
      
              cldemote, encls, enclu, enclv, enqcmd, enqcmds, movdir64b,
              movdiri, pconfig, tpause, umonitor, umwait, wbnoinvd.
      
        - The instruction decoding can be tested using the perf tools'
          "x86 instruction decoder - new instructions" test as folllows:
      
          $ perf test -v "new " 2>&1 | grep -i cldemote
          Decoded ok: 0f 1c 00                    cldemote (%eax)
          Decoded ok: 0f 1c 05 78 56 34 12        cldemote 0x12345678
          Decoded ok: 0f 1c 84 c8 78 56 34 12     cldemote 0x12345678(%eax,%ecx,8)
          Decoded ok: 0f 1c 00                    cldemote (%rax)
          Decoded ok: 41 0f 1c 00                 cldemote (%r8)
          Decoded ok: 0f 1c 04 25 78 56 34 12     cldemote 0x12345678
          Decoded ok: 0f 1c 84 c8 78 56 34 12     cldemote 0x12345678(%rax,%rcx,8)
          Decoded ok: 41 0f 1c 84 c8 78 56 34 12  cldemote 0x12345678(%r8,%rcx,8)
          $ perf test -v "new " 2>&1 | grep -i tpause
          Decoded ok: 66 0f ae f3                 tpause %ebx
          Decoded ok: 66 0f ae f3                 tpause %ebx
          Decoded ok: 66 41 0f ae f0              tpause %r8d
      
      callchains:
      
        Adrian Hunter:
      
        - Fix segfault in thread__resolve_callchain_sample().
      
      perf probe:
      
        - Line fixes to show only lines where probes can be used with 'perf probe -L',
          and when reporting them via 'perf probe -l'.
      
        - Support multiprobe events.
      
      perf scripts python:
      
        Adrian Hunter:
      
        - Fix use of TRUE with SQLite < 3.23 in exported-sql-viewer.py.
      
      perf maps:
      
        - Trim 'struct map' by removing the rb_node member for sorting
          by map name, as that is only needed for processing kernel maps,
          and only when classifying symbols by section at load time.
          Sort them by name using qsort() and do lookups using bsearch()
          when map_groups__find_by_name() is used.
      
      perf parse:
      
        Ian Rogers:
      
        - Report initial event parsing error, providing a less cryptic message
          to state that a PMU wasn't found in the system.
      
      perf vendor events:
      
        James Clark:
      
        - Fix commas so that PMU event files for arm64, power8 and power nine
          become valid JSON.
      
      libtraceevent:
      
        Konstantin Khlebnikov:
      
        - Fix parsing of event %o and %X argument types.
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      8f6ee51d
  4. 18 Nov, 2019 15 commits
    • Ian Rogers's avatar
      perf parse: Report initial event parsing error · a910e466
      Ian Rogers authored
      Record the first event parsing error and report. Implementing feedback
      from Jiri Olsa:
      
        https://lkml.org/lkml/2019/10/28/680
      
      An example error is:
      
        $ tools/perf/perf stat -e c/c/
        WARNING: multiple event parsing errors
        event syntax error: 'c/c/'
                               \___ unknown term
      
        valid terms: event,filter_rem,filter_opc0,edge,filter_isoc,filter_tid,filter_loc,filter_nc,inv,umask,filter_opc1,tid_en,thresh,filter_all_op,filter_not_nm,filter_state,filter_nm,config,config1,config2,name,period,percore
      
      Initial error:
      
        event syntax error: 'c/c/'
                            \___ Cannot find PMU `c'. Missing kernel support?
        Run 'perf list' for a list of valid events
      
         Usage: perf stat [<options>] [<command>]
      
            -e, --event <event>   event selector. use 'perf list' to list available events
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Allison Randal <allison@lohutok.net>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Anju T Sudhakar <anju@linux.vnet.ibm.com>
      Cc: Christian Borntraeger <borntraeger@de.ibm.com>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Jin Yao <yao.jin@linux.intel.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Thomas Richter <tmricht@linux.ibm.com>
      Link: http://lore.kernel.org/lkml/20191116074652.9960-1-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a910e466
    • Masami Hiramatsu's avatar
      perf probe: Trace a magic number if variable is not found · cb402730
      Masami Hiramatsu authored
      Trace a magic number as immediate value if the target variable is not
      found at some probe points which is based on one probe event.
      
      This feature is good for the case if you trace a source code line with
      some local variables, which is compiled into several instructions and
      some of the variables are optimized out on some instructions.
      
      Even if so, with this feature, perf probe trace a magic number instead
      of such disappeared variables and fold those probes on one event.
      
      E.g. without this patch:
      
        # perf probe -D "pud_page_vaddr pud"
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        Failed to find 'pud' in this function.
        p:probe/pud_page_vaddr _text+23480787 pud=%ax:x64
        p:probe/pud_page_vaddr _text+23808453 pud=%bp:x64
        p:probe/pud_page_vaddr _text+23558082 pud=%ax:x64
        p:probe/pud_page_vaddr _text+328373 pud=%r8:x64
        p:probe/pud_page_vaddr _text+348448 pud=%bx:x64
        p:probe/pud_page_vaddr _text+23816818 pud=%bx:x64
      
      With this patch:
      
        # perf probe -D "pud_page_vaddr pud" | head
        spurious_kernel_fault is blacklisted function, skip it.
        vmalloc_fault is blacklisted function, skip it.
        p:probe/pud_page_vaddr _text+23480787 pud=%ax:x64
        p:probe/pud_page_vaddr _text+149051 pud=\deade12d:x64
        p:probe/pud_page_vaddr _text+23808453 pud=%bp:x64
        p:probe/pud_page_vaddr _text+315926 pud=\deade12d:x64
        p:probe/pud_page_vaddr _text+23807209 pud=\deade12d:x64
        p:probe/pud_page_vaddr _text+23557365 pud=%ax:x64
        p:probe/pud_page_vaddr _text+314097 pud=%di:x64
        p:probe/pud_page_vaddr _text+314015 pud=\deade12d:x64
        p:probe/pud_page_vaddr _text+313893 pud=\deade12d:x64
        p:probe/pud_page_vaddr _text+324083 pud=\deade12d:x64
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406476931.24476.6261475888681844285.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cb402730
    • Masami Hiramatsu's avatar
      perf probe: Support DW_AT_const_value constant value · 66f69b21
      Masami Hiramatsu authored
      Support DW_AT_const_value for variable assignment instead of location.
      Note that this requires ftrace supporting immediate value.
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406476012.24476.16096289871757175775.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      66f69b21
    • Masami Hiramatsu's avatar
      perf probe: Support multiprobe event · 72363540
      Masami Hiramatsu authored
      Support multiprobe event if the event is based on function and lines and
      kernel supports it. In this case, perf probe creates the first probe
      with an event, and tries to append following probes on that event, since
      those probes must be on the same source code line.
      
      Before this patch;
      
        # perf probe -a vfs_read:18
        Added new events:
          probe:vfs_read_L18   (on vfs_read:18)
          probe:vfs_read_L18_1 (on vfs_read:18)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:vfs_read_L18_1 -aR sleep 1
      
        #
      
      After this patch (on multiprobe supported kernel)
        # perf probe -a vfs_read:18
        Added new events:
          probe:vfs_read_L18   (on vfs_read:18)
          probe:vfs_read_L18   (on vfs_read:18)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:vfs_read_L18 -aR sleep 1
      
        #
      
      Committer testing:
      
      On a kernel that doesn't support multiprobe events, after this patch:
      
        # uname -a
        Linux quaco 5.3.8-200.fc30.x86_64 #1 SMP Tue Oct 29 14:46:22 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
        # grep append /sys/kernel/debug/tracing/README
        	    be modified by appending '.descending' or '.ascending' to a
        	    can be modified by appending any of the following modifiers
        #
        # perf probe -a vfs_read:18
        Added new events:
          probe:vfs_read_L18   (on vfs_read:18)
          probe:vfs_read_L18_1 (on vfs_read:18)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:vfs_read_L18_1 -aR sleep 1
      
        # perf probe -l
          probe:vfs_read_L18   (on vfs_read:18@fs/read_write.c)
          probe:vfs_read_L18_1 (on vfs_read:18@fs/read_write.c)
        #
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406475010.24476.586290752591512351.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      72363540
    • Masami Hiramatsu's avatar
      perf probe: Generate event name with line number · 15354d54
      Masami Hiramatsu authored
      Generate event name from function name with line number as
      <function>_L<line_number>. Note that this is only for the new event
      which is defined by the line number of function (except for line 0).
      
      If there is another event on same line, you have to use
      "-f" option. In that case, the new event has "_1" suffix.
      
       e.g.
        # perf probe -a kernel_read:2
        Added new event:
          probe:kernel_read_L2 (on kernel_read:2)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:kernel_read_L2 -aR sleep 1
      
      But if we omit the line number or 0th line, it will
      have no suffix.
      
        # perf probe -a kernel_read:0
        Added new event:
          probe:kernel_read (on kernel_read)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:kernel_read -aR sleep 1
      
        probe:kernel_read    (on kernel_read@linux-5.0.0/fs/read_write.c)
        probe:kernel_read_L2 (on kernel_read:2@linux-5.0.0/fs/read_write.c)
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406474026.24476.2828897745502059569.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      15354d54
    • Masami Hiramatsu's avatar
      perf probe: Do not show non representive lines by perf-probe -L · 499144c8
      Masami Hiramatsu authored
      Since perf probe -L shows non representive lines, it can be mislead
      users where user can put probes.  This prevents to show such non
      representive lines so that user can understand which lines user can
      probe.
      
        # perf probe -L kernel_read
        <kernel_read@/build/linux-pvZVvI/linux-5.0.0/fs/read_write.c:0>
              0  ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
                 {
              2         mm_segment_t old_fs;
                        ssize_t result;
      
                        old_fs = get_fs();
              6         set_fs(get_ds());
                        /* The cast to a user pointer is valid due to the set_fs() */
              8         result = vfs_read(file, (void __user *)buf, count, pos);
              9         set_fs(old_fs);
             10         return result;
                 }
                 EXPORT_SYMBOL(kernel_read);
      
      Committer testing:
      
      Before:
      
        # perf probe -L kernel_read
        <kernel_read@/usr/src/debug/kernel-5.3.fc30/linux-5.3.8-200.fc30.x86_64/fs/read_write.c:0>
              0  ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
              1  {
              2         mm_segment_t old_fs;
              3         ssize_t result;
      
              5         old_fs = get_fs();
              6         set_fs(KERNEL_DS);
                        /* The cast to a user pointer is valid due to the set_fs() */
              8         result = vfs_read(file, (void __user *)buf, count, pos);
              9         set_fs(old_fs);
             10         return result;
                 }
                 EXPORT_SYMBOL(kernel_read);
        #
      
      See the 1, 3, 5 lines? They shouldn't be there, after this patch:
      
        # perf probe -L kernel_read
        <kernel_read@/usr/src/debug/kernel-5.3.fc30/linux-5.3.8-200.fc30.x86_64/fs/read_write.c:0>
              0  ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
                 {
              2         mm_segment_t old_fs;
                        ssize_t result;
      
                        old_fs = get_fs();
              6         set_fs(KERNEL_DS);
                        /* The cast to a user pointer is valid due to the set_fs() */
              8         result = vfs_read(file, (void __user *)buf, count, pos);
              9         set_fs(old_fs);
             10         return result;
                 }
                 EXPORT_SYMBOL(kernel_read);
        #
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Reported-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406473064.24476.2913278267727587314.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      499144c8
    • Masami Hiramatsu's avatar
      perf probe: Verify given line is a representive line · 1ae5d88a
      Masami Hiramatsu authored
      Verify user given probe line is a representive line (which doesn't share
      the address with other lines or the line is the least line among the
      lines which shares same address), and if not, it shows what is the
      representive line.
      
      Without this fix, user can put a probe on the lines which is not a a
      representive line. But since this is not a representive line, perf probe
      -l shows a representive line number instead of user given line number.
      e.g. (put kernel_read:3, but listed as kernel_read:2)
      
        # perf probe -a kernel_read:3
        Added new event:
          probe:kernel_read    (on kernel_read:3)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:kernel_read -aR sleep 1
      
        # perf probe -l
          probe:kernel_read    (on kernel_read:2@linux-5.0.0/fs/read_write.c)
      
      With this fix, perf probe doesn't allow user to put a probe on a
      representive line, and tell what is the representive line.
      
        # perf probe -a kernel_read:3
        This line is sharing the addrees with other lines.
        Please try to probe at kernel_read:2 instead.
          Error: Failed to add events.
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Reported-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406472071.24476.14915451439785001021.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1ae5d88a
    • Masami Hiramatsu's avatar
      perf probe: Show correct statement line number by perf probe -l · 57f95bf5
      Masami Hiramatsu authored
      The dwarf_getsrc_die() can return the line which is not a statement nor
      the least line number among the lines which shares same address.
      
      This can lead perf probe --list shows incorrect line number for probed
      address.
      
      To fix this, this introduces cu_getsrc_die() which returns only a
      statement line and which is the least line number (we call it the
      representive line for an address), and use it in cu_find_lineinfo().
      
      Also, if the given address is the entry address of a real function,
      cu_find_lineinfo() returns the function declared line number instead of
      the start line number of the function body.
      
      For example, without this change perf probe -l shows incorrect line as
      below.
      
        # perf probe -a kernel_read:2
        Added new event:
          probe:kernel_read    (on kernel_read:2)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe:kernel_read -aR sleep 1
      
        # perf probe -l
          probe:kernel_read    (on kernel_read:1@linux-5.0.0/fs/read_write.c)
      
      With this fix, it shows correct line number as below;
      
        # perf probe -l
          probe:kernel_read    (on kernel_read:2@linux-5.0.0/fs/read_write.c)
      Reported-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
      Link: http://lore.kernel.org/lkml/157406471067.24476.17463149618465494448.stgit@devnote2Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      57f95bf5
    • Adrian Hunter's avatar
      x86/insn: Add some Intel instructions to the opcode map · b980be18
      Adrian Hunter authored
      Add to the opcode map the following instructions:
              cldemote
              tpause
              umonitor
              umwait
              movdiri
              movdir64b
              enqcmd
              enqcmds
              encls
              enclu
              enclv
              pconfig
              wbnoinvd
      
      For information about the instructions, refer Intel SDM May 2019
      (325462-070US) and Intel Architecture Instruction Set Extensions
      May 2019 (319433-037).
      
      The instruction decoding can be tested using the perf tools'
      "x86 instruction decoder - new instructions" test as folllows:
      
        $ perf test -v "new " 2>&1 | grep -i cldemote
        Decoded ok: 0f 1c 00                    cldemote (%eax)
        Decoded ok: 0f 1c 05 78 56 34 12        cldemote 0x12345678
        Decoded ok: 0f 1c 84 c8 78 56 34 12     cldemote 0x12345678(%eax,%ecx,8)
        Decoded ok: 0f 1c 00                    cldemote (%rax)
        Decoded ok: 41 0f 1c 00                 cldemote (%r8)
        Decoded ok: 0f 1c 04 25 78 56 34 12     cldemote 0x12345678
        Decoded ok: 0f 1c 84 c8 78 56 34 12     cldemote 0x12345678(%rax,%rcx,8)
        Decoded ok: 41 0f 1c 84 c8 78 56 34 12  cldemote 0x12345678(%r8,%rcx,8)
        $ perf test -v "new " 2>&1 | grep -i tpause
        Decoded ok: 66 0f ae f3                 tpause %ebx
        Decoded ok: 66 0f ae f3                 tpause %ebx
        Decoded ok: 66 41 0f ae f0              tpause %r8d
        $ perf test -v "new " 2>&1 | grep -i umonitor
        Decoded ok: 67 f3 0f ae f0              umonitor %ax
        Decoded ok: f3 0f ae f0                 umonitor %eax
        Decoded ok: 67 f3 0f ae f0              umonitor %eax
        Decoded ok: f3 0f ae f0                 umonitor %rax
        Decoded ok: 67 f3 41 0f ae f0           umonitor %r8d
        $ perf test -v "new " 2>&1 | grep -i umwait
        Decoded ok: f2 0f ae f0                 umwait %eax
        Decoded ok: f2 0f ae f0                 umwait %eax
        Decoded ok: f2 41 0f ae f0              umwait %r8d
        $ perf test -v "new " 2>&1 | grep -i movdiri
        Decoded ok: 0f 38 f9 03                 movdiri %eax,(%ebx)
        Decoded ok: 0f 38 f9 88 78 56 34 12     movdiri %ecx,0x12345678(%eax)
        Decoded ok: 48 0f 38 f9 03              movdiri %rax,(%rbx)
        Decoded ok: 48 0f 38 f9 88 78 56 34 12  movdiri %rcx,0x12345678(%rax)
        $ perf test -v "new " 2>&1 | grep -i movdir64b
        Decoded ok: 66 0f 38 f8 18              movdir64b (%eax),%ebx
        Decoded ok: 66 0f 38 f8 88 78 56 34 12  movdir64b 0x12345678(%eax),%ecx
        Decoded ok: 67 66 0f 38 f8 1c           movdir64b (%si),%bx
        Decoded ok: 67 66 0f 38 f8 8c 34 12     movdir64b 0x1234(%si),%cx
        Decoded ok: 66 0f 38 f8 18              movdir64b (%rax),%rbx
        Decoded ok: 66 0f 38 f8 88 78 56 34 12  movdir64b 0x12345678(%rax),%rcx
        Decoded ok: 67 66 0f 38 f8 18           movdir64b (%eax),%ebx
        Decoded ok: 67 66 0f 38 f8 88 78 56 34 12       movdir64b 0x12345678(%eax),%ecx
        $ perf test -v "new " 2>&1 | grep -i enqcmd
        Decoded ok: f2 0f 38 f8 18              enqcmd (%eax),%ebx
        Decoded ok: f2 0f 38 f8 88 78 56 34 12  enqcmd 0x12345678(%eax),%ecx
        Decoded ok: 67 f2 0f 38 f8 1c           enqcmd (%si),%bx
        Decoded ok: 67 f2 0f 38 f8 8c 34 12     enqcmd 0x1234(%si),%cx
        Decoded ok: f3 0f 38 f8 18              enqcmds (%eax),%ebx
        Decoded ok: f3 0f 38 f8 88 78 56 34 12  enqcmds 0x12345678(%eax),%ecx
        Decoded ok: 67 f3 0f 38 f8 1c           enqcmds (%si),%bx
        Decoded ok: 67 f3 0f 38 f8 8c 34 12     enqcmds 0x1234(%si),%cx
        Decoded ok: f2 0f 38 f8 18              enqcmd (%rax),%rbx
        Decoded ok: f2 0f 38 f8 88 78 56 34 12  enqcmd 0x12345678(%rax),%rcx
        Decoded ok: 67 f2 0f 38 f8 18           enqcmd (%eax),%ebx
        Decoded ok: 67 f2 0f 38 f8 88 78 56 34 12       enqcmd 0x12345678(%eax),%ecx
        Decoded ok: f3 0f 38 f8 18              enqcmds (%rax),%rbx
        Decoded ok: f3 0f 38 f8 88 78 56 34 12  enqcmds 0x12345678(%rax),%rcx
        Decoded ok: 67 f3 0f 38 f8 18           enqcmds (%eax),%ebx
        Decoded ok: 67 f3 0f 38 f8 88 78 56 34 12       enqcmds 0x12345678(%eax),%ecx
        $ perf test -v "new " 2>&1 | grep -i enqcmds
        Decoded ok: f3 0f 38 f8 18              enqcmds (%eax),%ebx
        Decoded ok: f3 0f 38 f8 88 78 56 34 12  enqcmds 0x12345678(%eax),%ecx
        Decoded ok: 67 f3 0f 38 f8 1c           enqcmds (%si),%bx
        Decoded ok: 67 f3 0f 38 f8 8c 34 12     enqcmds 0x1234(%si),%cx
        Decoded ok: f3 0f 38 f8 18              enqcmds (%rax),%rbx
        Decoded ok: f3 0f 38 f8 88 78 56 34 12  enqcmds 0x12345678(%rax),%rcx
        Decoded ok: 67 f3 0f 38 f8 18           enqcmds (%eax),%ebx
        Decoded ok: 67 f3 0f 38 f8 88 78 56 34 12       enqcmds 0x12345678(%eax),%ecx
        $ perf test -v "new " 2>&1 | grep -i encls
        Decoded ok: 0f 01 cf                    encls
        Decoded ok: 0f 01 cf                    encls
        $ perf test -v "new " 2>&1 | grep -i enclu
        Decoded ok: 0f 01 d7                    enclu
        Decoded ok: 0f 01 d7                    enclu
        $ perf test -v "new " 2>&1 | grep -i enclv
        Decoded ok: 0f 01 c0                    enclv
        Decoded ok: 0f 01 c0                    enclv
        $ perf test -v "new " 2>&1 | grep -i pconfig
        Decoded ok: 0f 01 c5                    pconfig
        Decoded ok: 0f 01 c5                    pconfig
        $ perf test -v "new " 2>&1 | grep -i wbnoinvd
        Decoded ok: f3 0f 09                    wbnoinvd
        Decoded ok: f3 0f 09                    wbnoinvd
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
      Acked-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: x86@kernel.org
      Link: http://lore.kernel.org/lkml/20191115135447.6519-3-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b980be18
    • Adrian Hunter's avatar
      x86/insn: perf tools: Add some instructions to the new instructions test · 1e5f0154
      Adrian Hunter authored
      Add to the "x86 instruction decoder - new instructions" test the following
      instructions:
      	cldemote
      	tpause
      	umonitor
      	umwait
      	movdiri
      	movdir64b
      	enqcmd
      	enqcmds
      	encls
      	enclu
      	enclv
      	pconfig
      	wbnoinvd
      
      For information about the instructions, refer Intel SDM May 2019
      (325462-070US) and Intel Architecture Instruction Set Extensions
      May 2019 (319433-037).
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: x86@kernel.org
      Link: http://lore.kernel.org/lkml/20191115135447.6519-2-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1e5f0154
    • Arnaldo Carvalho de Melo's avatar
      perf map: Move seldom used ->flags field to second cacheline · 7624e694
      Arnaldo Carvalho de Melo authored
      So we start with:
      
        $ pahole -C map ~/bin/perf
        struct map {
        	union {
        		struct rb_node rb_node __attribute__((__aligned__(8))); /*     0    24 */
        		struct list_head node;                   /*     0    16 */
        	} __attribute__((__aligned__(8)));                                               /*     0    24 */
        	u64                        start;                /*    24     8 */
        	u64                        end;                  /*    32     8 */
        	_Bool                      erange_warned:1;      /*    40: 0  1 */
        	_Bool                      priv:1;               /*    40: 1  1 */
      
        	/* XXX 6 bits hole, try to pack */
        	/* XXX 3 bytes hole, try to pack */
      
        	u32                        prot;                 /*    44     4 */
        	u32                        flags;                /*    48     4 */
      
        	/* XXX 4 bytes hole, try to pack */
      
        	u64                        pgoff;                /*    56     8 */
        	/* --- cacheline 1 boundary (64 bytes) --- */
        	u64                        reloc;                /*    64     8 */
        	u32                        maj;                  /*    72     4 */
        	u32                        min;                  /*    76     4 */
        	u64                        ino;                  /*    80     8 */
        	u64                        ino_generation;       /*    88     8 */
        	u64                        (*map_ip)(struct map *, u64); /*    96     8 */
        	u64                        (*unmap_ip)(struct map *, u64); /*   104     8 */
        	struct dso *               dso;                  /*   112     8 */
        	refcount_t                 refcnt;               /*   120     4 */
      
        	/* size: 128, cachelines: 2, members: 17 */
        	/* sum members: 116, holes: 2, sum holes: 7 */
        	/* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
        	/* padding: 4 */
        	/* forced alignments: 1 */
        } __attribute__((__aligned__(8)));
        $
      
      and 'flags' is seldom used when printing details about the map or with
      the "cacheline" sort order, we can move them it to the second cacheline,
      that will allow combining it with 'refcnt', that is only four bytes:
      
        $ pahole -C map ~/bin/perf
        struct map {
        	union {
        		struct rb_node rb_node __attribute__((__aligned__(8))); /*     0    24 */
        		struct list_head node;                   /*     0    16 */
        	} __attribute__((__aligned__(8)));                                               /*     0    24 */
        	u64                        start;                /*    24     8 */
        	u64                        end;                  /*    32     8 */
        	_Bool                      erange_warned:1;      /*    40: 0  1 */
        	_Bool                      priv:1;               /*    40: 1  1 */
      
        	/* XXX 6 bits hole, try to pack */
        	/* XXX 3 bytes hole, try to pack */
      
        	u32                        prot;                 /*    44     4 */
        	u64                        pgoff;                /*    48     8 */
        	u64                        reloc;                /*    56     8 */
        	/* --- cacheline 1 boundary (64 bytes) --- */
        	u32                        maj;                  /*    64     4 */
        	u32                        min;                  /*    68     4 */
        	u64                        ino;                  /*    72     8 */
        	u64                        ino_generation;       /*    80     8 */
        	u64                        (*map_ip)(struct map *, u64); /*    88     8 */
        	u64                        (*unmap_ip)(struct map *, u64); /*    96     8 */
        	struct dso *               dso;                  /*   104     8 */
        	refcount_t                 refcnt;               /*   112     4 */
        	u32                        flags;                /*   116     4 */
      
        	/* size: 120, cachelines: 2, members: 17 */
        	/* sum members: 116, holes: 1, sum holes: 3 */
        	/* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
        	/* forced alignments: 1 */
        	/* last cacheline: 56 bytes */
        } __attribute__((__aligned__(8)));
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-2cdw3zlw1mkamaf7nqtdlxfi@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7624e694
    • Arnaldo Carvalho de Melo's avatar
      perf map: Use bitmap for booleans · dbc984c9
      Arnaldo Carvalho de Melo authored
      The map->priv and map->erange_warned are seldom used, the first only in
      tests/vmlinux-kallsyms.c, the later only when hist_entry__inc_addr_samples()
      returns -ERANGE in 'perf top', which are really rare occasions, so make
      them a bool bitfield.
      
      This will open up space for other members on the first cacheline.
      
        $ pahole -C map ~/bin/perf
        struct map {
        	union {
        		struct rb_node rb_node __attribute__((__aligned__(8))); /*     0    24 */
        		struct list_head node;                   /*     0    16 */
        	} __attribute__((__aligned__(8)));                                               /*     0    24 */
        	u64                        start;                /*    24     8 */
        	u64                        end;                  /*    32     8 */
        	_Bool                      erange_warned:1;      /*    40: 0  1 */
        	_Bool                      priv:1;               /*    40: 1  1 */
      
        	/* XXX 6 bits hole, try to pack */
        	/* XXX 3 bytes hole, try to pack */
      
        	u32                        prot;                 /*    44     4 */
        	u32                        flags;                /*    48     4 */
      
        	/* XXX 4 bytes hole, try to pack */
      
        	u64                        pgoff;                /*    56     8 */
        	/* --- cacheline 1 boundary (64 bytes) --- */
        	u64                        reloc;                /*    64     8 */
        	u32                        maj;                  /*    72     4 */
        	u32                        min;                  /*    76     4 */
        	u64                        ino;                  /*    80     8 */
        	u64                        ino_generation;       /*    88     8 */
        	u64                        (*map_ip)(struct map *, u64); /*    96     8 */
        	u64                        (*unmap_ip)(struct map *, u64); /*   104     8 */
        	struct dso *               dso;                  /*   112     8 */
        	refcount_t                 refcnt;               /*   120     4 */
      
        	/* size: 128, cachelines: 2, members: 17 */
        	/* sum members: 116, holes: 2, sum holes: 7 */
        	/* sum bitfield members: 2 bits, bit holes: 1, sum bit holes: 6 bits */
        	/* padding: 4 */
        	/* forced alignments: 1 */
        } __attribute__((__aligned__(8)));
        $
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-g5545pcq4ff0wr17tfb1piqt@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      dbc984c9
    • Konstantin Khlebnikov's avatar
      libtraceevent: Fix parsing of event %o and %X argument types · 10f64581
      Konstantin Khlebnikov authored
      Add missing "%o" and "%X". Ext4 events use "%o" for printing i_mode.
      Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
      Reviewed-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Cc: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
      Link: http://lore.kernel.org/lkml/157338066113.6548.11461421296091086041.stgit@buzzSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      10f64581
    • Adrian Hunter's avatar
      perf callchain: Fix segfault in thread__resolve_callchain_sample() · aceb9826
      Adrian Hunter authored
      Do not dereference 'chain' when it is NULL.
      
        $ perf record -e intel_pt//u -e branch-misses:u uname
        $ perf report --itrace=l --branch-history
        perf: Segmentation fault
      
      Fixes: e9024d51 ("perf callchain: Honour the ordering of PERF_CONTEXT_{USER,KERNEL,etc}")
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Link: http://lore.kernel.org/lkml/20191114142538.4097-1-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      aceb9826
    • Arnaldo Carvalho de Melo's avatar
      perf map_groups: Auto sort maps by name, if needed · a7c2b572
      Arnaldo Carvalho de Melo authored
      There are still lots of lookups by name, even if just when loading
      vmlinux, till that code is studied to figure out if its possible to do
      away with those map lookup by names, provide a way to sort it using
      libc's qsort/bsearch.
      
      Doing it at the first lookup defers the sorting a bit, and as the code
      stands now, is never done for user maps, just for the kernel ones.
      
        # perf probe -l
        # perf probe -x ~/bin/perf -L __map_groups__find_by_name
        <__map_groups__find_by_name@/home/acme/git/perf/tools/perf/util/symbol.c:0>
              0  static struct map *__map_groups__find_by_name(struct map_groups *mg, const char *name)
              1  {
                        struct map **mapp;
      
              4         if (mg->maps_by_name == NULL &&
              5             map__groups__sort_by_name_from_rbtree(mg))
              6                 return NULL;
      
              8         mapp = bsearch(name, mg->maps_by_name, mg->nr_maps, sizeof(*mapp), map__strcmp_name);
              9         if (mapp)
             10                 return *mapp;
             11         return NULL;
             12  }
      
                 struct map *map_groups__find_by_name(struct map_groups *mg, const char *name)
                 {
      
        # perf probe -x ~/bin/perf 'found=__map_groups__find_by_name:10 name:string'
        Added new event:
          probe_perf:found     (on __map_groups__find_by_name:10 in /home/acme/bin/perf with name:string)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe_perf:found -aR sleep 1
      
        #
        # perf probe -x ~/bin/perf -L map_groups__find_by_name
        <map_groups__find_by_name@/home/acme/git/perf/tools/perf/util/symbol.c:0>
              0  struct map *map_groups__find_by_name(struct map_groups *mg, const char *name)
              1  {
              2         struct maps *maps = &mg->maps;
                        struct map *map;
      
              5         down_read(&maps->lock);
      
              7         if (mg->last_search_by_name && strcmp(mg->last_search_by_name->dso->short_name, name) == 0) {
              8                 map = mg->last_search_by_name;
              9                 goto out_unlock;
                        }
                        /*
                         * If we have mg->maps_by_name, then the name isn't in the rbtree,
                         * as mg->maps_by_name mirrors the rbtree when lookups by name are
                         * made.
                         */
             16         map = __map_groups__find_by_name(mg, name);
             17         if (map || mg->maps_by_name != NULL)
             18                 goto out_unlock;
      
                        /* Fallback to traversing the rbtree... */
             21         maps__for_each_entry(maps, map)
             22                 if (strcmp(map->dso->short_name, name) == 0) {
             23                         mg->last_search_by_name = map;
             24                         goto out_unlock;
                                }
      
             27         map = NULL;
      
                 out_unlock:
             30         up_read(&maps->lock);
             31         return map;
             32  }
      
                 int dso__load_vmlinux(struct dso *dso, struct map *map,
                                      const char *vmlinux, bool vmlinux_allocated)
      
        # perf probe -x ~/bin/perf 'fallback=map_groups__find_by_name:21 name:string'
        Added new events:
          probe_perf:fallback  (on map_groups__find_by_name:21 in /home/acme/bin/perf with name:string)
          probe_perf:fallback_1 (on map_groups__find_by_name:21 in /home/acme/bin/perf with name:string)
      
        You can now use it in all perf tools, such as:
      
        	perf record -e probe_perf:fallback_1 -aR sleep 1
      
        #
        # perf probe -l
          probe_perf:fallback  (on map_groups__find_by_name:21@util/symbol.c in /home/acme/bin/perf with name_string)
          probe_perf:fallback_1 (on map_groups__find_by_name:21@util/symbol.c in /home/acme/bin/perf with name_string)
          probe_perf:found     (on __map_groups__find_by_name:10@util/symbol.c in /home/acme/bin/perf with name_string)
        #
        # perf stat -e probe_perf:*
      
      Now run 'perf top' in another term and then, after a while, stop 'perf stat':
      
      Furthermore, if we ask for interval printing, we can see that that is done just
      at the start of the workload:
      
        # perf stat -I1000 -e probe_perf:*
        #           time             counts unit events
             1.000319513                  0      probe_perf:found
             1.000319513                  0      probe_perf:fallback_1
             1.000319513                  0      probe_perf:fallback
             2.001868092             23,251      probe_perf:found
             2.001868092                  0      probe_perf:fallback_1
             2.001868092                  0      probe_perf:fallback
             3.002901597                  0      probe_perf:found
             3.002901597                  0      probe_perf:fallback_1
             3.002901597                  0      probe_perf:fallback
             4.003358591                  0      probe_perf:found
             4.003358591                  0      probe_perf:fallback_1
             4.003358591                  0      probe_perf:fallback
        ^C
        #
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-c5lmbyr14x448rcfii7y6t3k@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a7c2b572