1. 10 10月, 2019 15 次提交
    • J
      libperf: Adopt perf_mmap__consume() function from tools/perf · 7728fa0c
      Jiri Olsa 提交于
      Move perf_mmap__consume() vrom tools/perf to libperf and export it in
      the perf/mmap.h header.
      
      Move also the needed helpers perf_mmap__write_tail(),
      perf_mmap__read_head() and perf_mmap__empty().
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-10-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      7728fa0c
    • J
      perf tools: Use perf_mmap way to detect aux mmap · 1d40ae4e
      Jiri Olsa 提交于
      We will move this code to libperf shortly, so we need to free it of
      'struct auxtrace_mmap' usage, because it won't be available in libperf
      (for now).
      
      The perf_event_mmap_page::aux_size is set when the aux mmap is mapped,
      so the check is equivalent.
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-9-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1d40ae4e
    • J
      libperf: Adopt perf_mmap__put() function from tools/perf · 80e53d11
      Jiri Olsa 提交于
      Move perf_mmap__put() from tools/perf to libperf.
      
      Once perf_mmap__put() is moved, we need a way to call application
      related unmap code (AIO and aux related code for eprf), when the map
      goes away.
      
      Add the perf_mmap::unmap callback to do that.
      
      The unmap path from perf is:
      
        perf_mmap__put                           (libperf)
          perf_mmap__munmap                      (libperf)
            map->unmap_cb -> perf_mmap__unmap_cb (perf)
              mmap__munmap                       (perf)
      
      Committer notes:
      
      Add missing linux/kernel.h to tools/perf/lib/mmap.c to get the BUG_ON
      definition.
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-8-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      80e53d11
    • J
      libperf: Adopt perf_mmap__unmap() function from tools/perf · 59d7ea62
      Jiri Olsa 提交于
      Move perf_mmap__unmap() from tools/perf to libperf, to internal header
      internal/mmap.h. It will be used in the following patches. And rename
      the existing perf's function to mmap__munmap().
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-7-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      59d7ea62
    • J
      libperf: Adopt perf_mmap__get() function from tools/perf · e75710f0
      Jiri Olsa 提交于
      Move perf_mmap__get() from tools/perf to libperf in the internal header
      internal/mmap.h.
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-6-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      e75710f0
    • J
      libperf: Adopt perf_mmap__mmap() function from tools/perf · 32c261c0
      Jiri Olsa 提交于
      Move perf_mmap__mmap() from tools/perf to libperf, it will be used in
      the following patches. And rename the existing perf's function to
      mmap__mmap().
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-5-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      32c261c0
    • J
      libperf: Adopt perf_mmap__mmap_len() function from tools/perf · bf59b305
      Jiri Olsa 提交于
      Move perf_mmap__mmap_len() from tools/perf wto libperf, it will be used
      in the following patches. And rename the existing perf's function to
      mmap__mmap_len().
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-4-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      bf59b305
    • J
      libperf: Add 'struct perf_mmap_param' · e440979f
      Jiri Olsa 提交于
      Add libperf's version of mmap params 'struct perf_mmap_param' object
      with the basics: 'prot' and 'mask'.  Encapsulate it in the current
      'struct mmap_params' object.
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-3-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      e440979f
    • J
      libperf: Add perf_mmap__init() function · 353120b4
      Jiri Olsa 提交于
      Add perf_mmap__init() function to initialize 'struct perf_mmap' objects.
      
      Add it to a new mmap.c source file, that will carry all the mmap related
      functions.
      Signed-off-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20191007125344.14268-2-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      353120b4
    • J
      MAINTAINERS: Add entry for perf tool arm64 pmu-events files · 26d5310e
      John Garry 提交于
      Will and I have an interest in reviewing the pmu-events changes related
      to arm64, so add a specific entry for this.
      Signed-off-by: NJohn Garry <john.garry@huawei.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Jiri Olsa <jolsa@redhat.com>
      Cc: linuxarm@huawei.com
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
      Cc: Will Deacon <will@kernel.org>
      Link: http://lore.kernel.org/lkml/1570611273-108281-1-git-send-email-john.garry@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      26d5310e
    • I
      perf tools: Avoid 'sample_reg_masks' being const + weak · 42466b9f
      Ian Rogers 提交于
      Being const + weak breaks with some compilers that constant-propagate
      from the weak symbol. This behavior is outside of the specification, but
      in LLVM is chosen to match GCC's behavior.
      
      LLVM's implementation was set in this patch:
      
        https://github.com/llvm/llvm-project/commit/f49573d1eedcf1e44893d5a062ac1b72c8419646
      
      A const + weak symbol is set to be weak_odr:
      
        https://llvm.org/docs/LangRef.html
      
      ODR is one definition rule, and given there is one constant definition
      constant-propagation is possible. It is possible to get this code to
      miscompile with LLVM when applying link time optimization. As compilers
      become more aggressive, this is likely to break in more instances.
      
      Move the definition of sample_reg_masks to the conditional part of
      perf_regs.h and guard usage with HAVE_PERF_REGS_SUPPORT. This avoids the
      weak symbol.
      
      Fix an issue when HAVE_PERF_REGS_SUPPORT isn't defined from patch v1.
      In v3, add perf_regs.c for architectures that HAVE_PERF_REGS_SUPPORT but
      don't declare sample_regs_masks.
      
      Further notes:
      
      Jiri asked:
      
        "Is this just a precaution or you actualy saw some breakage?"
      
      Ian answered:
      
        "We saw a breakage with clang with thinlto enabled for linking. Our
         compiler team had recently seen, and were surprised by, a similar issue
         and were able to dig out the weak ODR issue."
      Signed-off-by: NIan Rogers <irogers@google.com>
      Reviewed-by: NNick Desaulniers <ndesaulniers@google.com>
      Acked-by: NJiri Olsa <jolsa@kernel.org>
      Cc: Albert Ou <aou@eecs.berkeley.edu>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: clang-built-linux@googlegroups.com
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: linux-riscv@lists.infradead.org
      Cc: Mao Han <han_mao@c-sky.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Palmer Dabbelt <palmer@sifive.com>
      Cc: Paul Walmsley <paul.walmsley@sifive.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: http://lore.kernel.org/lkml/20191001003623.255186-1-irogers@google.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      42466b9f
    • A
      perf beauty: Introduce strtoul() for x86 MSRs · 728db198
      Arnaldo Carvalho de Melo 提交于
      Continuing from the previous cset comment, now that filter expression
      works:
      
        # perf trace -e msr:* --filter="msr!=FS_BASE && msr != IA32_TSC_DEADLINE && msr != 0x830 && msr != 0x83f && msr !=IA32_SPEC_CTRL" --filter-pids 3750
           0.000 Timer/5033 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
           0.009 Timer/5033 msr:write_msr(msr: LSTAR, val: -1398800368)
           0.010 Timer/5033 msr:write_msr(msr: TSC_AUX, val: 4)
           0.050 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
          45.661 gnome-terminal/12595 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
          45.672 gnome-terminal/12595 msr:write_msr(msr: LSTAR, val: -1398800368)
          45.675 gnome-terminal/12595 msr:write_msr(msr: TSC_AUX, val: 3)
          54.852 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         130.508 Timer/4050 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
         130.527 Timer/4050 msr:write_msr(msr: LSTAR, val: -1398800368)
         130.531 Timer/4050 msr:write_msr(msr: TSC_AUX, val: 3)
         140.924 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         164.738 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         603.578 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         620.809 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         690.115 JS Watchdog/4259 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
         690.136 JS Watchdog/4259 msr:write_msr(msr: LSTAR, val: -1398800368)
         690.141 JS Watchdog/4259 msr:write_msr(msr: TSC_AUX, val: 3)
         690.186 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
         759.016 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
      ^C[root@quaco ~]#
      
      Or look at the first 3 write_msr events for that IA32_TSC_DEADLINE to learn why
      it happens so often:
      
        # perf trace --max-events=3 --max-stack=8 -e msr:* --filter="msr==IA32_TSC_DEADLINE" --filter-pids 3750
           0.000 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 19296732550862)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             lapic_next_deadline ([kernel.kallsyms])
                                             clockevents_program_event ([kernel.kallsyms])
                                             hrtimer_interrupt ([kernel.kallsyms])
                                             smp_apic_timer_interrupt ([kernel.kallsyms])
                                             apic_timer_interrupt ([kernel.kallsyms])
                                             cpuidle_enter_state ([kernel.kallsyms])
          32.646 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 19296800134158)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             lapic_next_deadline ([kernel.kallsyms])
                                             clockevents_program_event ([kernel.kallsyms])
                                             hrtimer_start_range_ns ([kernel.kallsyms])
                                             tick_nohz_restart_sched_tick ([kernel.kallsyms])
                                             tick_nohz_idle_exit ([kernel.kallsyms])
                                             do_idle ([kernel.kallsyms])
          32.802 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 19297507436922)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             lapic_next_deadline ([kernel.kallsyms])
                                             clockevents_program_event ([kernel.kallsyms])
                                             hrtimer_try_to_cancel ([kernel.kallsyms])
                                             hrtimer_cancel ([kernel.kallsyms])
                                             tick_nohz_restart_sched_tick ([kernel.kallsyms])
                                             tick_nohz_idle_exit ([kernel.kallsyms])
        #
      
      And if some of the strings can't be found:
      
        # trace -e msr:* --filter="msr!=SPECULATIVE_EXECUTION_PROBLEMS_SOLUTION && msr != IA32_TSC_DEADLINE && msr != 0x830 && msr != 0x83f && msr !=IA32_SPEC_CTRL" --filter-pids 3750
        "SPECULATIVE_EXECUTION_PROBLEMS_SOLUTION" not found for "msr" in "msr:read_msr", can't set filter "(msr!=SPECULATIVE_EXECUTION_PROBLEMS_SOLUTION && msr != IA32_TSC_DEADLINE && msr != 0x830 && msr != 0x83f && msr !=IA32_SPEC_CTRL) && (common_pid != 28131 && common_pid != 3750)"
        #
      
      Next step is to automatically wire up the pre-existing strarrays, which there
      are quite a few.
      
      The strtoul() methods will be further enhanced to allow for looking at other
      arguments in a syscall/tracepoint, just like going from integer to string
      (scnprintf methods), so that those "val" lines for the msr tracepoints can be
      properly formatted or even resolved into some string.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-4qaai5iqjgefd11k4ddm7qg8@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      728db198
    • A
      perf trace: Expand strings in filters to integers · 90df0249
      Arnaldo Carvalho de Melo 提交于
      So that one can try things like:
      
        # perf trace -e msr:* --filter="msr!=FS_BASE && msr != IA32_TSC_DEADLINE && msr != 0x830 && msr != 0x83f && msr !=IA32_SPEC_CTRL" --filter-pids 3750
      
      That, at this point in the patchset, without any strtoul in place for
      tracepoint arguments, will result in:
      
        No resolver (strtoul) for "msr" in "msr:read_msr", can't set filter "(msr!=FS_BASE && msr != IA32_TSC_DEADLINE && msr != 0x830 && msr != 0x83f && msr !=IA32_SPEC_CTRL) && (common_pid != 25407 && common_pid != 3750)"
        #
      
      See you in the next cset!
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-dx5j70fv2rgkeezd1cb3hv2p@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      90df0249
    • A
      perf trace: Introduce a strtoul() method for 'struct strarrays' · d0a3a104
      Arnaldo Carvalho de Melo 提交于
      And also for 'struct strarray', since its needed to implement
      strarrays__strtoul(). This just traverses the entries and when finding a
      match, returns (offset + index), i.e. the value associated with the
      searched string.
      
      E.g. "EFER" (MSR_EFER) returns:
      
        # grep -w EFER -B2 /tmp/build/perf/trace/beauty/generated/x86_arch_MSRs_array.c
        #define x86_64_specific_MSRs_offset 0xc0000080
        static const char *x86_64_specific_MSRs[] = {
      	[0xc0000080 - x86_64_specific_MSRs_offset] = "EFER",
        #
      
        0xc0000080
      
      This will be auto-attached to 'struct syscall_arg_fmt' entries
      associated with strarrays as soon as we add a ->strarray and ->strarrays
      to 'struct syscall_arg_fmt'.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-r2hpaahf8lishyb1owko9vs1@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      d0a3a104
    • A
      perf trace: Add a strtoul() method to 'struct syscall_arg_fmt' · 3f41b778
      Arnaldo Carvalho de Melo 提交于
      This will go from a string to a number, so that filter expressions can
      be constructed with strings and then, before applying the tracepoint
      filters (or eBPF, in the future) we can map those strings to numbers.
      
      The first one will be for 'msr' tracepoint arguments, but real quickly
      we will be able to reuse all strarrays for that.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-wgqq48agcgr95b8dmn6fygtr@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      3f41b778
  2. 09 10月, 2019 10 次提交
    • A
      perf trace: Introduce --filter for tracepoint events · d4097f19
      Arnaldo Carvalho de Melo 提交于
      Similar to what is in 'perf record', works just like there:
      
        # perf trace -e msr:*
         328.297 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.302 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.306 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.317 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.322 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.327 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.331 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.336 :0/0 msr:write_msr(msr: FS_BASE, val: 140240388381888)
         328.340 :0/0 ^Cmsr:write_msr(msr: FS_BASE, val: 140240388381888)
        #
      
      So, for a system wide trace session looking at the write_msr tracepoint
      we see a flood of MSR_FS_BASE, we need to get the number for that:
      
        # grep FS_BASE /tmp/build/perf/trace/beauty/generated/x86_arch_MSRs_array.c
      	[0xc0000100 - x86_64_specific_MSRs_offset] = "FS_BASE",
        #
      
      And then use it in a filter:
      
        # perf trace -e msr:* --filter="msr!=0xc0000100"
        <SNIP>
         942.177 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 3056931068232)
         942.199 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 3057135655252)
         942.203 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 3056931068222)
         942.231 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 3056998373022)
         942.241 :0/0 msr:write_msr(msr: IA32_TSC_DEADLINE, val: 3056931068236)
        <SNIP>
        #
      
      Ok, lets filter that too, too noisy:
      
        # grep TSC_DEADLINE /tmp/build/perf/trace/beauty/generated/x86_arch_MSRs_array.c
      	[0x000006E0] = "IA32_TSC_DEADLINE",
        #
      
        # perf trace -e msr:* --filter="msr!=0xc0000100 && msr!=0x6e0" -a sleep 0.1
           0.000 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
           0.066 CPU 0/KVM/4895 msr:write_msr(msr: IA32_SPEC_CTRL, val: 6)
           0.070 CPU 0/KVM/4895 msr:write_msr(msr: 0x830, val: 34359740667)
           0.099 CPU 0/KVM/4895 msr:read_msr(msr: IA32_SYSENTER_ESP, val: -2199021993472)
           0.100 CPU 0/KVM/4895 msr:read_msr(msr: IA32_APICBASE, val: 4276096000)
           0.101 CPU 0/KVM/4895 msr:read_msr(msr: IA32_DEBUGCTLMSR)
           0.109 :0/0 msr:write_msr(msr: IA32_SPEC_CTRL)
           1.000 :0/0 msr:write_msr(msr: 0x830, val: 17179871485)
          18.893 :0/0 msr:write_msr(msr: 0x83f, val: 246)
          28.810 :0/0 msr:write_msr(msr: 0x830, val: 68719479037)
          40.117 CPU 0/KVM/4895 msr:write_msr(msr: IA32_SPEC_CTRL, val: 6)
          40.127 CPU 0/KVM/4895 msr:read_msr(msr: IA32_DEBUGCTLMSR)
          40.139 CPU 0/KVM/4895 msr:write_msr(msr: LSTAR, val: -2130661312)
          40.141 CPU 0/KVM/4895 msr:write_msr(msr: SYSCALL_MASK, val: 14080)
          40.142 CPU 0/KVM/4895 msr:write_msr(msr: TSC_AUX)
          40.144 CPU 0/KVM/4895 msr:write_msr(msr: KERNEL_GS_BASE)
          40.147 CPU 0/KVM/4895 msr:write_msr(msr: IA32_SPEC_CTRL)
          40.148 CPU 0/KVM/4895 msr:write_msr(msr: IA32_FLUSH_CMD, val: 1)
          40.151 CPU 0/KVM/4895 msr:write_msr(msr: IA32_SPEC_CTRL, val: 6)
        ^C
        #
      
      One can combine that with filtering pids as well:
      
        # perf trace -e msr:* --filter="msr!=0xc0000100 && msr!=0x6e0" --filter-pids 4895 -a sleep 0.09
           0.000 :0/0 msr:write_msr(msr: 0x830, val: 4294969597)
           0.291 gnome-terminal/2790 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
           0.294 gnome-terminal/2790 msr:write_msr(msr: LSTAR, val: -1935671280)
           0.295 gnome-terminal/2790 msr:write_msr(msr: TSC_AUX, val: 6)
          10.940 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          15.943 gnome-shell/2096 msr:write_msr(msr: 0x830, val: 4294969597)
          16.975 :0/0 msr:write_msr(msr: 0x830, val: 4294969597)
          19.560 :0/0 msr:write_msr(msr: 0x83f, val: 246)
          25.162 :0/0 msr:read_msr(msr: IA32_TSC_ADJUST)
          25.807 JS Watchdog/3635 msr:write_msr(msr: IA32_SPEC_CTRL, val: 6)
          25.820 :0/0 msr:write_msr(msr: IA32_SPEC_CTRL)
          25.941 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          26.941 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          29.942 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          45.313 :0/0 msr:write_msr(msr: 0x83f, val: 246)
          56.945 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          60.946 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 4294969597)
          74.096 JS Watchdog/8971 msr:write_msr(msr: IA32_SPEC_CTRL, val: 6)
          74.130 :0/0 msr:write_msr(msr: IA32_SPEC_CTRL)
          79.673 :0/0 msr:write_msr(msr: 0x83f, val: 246)
          79.947 gnome-terminal/2790 msr:write_msr(msr: 0x830, val: 17179871485)
        #
      
      Or for just a pid, with callchains:
      
        # grep SYSCALL_MAS /tmp/build/perf/trace/beauty/generated/x86_arch_MSRs_array.c
      	[0xc0000084 - x86_64_specific_MSRs_offset] = "SYSCALL_MASK",
        # perf trace -e msr:* --filter="msr==0xc0000084" --pid 2790 --call-graph=dwarf
      
           0.000 gnome-terminal/2790 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             kvm_on_user_return ([kvm])
                                             fire_user_return_notifiers ([kernel.kallsyms])
                                             exit_to_usermode_loop ([kernel.kallsyms])
                                             do_syscall_64 ([kernel.kallsyms])
                                             entry_SYSCALL_64 ([kernel.kallsyms])
                                             __GI___poll (inlined)
        9299.073 gnome-terminal/2790 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             kvm_on_user_return ([kvm])
                                             fire_user_return_notifiers ([kernel.kallsyms])
                                             exit_to_usermode_loop ([kernel.kallsyms])
                                             do_syscall_64 ([kernel.kallsyms])
                                             entry_SYSCALL_64 ([kernel.kallsyms])
                                             __GI___poll (inlined)
        9348.374 gnome-terminal/2790 msr:write_msr(msr: SYSCALL_MASK, val: 292608)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             kvm_on_user_return ([kvm])
                                             fire_user_return_notifiers ([kernel.kallsyms])
                                             exit_to_usermode_loop ([kernel.kallsyms])
                                             do_syscall_64 ([kernel.kallsyms])
                                             entry_SYSCALL_64 ([kernel.kallsyms])
                                             __GI___poll (inlined)
        <SNIP>
        #
      
      Ok, just another form of KVM to emit MSRs :-)
      
      Next step: elliminate those greps by getting the filter expression,
      looking for arg names, then for the arrays associated with it to do a
      reverse lookup.
      
      Also allow those filters to be associated with strace-like syscall
      names.
      
      After that: augment the 'val' arg for 'msr:write_msr' based on the first
      arg, 'msr'.
      
      Then, do that with eBPF too, not just with tracepoint filters.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Marcelo Tosatti <mtosatti@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-95bfe5d4tzy5f66bx49d05rj@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      d4097f19
    • A
      perf evlist: Introduce append_tp_filter_pid() and append_tp_filter_pids() · 1827ab5b
      Arnaldo Carvalho de Melo 提交于
      We'll need this to support 'perf trace e tracepoint --filter=expr', as
      the command line tracepoint filter is attache to the preceding evsel,
      just like in 'perf record' and when we go to set pid filters, which we
      do at the minimum to filter 'perf trace' own syscalls, we need to
      append, not set the tp filter.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-daynpknni44ywuzi8iua57nn@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1827ab5b
    • A
      perf evlist: Introduce append_tp_filter() method · 53c92f73
      Arnaldo Carvalho de Melo 提交于
      Will be used by 'perf trace' to support 'perf trace --filter', we need
      to append to any pre-existing filter.
      
      When parse_filter() gets invoked to process --filter, it'll set the
      filter to that specified on the command line, later on, when we filter
      out 'perf trace' own pid to avoid an event feedback loop, we need to
      preserve the command line filter put in place by parse_filter().
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-h9rot08qmxlnfmte0holt68x@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      53c92f73
    • A
      perf evlist: Factor out asprintf routine to build a tracepoint pid filter · 05cea449
      Arnaldo Carvalho de Melo 提交于
      Will be used to append such lists to existing filters.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-798vlyqfqw938ehoe8etivx1@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      05cea449
    • A
      perf trace: Associate the "msr" tracepoint arg name with x86_MSR__scnprintf() · c330ef28
      Arnaldo Carvalho de Melo 提交于
      So that we can go from:
      
        # perf trace -e msr:write_msr --max-stack=16 sleep 1
             0.000 sleep/6740 msr:write_msr(msr: 3221225728, val: 139636317451648)
                                               do_trace_write_msr ([kernel.kallsyms])
                                               do_trace_write_msr ([kernel.kallsyms])
                                               do_arch_prctl_64 ([kernel.kallsyms])
                                               __x64_sys_arch_prctl ([kernel.kallsyms])
                                               do_syscall_64 ([kernel.kallsyms])
                                               entry_SYSCALL_64 ([kernel.kallsyms])
                                               init_tls (/usr/lib64/ld-2.29.so)
                                               dl_main (/usr/lib64/ld-2.29.so)
                                               _dl_sysdep_start (/usr/lib64/ld-2.29.so)
                                               _dl_start (/usr/lib64/ld-2.29.so)
        #
      
      To:
      
        # perf trace -e msr:write_msr --max-stack=16 sleep 1
           0.000 sleep/8519 msr:write_msr(msr: FS_BASE, val: 139878031705472)
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_trace_write_msr ([kernel.kallsyms])
                                             do_arch_prctl_64 ([kernel.kallsyms])
                                             __x64_sys_arch_prctl ([kernel.kallsyms])
                                             do_syscall_64 ([kernel.kallsyms])
                                             entry_SYSCALL_64 ([kernel.kallsyms])
                                             init_tls (/usr/lib64/ld-2.29.so)
                                             dl_main (/usr/lib64/ld-2.29.so)
                                             _dl_sysdep_start (/usr/lib64/ld-2.29.so)
                                             _dl_start (/usr/lib64/ld-2.29.so)
        #
      
      This, in reverse, will allow for symbolic system call/tracepoint
      filtering.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-q1q4unmqja5ex7dy0kb5cjaa@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      c330ef28
    • A
      perf trace beauty: Add the glue for the autogenerated MSR arrays · 646b3e2c
      Arnaldo Carvalho de Melo 提交于
      We need to wrap those autogenerated string arrays with the
      strarrays__scnprintf() formatter, do it.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-wqjz4kwi4a0ot6lsis3kc65j@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      646b3e2c
    • A
      perf trace: Allow associating scnprintf routines with well known arg names · 5d88099b
      Arnaldo Carvalho de Melo 提交于
      For instance 'msr' appears in several tracepoints, so we can associate
      it with a single scnprintf() routine auto-generated from kernel headers,
      as will be done in followup patches.
      
      Start with an empty array of associations.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-89ptht6s5fez82lykuwq1eyb@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      5d88099b
    • A
      perf beauty: Hook up the x86 MSR table generator · fd218347
      Arnaldo Carvalho de Melo 提交于
      This way we generate the source with the table for later use by plugins,
      etc.
      
      I.e. after running:
      
        $ make -C tools/perf O=/tmp/build/perf
      
      We end up with:
      
        $ head /tmp/build/perf/trace/beauty/generated/x86_arch_MSRs_array.c
        static const char *x86_MSRs[] = {
        	[0x00000000] = "IA32_P5_MC_ADDR",
        	[0x00000001] = "IA32_P5_MC_TYPE",
        	[0x00000010] = "IA32_TSC",
        	[0x00000017] = "IA32_PLATFORM_ID",
        	[0x0000001b] = "IA32_APICBASE",
        	[0x00000020] = "KNC_PERFCTR0",
        	[0x00000021] = "KNC_PERFCTR1",
        	[0x00000028] = "KNC_EVNTSEL0",
        	[0x00000029] = "KNC_EVNTSEL1",
        $
      
      Now its just a matter of using it, first in a libtracevent plugin.
      
      At some point we should move tools/perf/trace/beauty to tools/beauty/,
      so that it can be used more generally and even made available externally
      like libbpf, libperf, libtraevent, etc.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-b3rmutg4igcohx6kpo67qh4j@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      fd218347
    • A
      perf trace beauty: Add a x86 MSR cmd id->str table generator · 693d3458
      Arnaldo Carvalho de Melo 提交于
      Without parameters it'll parse tools/arch/x86/include/asm/msr-index.h
      and output a table usable by tools, that will be wired up later to a
      libtraceevent plugin registered from perf's glue code:
      
        $ tools/perf/trace/beauty/tracepoints/x86_msr.sh
        static const char *x86_MSRs[] = {
       <SNIP>
        	[0x00000034] = "SMI_COUNT",
        	[0x0000003a] = "IA32_FEATURE_CONTROL",
        	[0x0000003b] = "IA32_TSC_ADJUST",
        	[0x00000040] = "LBR_CORE_FROM",
        	[0x00000048] = "IA32_SPEC_CTRL",
        	[0x00000049] = "IA32_PRED_CMD",
       <SNIP>
        	[0x0000010b] = "IA32_FLUSH_CMD",
        	[0x0000010F] = "TSX_FORCE_ABORT",
       <SNIP>
        	[0x00000198] = "IA32_PERF_STATUS",
        	[0x00000199] = "IA32_PERF_CTL",
        <SNIP>
        	[0x00000da0] = "IA32_XSS",
        	[0x00000dc0] = "LBR_INFO_0",
        	[0x00000ffc] = "IA32_BNDCFGS_RSVD",
        };
      
        #define x86_64_specific_MSRs_offset 0xc0000080
        static const char *x86_64_specific_MSRs[] = {
        	[0xc0000080 - x86_64_specific_MSRs_offset] = "EFER",
        	[0xc0000081 - x86_64_specific_MSRs_offset] = "STAR",
        	[0xc0000082 - x86_64_specific_MSRs_offset] = "LSTAR",
        	[0xc0000083 - x86_64_specific_MSRs_offset] = "CSTAR",
        	[0xc0000084 - x86_64_specific_MSRs_offset] = "SYSCALL_MASK",
        <SNIP>
        	[0xc0000103 - x86_64_specific_MSRs_offset] = "TSC_AUX",
        	[0xc0000104 - x86_64_specific_MSRs_offset] = "AMD64_TSC_RATIO",
        };
      
        #define x86_AMD_V_KVM_MSRs_offset 0xc0010000
        static const char *x86_AMD_V_KVM_MSRs[] = {
        	[0xc0010000 - x86_AMD_V_KVM_MSRs_offset] = "K7_EVNTSEL0",
        <SNIP>
        	[0xc0010114 - x86_AMD_V_KVM_MSRs_offset] = "VM_CR",
        	[0xc0010115 - x86_AMD_V_KVM_MSRs_offset] = "VM_IGNNE",
        	[0xc0010117 - x86_AMD_V_KVM_MSRs_offset] = "VM_HSAVE_PA",
        <SNIP>
        	[0xc0010240 - x86_AMD_V_KVM_MSRs_offset] = "F15H_NB_PERF_CTL",
        	[0xc0010241 - x86_AMD_V_KVM_MSRs_offset] = "F15H_NB_PERF_CTR",
        	[0xc0010280 - x86_AMD_V_KVM_MSRs_offset] = "F15H_PTSC",
        };
      
      Then these will in turn be hooked up in a follow up patch to be used by
      strarrays__scnprintf().
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-ja080xawx08kedez855usnon@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      693d3458
    • A
      perf beauty: Make strarray's offset be u64 · 8d6505ba
      Arnaldo Carvalho de Melo 提交于
      We need it for things like MSRs that are sparse and go over MAXINT.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lkml.kernel.org/n/tip-g8t2d0jr0mg3yimg2qrjkvlt@git.kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      8d6505ba
  3. 07 10月, 2019 15 次提交