Hello community,

here is the log from the commit of package perf for openSUSE:Leap:15.2 checked 
in at 2020-03-31 07:23:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/perf (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.perf.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perf"

Tue Mar 31 07:23:48 2020 rev:52 rq:789871 version:MACRO

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/perf/perf.changes      2020-01-15 
15:39:41.867122953 +0100
+++ /work/SRC/openSUSE:Leap:15.2/.perf.new.3160/perf.changes    2020-03-31 
07:24:00.366440641 +0200
@@ -1,0 +2,79 @@
+Fri Mar 27 23:42:25 UTC 2020 - Tony Jones <[email protected]>
+
+- Add latest git-fixes
+
+  * perf bench futex-wake: Restore thread count default to online CPU
+  * perf c2c: Display proper cpu count in nodes column
+  * perf c2c: Fix report with offline cpus
+  * perf callchain: Fix segfault in thread__resolve_callchain_sample()
+  * perf diff: Use llabs() with 64-bit values
+  * perf hists browser: Restore ESC as "Zoom out" of DSO/thread/etc
+  * perf hists: Fix variable name's inconsistency in hists__for_each()
+  * perf jevents: Fix resource leak in process_mapfile() and main()
+  * perf list: Allow plurals for metric, metricgroup
+  * perf map: No need to adjust the long name of modules
+  * perf probe: Filter out instances except for inlined subroutine and
+  * perf probe: Fix to find range-only function instance
+  * perf probe: Fix to list probe event with correct line number
+  * perf probe: Fix to probe a function which has no entry pc
+  * perf probe: Fix to probe an inline function which has no entry pc
+  * perf probe: Fix to show calling lines of inlined functions
+  * perf probe: Fix to show function entry line as probe-able
+  * perf probe: Fix to show inlined function callsite without entry_pc
+  * perf probe: Fix to show ranges of variables in functions without
+  * perf probe: Fix wrong address verification
+  * perf probe: Skip end-of-sequence and non statement lines
+  * perf probe: Skip overlapped location on searching variables
+  * perf probe: Walk function lines in lexical blocks
+  * perf regs: Make perf_reg_name() return "unknown" instead of NULL
+  * perf report: Fix incorrectly added dimensions as switch perf data file
+  * perf script: Allow --time with --reltime
+  * perf script: Fix brstackinsn for AUXTRACE
+  * perf stat: Don't report a null stalled cycles per insn metric
+  * perf test: Report failure for mmap events
+  * perf tests: Fix out of bounds memory access
+  * perf ui gtk: Add missing zalloc object
+  * perf vendor events amd: Remove redundant '['
+  * perf vendor events arm64: Fix Hisi hip08 DDRC PMU eventname
+  * perf vendor events: Remove P8 HW events which are not supported
+  * perf vendor events s390: Add JSON transaction for machine type 8561
+  * perf vendor events s390: Remove name from L1D_RO_EXCL_WRITES
+
+  New patch: 
perf-bench-futex-wake-restore-thread-count-default-to-online-cpu-count.patch
+  New patch: perf-c2c-display-proper-cpu-count-in-nodes-column.patch
+  New patch: perf-c2c-fix-report-with-offline-cpus.patch
+  New patch: 
perf-callchain-fix-segfault-in-thread__resolve_callchain_sample.patch
+  New patch: perf-diff-use-llabs-with-64-bit-values.patch
+  New patch: perf-hists-browser-restore-esc-as-zoom-out-of-dso-thread-etc.patch
+  New patch: 
perf-hists-fix-variable-name-s-inconsistency-in-hists__for_each-macro.patch
+  New patch: perf-jevents-fix-resource-leak-in-process_mapfile-and-main.patch
+  New patch: perf-list-allow-plurals-for-metric-metricgroup.patch
+  New patch: perf-map-no-need-to-adjust-the-long-name-of-modules.patch
+  New patch: 
perf-probe-filter-out-instances-except-for-inlined-subroutine-and-subprogram.patch
+  New patch: perf-probe-fix-to-find-range-only-function-instance.patch
+  New patch: perf-probe-fix-to-list-probe-event-with-correct-line-number.patch
+  New patch: perf-probe-fix-to-probe-a-function-which-has-no-entry-pc.patch
+  New patch: 
perf-probe-fix-to-probe-an-inline-function-which-has-no-entry-pc.patch
+  New patch: perf-probe-fix-to-show-calling-lines-of-inlined-functions.patch
+  New patch: perf-probe-fix-to-show-function-entry-line-as-probe-able.patch
+  New patch: 
perf-probe-fix-to-show-inlined-function-callsite-without-entry_pc.patch
+  New patch: 
perf-probe-fix-to-show-ranges-of-variables-in-functions-without-entry_pc.patch
+  New patch: perf-probe-fix-wrong-address-verification.patch
+  New patch: perf-probe-skip-end-of-sequence-and-non-statement-lines.patch
+  New patch: perf-probe-skip-overlapped-location-on-searching-variables.patch
+  New patch: perf-probe-walk-function-lines-in-lexical-blocks.patch
+  New patch: perf-regs-make-perf_reg_name-return-unknown-instead-of-null.patch
+  New patch: 
perf-report-fix-incorrectly-added-dimensions-as-switch-perf-data-file.patch
+  New patch: perf-script-allow-time-with-reltime.patch
+  New patch: perf-script-fix-brstackinsn-for-auxtrace.patch
+  New patch: perf-stat-don-t-report-a-null-stalled-cycles-per-insn-metric.patch
+  New patch: perf-test-report-failure-for-mmap-events.patch
+  New patch: perf-tests-fix-out-of-bounds-memory-access.patch
+  New patch: perf-ui-gtk-add-missing-zalloc-object.patch
+  New patch: perf-vendor-events-amd-remove-redundant.patch
+  New patch: perf-vendor-events-arm64-fix-hisi-hip08-ddrc-pmu-eventname.patch
+  New patch: 
perf-vendor-events-remove-p8-hw-events-which-are-not-supported.patch
+  New patch: 
perf-vendor-events-s390-add-json-transaction-for-machine-type-8561.patch
+  New patch: 
perf-vendor-events-s390-remove-name-from-l1d_ro_excl_writes-description.patch
+
+-------------------------------------------------------------------

New:
----
  perf-bench-futex-wake-restore-thread-count-default-to-online-cpu-count.patch
  perf-c2c-display-proper-cpu-count-in-nodes-column.patch
  perf-c2c-fix-report-with-offline-cpus.patch
  perf-callchain-fix-segfault-in-thread__resolve_callchain_sample.patch
  perf-diff-use-llabs-with-64-bit-values.patch
  perf-hists-browser-restore-esc-as-zoom-out-of-dso-thread-etc.patch
  perf-hists-fix-variable-name-s-inconsistency-in-hists__for_each-macro.patch
  perf-jevents-fix-resource-leak-in-process_mapfile-and-main.patch
  perf-list-allow-plurals-for-metric-metricgroup.patch
  perf-map-no-need-to-adjust-the-long-name-of-modules.patch
  
perf-probe-filter-out-instances-except-for-inlined-subroutine-and-subprogram.patch
  perf-probe-fix-to-find-range-only-function-instance.patch
  perf-probe-fix-to-list-probe-event-with-correct-line-number.patch
  perf-probe-fix-to-probe-a-function-which-has-no-entry-pc.patch
  perf-probe-fix-to-probe-an-inline-function-which-has-no-entry-pc.patch
  perf-probe-fix-to-show-calling-lines-of-inlined-functions.patch
  perf-probe-fix-to-show-function-entry-line-as-probe-able.patch
  perf-probe-fix-to-show-inlined-function-callsite-without-entry_pc.patch
  perf-probe-fix-to-show-ranges-of-variables-in-functions-without-entry_pc.patch
  perf-probe-fix-wrong-address-verification.patch
  perf-probe-skip-end-of-sequence-and-non-statement-lines.patch
  perf-probe-skip-overlapped-location-on-searching-variables.patch
  perf-probe-walk-function-lines-in-lexical-blocks.patch
  perf-regs-make-perf_reg_name-return-unknown-instead-of-null.patch
  perf-report-fix-incorrectly-added-dimensions-as-switch-perf-data-file.patch
  perf-script-allow-time-with-reltime.patch
  perf-script-fix-brstackinsn-for-auxtrace.patch
  perf-stat-don-t-report-a-null-stalled-cycles-per-insn-metric.patch
  perf-test-report-failure-for-mmap-events.patch
  perf-tests-fix-out-of-bounds-memory-access.patch
  perf-ui-gtk-add-missing-zalloc-object.patch
  perf-vendor-events-amd-remove-redundant.patch
  perf-vendor-events-arm64-fix-hisi-hip08-ddrc-pmu-eventname.patch
  perf-vendor-events-remove-p8-hw-events-which-are-not-supported.patch
  perf-vendor-events-s390-add-json-transaction-for-machine-type-8561.patch
  perf-vendor-events-s390-remove-name-from-l1d_ro_excl_writes-description.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perf.spec ++++++
--- /var/tmp/diff_new_pack.1xRyVr/_old  2020-03-31 07:24:02.846441718 +0200
+++ /var/tmp/diff_new_pack.1xRyVr/_new  2020-03-31 07:24:02.878441732 +0200
@@ -55,11 +55,47 @@
 %{perl_requires}
 %{?libperl_requires}
 # upstream patches
-Patch1:         perf-tools-add-aux_output-attribute-flag.patch
-Patch2:         
perf-tools-add-itrace-option-o-to-synthesize-aux-output-events.patch
-Patch3:         perf-intel-pt-process-options-for-pebs-event-synthesis.patch
-Patch4:         perf-tools-add-aux-output-config-term.patch
+Patch1:         
perf-tools-add-itrace-option-o-to-synthesize-aux-output-events.patch
+Patch2:         perf-tools-add-aux-output-config-term.patch
+Patch3:         perf-tools-add-aux_output-attribute-flag.patch
+Patch4:         perf-intel-pt-process-options-for-pebs-event-synthesis.patch
 Patch5:         
perf-intel-pt-add-brief-documentation-for-pebs-via-intel-pt.patch
+Patch6:         perf-c2c-fix-report-with-offline-cpus.patch
+Patch7:         perf-c2c-display-proper-cpu-count-in-nodes-column.patch
+Patch8:         perf-vendor-events-amd-remove-redundant.patch
+Patch9:         perf-list-allow-plurals-for-metric-metricgroup.patch
+Patch10:        
perf-vendor-events-remove-p8-hw-events-which-are-not-supported.patch
+Patch11:        
perf-vendor-events-s390-add-json-transaction-for-machine-type-8561.patch
+Patch12:        perf-script-allow-time-with-reltime.patch
+Patch13:        perf-test-report-failure-for-mmap-events.patch
+Patch14:        
perf-vendor-events-arm64-fix-hisi-hip08-ddrc-pmu-eventname.patch
+Patch15:        perf-probe-fix-to-find-range-only-function-instance.patch
+Patch16:        perf-probe-walk-function-lines-in-lexical-blocks.patch
+Patch17:        perf-probe-fix-wrong-address-verification.patch
+Patch18:        
perf-probe-fix-to-show-ranges-of-variables-in-functions-without-entry_pc.patch
+Patch19:        
perf-probe-fix-to-show-inlined-function-callsite-without-entry_pc.patch
+Patch20:        perf-probe-fix-to-show-function-entry-line-as-probe-able.patch
+Patch21:        
perf-probe-fix-to-probe-an-inline-function-which-has-no-entry-pc.patch
+Patch22:        perf-probe-fix-to-probe-a-function-which-has-no-entry-pc.patch
+Patch23:        
perf-probe-fix-to-list-probe-event-with-correct-line-number.patch
+Patch24:        
perf-jevents-fix-resource-leak-in-process_mapfile-and-main.patch
+Patch25:        perf-probe-skip-end-of-sequence-and-non-statement-lines.patch
+Patch26:        
perf-probe-skip-overlapped-location-on-searching-variables.patch
+Patch27:        perf-probe-fix-to-show-calling-lines-of-inlined-functions.patch
+Patch28:        
perf-probe-filter-out-instances-except-for-inlined-subroutine-and-subprogram.patch
+Patch29:        perf-tests-fix-out-of-bounds-memory-access.patch
+Patch30:        perf-map-no-need-to-adjust-the-long-name-of-modules.patch
+Patch31:        
perf-callchain-fix-segfault-in-thread__resolve_callchain_sample.patch
+Patch32:        perf-diff-use-llabs-with-64-bit-values.patch
+Patch33:        perf-script-fix-brstackinsn-for-auxtrace.patch
+Patch34:        
perf-regs-make-perf_reg_name-return-unknown-instead-of-null.patch
+Patch35:        
perf-vendor-events-s390-remove-name-from-l1d_ro_excl_writes-description.patch
+Patch36:        
perf-report-fix-incorrectly-added-dimensions-as-switch-perf-data-file.patch
+Patch37:        
perf-hists-fix-variable-name-s-inconsistency-in-hists__for_each-macro.patch
+Patch38:        
perf-hists-browser-restore-esc-as-zoom-out-of-dso-thread-etc.patch
+Patch39:        perf-ui-gtk-add-missing-zalloc-object.patch
+Patch40:        
perf-stat-don-t-report-a-null-stalled-cycles-per-insn-metric.patch
+Patch41:        
perf-bench-futex-wake-restore-thread-count-default-to-online-cpu-count.patch
 # non upstream patches
 
 Requires:       kernel >= 2.6.31
@@ -77,11 +113,7 @@
 (cd /usr/src/linux ; tar -cf - COPYING CREDITS README tools include scripts 
Kbuild Makefile arch/*/{include,lib,Makefile} lib) | tar -xf - 
 chmod +x tools/perf/util/generate-cmdlist.sh
 
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
+%autopatch -p1
 
 # don't error out on deprecated definitions in gtk2.h
 sed -i 's@ignored "-Wstrict-prototypes"@&\n#pragma GCC diagnostic ignored 
"-Wdeprecated-declarations"@' tools/build/feature/test-gtk2.c

++++++ 
perf-bench-futex-wake-restore-thread-count-default-to-online-cpu-count.patch 
++++++
From: Tommi Rantala <[email protected]>
Date: Thu, 5 Mar 2020 10:37:13 +0200
Subject: perf bench futex-wake: Restore thread count default to online CPU
 count
Git-commit: f649bd9dd5d5004543bbc3c50b829577b49f5d75
Patch-mainline: v5.6-rc6
References: git-fixes

Since commit 3b2323c2c1c4 ("perf bench futex: Use cpumaps") the default
number of threads the benchmark uses got changed from number of online
CPUs to zero:

  $ perf bench futex wake
  # Running 'futex/wake' benchmark:
  Run summary [PID 15930]: blocking on 0 threads (at [private] futex 
0x558b8ee4bfac), waking up 1 at a time.
  [Run 1]: Wokeup 0 of 0 threads in 0.0000 ms
  [...]
  [Run 10]: Wokeup 0 of 0 threads in 0.0000 ms
  Wokeup 0 of 0 threads in 0.0004 ms (+-40.82%)

Restore the old behavior by grabbing the number of online CPUs via
cpu->nr:

  $ perf bench futex wake
  # Running 'futex/wake' benchmark:
  Run summary [PID 18356]: blocking on 8 threads (at [private] futex 0xb3e62c), 
waking up 1 at a time.
  [Run 1]: Wokeup 8 of 8 threads in 0.0260 ms
  [...]
  [Run 10]: Wokeup 8 of 8 threads in 0.0270 ms
  Wokeup 8 of 8 threads in 0.0419 ms (+-24.35%)

Fixes: 3b2323c2c1c4 ("perf bench futex: Use cpumaps")
Signed-off-by: Tommi Rantala <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Darren Hart <[email protected]>
Cc: Davidlohr Bueso <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: 
http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/bench/futex-wake.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/bench/futex-wake.c b/tools/perf/bench/futex-wake.c
index df810096abfe..58906e9499bb 100644
--- a/tools/perf/bench/futex-wake.c
+++ b/tools/perf/bench/futex-wake.c
@@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false;
 static pthread_mutex_t thread_lock;
 static pthread_cond_t thread_parent, thread_worker;
 static struct stats waketime_stats, wakeup_stats;
-static unsigned int ncpus, threads_starting, nthreads = 0;
+static unsigned int threads_starting, nthreads = 0;
 static int futex_flag = 0;
 
 static const struct option options[] = {
@@ -141,7 +141,7 @@ int bench_futex_wake(int argc, const char **argv)
        sigaction(SIGINT, &act, NULL);
 
        if (!nthreads)
-               nthreads = ncpus;
+               nthreads = cpu->nr;
 
        worker = calloc(nthreads, sizeof(*worker));
        if (!worker)

++++++ perf-c2c-display-proper-cpu-count-in-nodes-column.patch ++++++
From: Jiri Olsa <[email protected]>
Date: Tue, 20 Aug 2019 16:02:19 +0200
Subject: perf c2c: Display proper cpu count in nodes column
Git-commit: 67260e8c0e681a9bb9ed861514b4c80c2d0eb2e5
Patch-mainline: v5.4-rc1
References: git-fixes

There's wrong bitmap considered when checking for cpu count of specific
node.

We do the needed computation for 'set' variable, but at the end we use
the 'c2c_he->cpuset' weight, which shows misleading numbers.

Fixes: 1e181b92a2da ("perf c2c report: Add 'node' sort key")
Reported-by: Joe Mario <[email protected]>
Signed-off-by: Jiri Olsa <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Michael Petlan <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-c2c.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index 73782d99ee5a..8335a4076a5a 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -1107,7 +1107,7 @@ node_entry(struct perf_hpp_fmt *fmt __maybe_unused, 
struct perf_hpp *hpp,
                        break;
                case 1:
                {
-                       int num = bitmap_weight(c2c_he->cpuset, c2c.cpus_cnt);
+                       int num = bitmap_weight(set, c2c.cpus_cnt);
                        struct c2c_stats *stats = &c2c_he->node_stats[node];
 
                        ret = scnprintf(hpp->buf, hpp->size, "%2d{%2d ", node, 
num);

++++++ perf-c2c-fix-report-with-offline-cpus.patch ++++++
From: Ravi Bangoria <[email protected]>
Date: Thu, 22 Aug 2019 14:20:45 +0530
Subject: perf c2c: Fix report with offline cpus
Git-commit: 1ea770f6c1971bc101b3741f4d88b0b4ea5c4181
Patch-mainline: v5.4-rc1
References: git-fixes

If c2c is recorded on a machine where any cpus are offline, 'perf c2c
report' throws an error "node/cpu topology bugFailed setup nodes".

It fails because while preparing node-cpu mapping we don't consider
offline cpus.

Reported-by: Nageswara R Sastry <[email protected]>
Signed-off-by: Ravi Bangoria <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Fixes: 1e181b92a2da ("perf c2c report: Add 'node' sort key")
Link: 
http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-c2c.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index 01629f5b6d1f..211143720078 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -2027,7 +2027,7 @@ static int setup_nodes(struct perf_session *session)
                c2c.node_info = 2;
 
        c2c.nodes_cnt = session->header.env.nr_numa_nodes;
-       c2c.cpus_cnt  = session->header.env.nr_cpus_online;
+       c2c.cpus_cnt  = session->header.env.nr_cpus_avail;
 
        n = session->header.env.numa_nodes;
        if (!n)

++++++ perf-callchain-fix-segfault-in-thread__resolve_callchain_sample.patch 
++++++
From: Adrian Hunter <[email protected]>
Date: Thu, 14 Nov 2019 16:25:38 +0200
Subject: perf callchain: Fix segfault in thread__resolve_callchain_sample()
Git-commit: aceb98261ea7d9fe38f9c140c5531f0b13623832
Patch-mainline: v5.5-rc1
References: git-fixes

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: e9024d519d89 ("perf callchain: Honour the ordering of 
PERF_CONTEXT_{USER,KERNEL,etc}")
Signed-off-by: Adrian Hunter <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/machine.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 7d2e211e376c..71ee078d30f4 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -2385,7 +2385,7 @@ static int thread__resolve_callchain_sample(struct thread 
*thread,
        }
 
 check_calls:
-       if (callchain_param.order != ORDER_CALLEE) {
+       if (chain && callchain_param.order != ORDER_CALLEE) {
                err = find_prev_cpumode(chain, thread, cursor, parent, root_al,
                                        &cpumode, chain->nr - first_call);
                if (err)

++++++ perf-diff-use-llabs-with-64-bit-values.patch ++++++
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Wed, 27 Nov 2019 09:58:22 -0300
Subject: perf diff: Use llabs() with 64-bit values
Git-commit: 98e93245113d0f5c279ef77f4a9e7d097323ad71
Patch-mainline: v5.5-rc1
References: git-fixes

To fix these build errors on a debian mipsel cross build environment:

  builtin-diff.c: In function 'block_cycles_diff_cmp':
  builtin-diff.c:550:6: error: absolute value function 'labs' given an argument 
of type 's64' {aka 'long long int'} but has parameter of type 'long int' which 
may cause truncation of value [-Werror=absolute-value]
    550 |  l = labs(left->diff.cycles);
        |      ^~~~
  builtin-diff.c:551:6: error: absolute value function 'labs' given an argument 
of type 's64' {aka 'long long int'} but has parameter of type 'long int' which 
may cause truncation of value [-Werror=absolute-value]
    551 |  r = labs(right->diff.cycles);
        |      ^~~~

Fixes: 99150a1faab2 ("perf diff: Use hists to manage basic blocks per symbol")
Cc: Jin Yao <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: https://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-diff.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index 376dbf10ad64..eae879376283 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -547,8 +547,8 @@ static int64_t block_cycles_diff_cmp(struct hist_entry 
*left,
        if (!pairs_left && !pairs_right)
                return 0;
 
-       l = labs(left->diff.cycles);
-       r = labs(right->diff.cycles);
+       l = llabs(left->diff.cycles);
+       r = llabs(right->diff.cycles);
        return r - l;
 }
 

++++++ perf-hists-browser-restore-esc-as-zoom-out-of-dso-thread-etc.patch ++++++
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Mon, 16 Dec 2019 13:22:33 -0300
Subject: perf hists browser: Restore ESC as "Zoom out" of DSO/thread/etc
Git-commit: 3f7774033e6820d25beee5cf7aefa11d4968b951
Patch-mainline: v5.6-rc1
References: git-fixes

We need to set actions->ms.map since 599a2f38a989 ("perf hists browser:
Check sort keys before hot key actions"), as in that patch we bail out
if map is NULL.

Reviewed-by: Jiri Olsa <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: Namhyung Kim <[email protected]>
Fixes: 599a2f38a989 ("perf hists browser: Check sort keys before hot key 
actions")
Link: https://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/ui/browsers/hists.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index d4d3558fdef4..cfc6172ecab7 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -3062,6 +3062,7 @@ static int perf_evsel__hists_browse(struct evsel *evsel, 
int nr_events,
 
                                continue;
                        }
+                       actions->ms.map = map;
                        top = pstack__peek(browser->pstack);
                        if (top == &browser->hists->dso_filter) {
                                /*

++++++ 
perf-hists-fix-variable-name-s-inconsistency-in-hists__for_each-macro.patch 
++++++
From: Yuya Fujita <[email protected]>
Date: Thu, 19 Dec 2019 08:08:32 +0000
Subject: perf hists: Fix variable name's inconsistency in hists__for_each()
 macro
Git-commit: 55347ec340af401437680fd0e88df6739a967f9f
Patch-mainline: v5.5-rc7
References: git-fixes

Variable names are inconsistent in hists__for_each macro().

Due to this inconsistency, the macro replaces its second argument with
"fmt" regardless of its original name.

So far it works because only "fmt" is passed to the second argument.
However, this behavior is not expected and should be fixed.

Fixes: f0786af536bb ("perf hists: Introduce hists__for_each_format macro")
Fixes: aa6f50af822a ("perf hists: Introduce hists__for_each_sort_list macro")
Signed-off-by: Yuya Fujita <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: 
http://lore.kernel.org/lkml/osapr01mb1588e1c47ac22043175de1b2e8...@osapr01mb1588.jpnprd01.prod.outlook.com
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/hist.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 45286900aacb..0aa63aeb58ec 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -339,10 +339,10 @@ static inline void perf_hpp__prepend_sort_field(struct 
perf_hpp_fmt *format)
        list_for_each_entry_safe(format, tmp, &(_list)->sorts, sort_list)
 
 #define hists__for_each_format(hists, format) \
-       perf_hpp_list__for_each_format((hists)->hpp_list, fmt)
+       perf_hpp_list__for_each_format((hists)->hpp_list, format)
 
 #define hists__for_each_sort_list(hists, format) \
-       perf_hpp_list__for_each_sort_list((hists)->hpp_list, fmt)
+       perf_hpp_list__for_each_sort_list((hists)->hpp_list, format)
 
 extern struct perf_hpp_fmt perf_hpp__format[];
 

++++++ perf-jevents-fix-resource-leak-in-process_mapfile-and-main.patch ++++++
From: Yunfeng Ye <[email protected]>
Date: Wed, 16 Oct 2019 21:50:17 +0800
Subject: perf jevents: Fix resource leak in process_mapfile() and main()
Git-commit: 1785fbb73896dbd9d27a406f0d73047df42db710
Patch-mainline: v5.5-rc1
References: git-fixes

There are memory leaks and file descriptor resource leaks in
process_mapfile() and main().

Fix this by adding free(), fclose() and free_arch_std_events() on the
error paths.

Fixes: 80eeb67fe577 ("perf jevents: Program to convert JSON file")
Fixes: 3f056b66647b ("perf jevents: Make build fail on JSON parse error")
Fixes: e9d32c1bf0cd ("perf vendor events: Add support for arch standard events")
Signed-off-by: Yunfeng Ye <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Feilong Lin <[email protected]>
Cc: Hu Shiyuan <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: John Garry <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Luke Mujica <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Zenghui Yu <[email protected]>
Link: 
http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/pmu-events/jevents.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index 7d69727f44bd..079c77b6a2fd 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -772,6 +772,7 @@ static int process_mapfile(FILE *outfp, char *fpath)
        char *line, *p;
        int line_num;
        char *tblname;
+       int ret = 0;
 
        pr_info("%s: Processing mapfile %s\n", prog, fpath);
 
@@ -783,6 +784,7 @@ static int process_mapfile(FILE *outfp, char *fpath)
        if (!mapfp) {
                pr_info("%s: Error %s opening %s\n", prog, strerror(errno),
                                fpath);
+               free(line);
                return -1;
        }
 
@@ -809,7 +811,8 @@ static int process_mapfile(FILE *outfp, char *fpath)
                        /* TODO Deal with lines longer than 16K */
                        pr_info("%s: Mapfile %s: line %d too long, aborting\n",
                                        prog, fpath, line_num);
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
                line[strlen(line)-1] = '\0';
 
@@ -839,7 +842,9 @@ static int process_mapfile(FILE *outfp, char *fpath)
 
 out:
        print_mapping_table_suffix(outfp);
-       return 0;
+       fclose(mapfp);
+       free(line);
+       return ret;
 }
 
 /*
@@ -1136,6 +1141,7 @@ int main(int argc, char *argv[])
                goto empty_map;
        } else if (rc < 0) {
                /* Make build fail */
+               fclose(eventsfp);
                free_arch_std_events();
                return 1;
        } else if (rc) {
@@ -1148,6 +1154,7 @@ int main(int argc, char *argv[])
                goto empty_map;
        } else if (rc < 0) {
                /* Make build fail */
+               fclose(eventsfp);
                free_arch_std_events();
                return 1;
        } else if (rc) {
@@ -1165,6 +1172,8 @@ int main(int argc, char *argv[])
        if (process_mapfile(eventsfp, mapfile)) {
                pr_info("%s: Error processing mapfile %s\n", prog, mapfile);
                /* Make build fail */
+               fclose(eventsfp);
+               free_arch_std_events();
                return 1;
        }
 

++++++ perf-list-allow-plurals-for-metric-metricgroup.patch ++++++
From: Kim Phillips <[email protected]>
Date: Thu, 19 Sep 2019 15:43:05 -0500
Subject: perf list: Allow plurals for metric, metricgroup
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Git-commit: 8788d36950dae26074dc63b46eab3debb4b210b4
Patch-mainline: v5.4-rc1
References: git-fixes

Enhance usability by allowing the same plurality used in the output
title, for the command line parameter.

BEFORE, perf deceitfully acts as if there are no metrics to be had:

  $ perf list metrics

  List of pre-defined events (to be used in -e):

  Metric Groups:

  $

But singular 'metric' shows a list of metrics:

  $ perf list metric

  List of pre-defined events (to be used in -e):

  Metrics:

    IPC
         [Instructions Per Cycle (per logical thread)]
    UPI
         [Uops Per Instruction]

AFTER, when asking for 'metrics', we actually see the metrics get listed:

  $ perf list metrics

  List of pre-defined events (to be used in -e):

  Metrics:

    IPC
         [Instructions Per Cycle (per logical thread)]
    UPI
         [Uops Per Instruction]

Fixes: 71b0acce78d1 ("perf list: Add metric groups to perf list")
Signed-off-by: Kim Phillips <[email protected]>
Reviewed-by: Andi Kleen <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Janakarajan Natarajan <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Luke Mujica <[email protected]>
Cc: Martin Liška <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-list.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c
index e290f6b348d8..08e62ae9d37e 100644
--- a/tools/perf/builtin-list.c
+++ b/tools/perf/builtin-list.c
@@ -81,9 +81,9 @@ int cmd_list(int argc, const char **argv)
                                                long_desc_flag, details_flag);
                else if (strcmp(argv[i], "sdt") == 0)
                        print_sdt_events(NULL, NULL, raw_dump);
-               else if (strcmp(argv[i], "metric") == 0)
+               else if (strcmp(argv[i], "metric") == 0 || strcmp(argv[i], 
"metrics") == 0)
                        metricgroup__print(true, false, NULL, raw_dump, 
details_flag);
-               else if (strcmp(argv[i], "metricgroup") == 0)
+               else if (strcmp(argv[i], "metricgroup") == 0 || strcmp(argv[i], 
"metricgroups") == 0)
                        metricgroup__print(false, true, NULL, raw_dump, 
details_flag);
                else if ((sep = strchr(argv[i], ':')) != NULL) {
                        int sep_idx;

++++++ perf-map-no-need-to-adjust-the-long-name-of-modules.patch ++++++
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Thu, 14 Nov 2019 10:46:45 -0300
Subject: perf map: No need to adjust the long name of modules
Git-commit: f068435d9bb2d825d59e3c101bc579f09315ee01
Patch-mainline: v5.5-rc1
References: git-fixes

At some point in the past we needed to make sure we would get the long
name of modules and not just what we get from /proc/modules, but that
need, as described in the cset that introduced the adjustment function:

Fixes: c03d5184f0e9 ("perf machine: Adjust dso->long_name for offline module")

Without using the buildid-cache:

  # lsmod | grep trusted
  # insmod trusted.ko
  # lsmod | grep trusted
  trusted                24576  0
  # strace -e open,openat perf probe -m ./trusted.ko key_seal |& grep trusted
  openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 4
  openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 7
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, 
"/root/.debug/root/trusted.ko/dd3d355d567394d540f527e093e0f64b95879584/probes", 
O_RDWR|O_CREAT, 0644) = 3
  openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko.debug", O_RDONLY) = -1 
ENOENT (No such file or directory)
  openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko", O_RDONLY) = -1 ENOENT (No 
such file or directory)
  openat(AT_FDCWD, "/root/.debug/trusted.ko", O_RDONLY) = -1 ENOENT (No such 
file or directory)
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, ".debug/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such 
file or directory)
  openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 4
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
    probe:key_seal       (on key_seal in trusted)
  # perf probe -l
    probe:key_seal       (on key_seal in trusted)
  #

No attempt at opening '[trusted]'.

Now using the build-id cache:

  # rmmod trusted
  # perf buildid-cache --add ./trusted.ko
  # insmod trusted.ko
  # strace -e open,openat perf probe -m ./trusted.ko key_seal |& grep trusted
  openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 4
  openat(AT_FDCWD, "/sys/module/trusted/notes/.note.gnu.build-id", O_RDONLY) = 7
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, 
"/root/.debug/root/trusted.ko/dd3d355d567394d540f527e093e0f64b95879584/probes", 
O_RDWR|O_CREAT, 0644) = 3
  openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko.debug", O_RDONLY) = -1 
ENOENT (No such file or directory)
  openat(AT_FDCWD, "/usr/lib/debug/root/trusted.ko", O_RDONLY) = -1 ENOENT (No 
such file or directory)
  openat(AT_FDCWD, "/root/.debug/trusted.ko", O_RDONLY) = -1 ENOENT (No such 
file or directory)
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, ".debug/trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such 
file or directory)
  openat(AT_FDCWD, "trusted.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 4
  openat(AT_FDCWD, "/root/trusted.ko", O_RDONLY) = 3
  #

Again, no attempt at reading '[trusted]'.

Finally, adding a probe to that function and then using:

[root@quaco ~]# perf trace -e probe_perf:*/max-stack=16/ --max-events=2
     0.000 perf/13456 probe_perf:dso__adjust_kmod_long_name(__probe_ip: 5492263)
                                       dso__adjust_kmod_long_name 
(/home/acme/bin/perf)
                                       machine__process_kernel_mmap_event 
(/home/acme/bin/perf)
                                       machine__process_mmap_event 
(/home/acme/bin/perf)
                                       perf_event__process_mmap 
(/home/acme/bin/perf)
                                       machines__deliver_event 
(/home/acme/bin/perf)
                                       perf_session__deliver_event 
(/home/acme/bin/perf)
                                       perf_session__process_event 
(/home/acme/bin/perf)
                                       process_simple (/home/acme/bin/perf)
                                       reader__process_events 
(/home/acme/bin/perf)
                                       __perf_session__process_events 
(/home/acme/bin/perf)
                                       perf_session__process_events 
(/home/acme/bin/perf)
                                       process_buildids (/home/acme/bin/perf)
                                       record__finish_output 
(/home/acme/bin/perf)
                                       __cmd_record (/home/acme/bin/perf)
                                       cmd_record (/home/acme/bin/perf)
                                       run_builtin (/home/acme/bin/perf)
     0.055 perf/13456 probe_perf:dso__adjust_kmod_long_name(__probe_ip: 5492263)
                                       dso__adjust_kmod_long_name 
(/home/acme/bin/perf)
                                       machine__process_kernel_mmap_event 
(/home/acme/bin/perf)
                                       machine__process_mmap_event 
(/home/acme/bin/perf)
                                       perf_event__process_mmap 
(/home/acme/bin/perf)
                                       machines__deliver_event 
(/home/acme/bin/perf)
                                       perf_session__deliver_event 
(/home/acme/bin/perf)
                                       perf_session__process_event 
(/home/acme/bin/perf)
                                       process_simple (/home/acme/bin/perf)
                                       reader__process_events 
(/home/acme/bin/perf)
                                       __perf_session__process_events 
(/home/acme/bin/perf)
                                       perf_session__process_events 
(/home/acme/bin/perf)
                                       process_buildids (/home/acme/bin/perf)
                                       record__finish_output 
(/home/acme/bin/perf)
                                       __cmd_record (/home/acme/bin/perf)
                                       cmd_record (/home/acme/bin/perf)
                                       run_builtin (/home/acme/bin/perf)
  #

This was the only path I could find using the perf tools that reach at this
function, then as of november/2019, if we put a probe in the line where the
actuall setting of the dso->long_name is done:

  # perf trace -e probe_perf:*
  ^C[root@quaco ~]
  # perf stat -e probe_perf:*  -I 2000
       2.000404265                  0      probe_perf:dso__adjust_kmod_long_name
       4.001142200                  0      probe_perf:dso__adjust_kmod_long_name
       6.001704120                  0      probe_perf:dso__adjust_kmod_long_name
       8.002398316                  0      probe_perf:dso__adjust_kmod_long_name
      10.002984010                  0      probe_perf:dso__adjust_kmod_long_name
      12.003597851                  0      probe_perf:dso__adjust_kmod_long_name
      14.004113303                  0      probe_perf:dso__adjust_kmod_long_name
      16.004582773                  0      probe_perf:dso__adjust_kmod_long_name
      18.005176373                  0      probe_perf:dso__adjust_kmod_long_name
      20.005801605                  0      probe_perf:dso__adjust_kmod_long_name
      22.006467540                  0      probe_perf:dso__adjust_kmod_long_name
  ^C    23.683261941                  0      
probe_perf:dso__adjust_kmod_long_name

  #

Its not being used at all.

To further test this I used kvm.ko as the offline module, i.e. removed
if from the buildid-cache by nuking it completely (rm -rf ~/.debug) and
moved it from the normal kernel distro path, removed the modules, stoped
the kvm guest, and then installed it manually, etc.

  # rmmod kvm-intel
  # rmmod kvm
  # lsmod | grep kvm
  # modprobe kvm-intel
  modprobe: ERROR: ctx=0x55d3b1722260 
path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No 
such file or directory
  modprobe: ERROR: ctx=0x55d3b1722260 
path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No 
such file or directory
  modprobe: ERROR: could not insert 'kvm_intel': Unknown symbol in module, or 
unknown parameter (see dmesg)
  # insmod ./kvm.ko
  # modprobe kvm-intel
  modprobe: ERROR: ctx=0x562f34026260 
path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No 
such file or directory
  modprobe: ERROR: ctx=0x562f34026260 
path=/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm/kvm.ko.xz error=No 
such file or directory
  # lsmod | grep kvm
  kvm_intel             299008  0
  kvm                   765952  1 kvm_intel
  irqbypass              16384  1 kvm
  #
  # perf probe -x ~/bin/perf machine__findnew_module_map:12 mname=m.name:string 
filename=filename:string 'dso_long_name=map->dso->long_name:string' 
'dso_name=map->dso->name:string'
  # perf probe -l
    probe_perf:machine__findnew_module_map (on 
machine__findnew_module_map:12@util/machine.c in /home/acme/bin/perf with mname 
filename dso_long_name dso_name)
  # perf record
  ^C[ perf record: Woken up 2 times to write data ]
  [ perf record: Captured and wrote 3.416 MB perf.data (33956 samples) ]
  # perf trace -e probe_perf:machine*
  <SNIP>
       6.322 perf/23099 probe_perf:machine__findnew_module_map(__probe_ip: 
5492493, mname: "[salsa20_generic]", filename: 
"/lib/modules/5.3.8-200.fc30.x86_64/kernel/crypto/salsa20_generic.ko.xz", 
dso_long_name: 
"/lib/modules/5.3.8-200.fc30.x86_64/kernel/crypto/salsa20_generic.ko.xz", 
dso_name: "[salsa20_generic]")
       6.375 perf/23099 probe_perf:machine__findnew_module_map(__probe_ip: 
5492493, mname: "[kvm]", filename: "[kvm]", dso_long_name: "[kvm]", dso_name: 
"[kvm]")
  <SNIP>

The filename doesn't come with the path, no point in trying to set the 
dso->long_name.

  [root@quaco ~]# strace -e open,openat perf probe -m ./kvm.ko 
kvm_apic_local_deliver |& egrep 'open.*kvm'
  openat(AT_FDCWD, "/sys/module/kvm_intel/notes/.note.gnu.build-id", O_RDONLY) 
= 4
  openat(AT_FDCWD, "/sys/module/kvm/notes/.note.gnu.build-id", O_RDONLY) = 4
  openat(AT_FDCWD, "/lib/modules/5.3.8-200.fc30.x86_64/kernel/arch/x86/kvm", 
O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 7
  openat(AT_FDCWD, "/sys/module/kvm_intel/notes/.note.gnu.build-id", O_RDONLY) 
= 8
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
  openat(AT_FDCWD, 
"/root/.debug/root/kvm.ko/5955f426cb93f03f30f3e876814be2db80ab0b55/probes", 
O_RDWR|O_CREAT, 0644) = 3
  openat(AT_FDCWD, "/usr/lib/debug/root/kvm.ko.debug", O_RDONLY) = -1 ENOENT 
(No such file or directory)
  openat(AT_FDCWD, "/usr/lib/debug/root/kvm.ko", O_RDONLY) = -1 ENOENT (No such 
file or directory)
  openat(AT_FDCWD, "/root/.debug/kvm.ko", O_RDONLY) = -1 ENOENT (No such file 
or directory)
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, ".debug/kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file 
or directory)
  openat(AT_FDCWD, "kvm.ko.debug", O_RDONLY) = -1 ENOENT (No such file or 
directory)
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 4
  openat(AT_FDCWD, "/root/kvm.ko", O_RDONLY) = 3
  [root@quaco ~]#

Cc: Adrian Hunter <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Wang Nan <[email protected]>
Link: https://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/machine.c | 27 +--------------------------
 1 file changed, 1 insertion(+), 26 deletions(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 6a0f5c25ce3e..6804c8247782 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -772,24 +772,6 @@ int machine__process_ksymbol(struct machine *machine 
__maybe_unused,
        return machine__process_ksymbol_register(machine, event, sample);
 }
 
-static void dso__adjust_kmod_long_name(struct dso *dso, const char *filename)
-{
-       const char *dup_filename;
-
-       if (!filename || !dso || !dso->long_name)
-               return;
-       if (dso->long_name[0] != '[')
-               return;
-       if (!strchr(filename, '/'))
-               return;
-
-       dup_filename = strdup(filename);
-       if (!dup_filename)
-               return;
-
-       dso__set_long_name(dso, dup_filename, true);
-}
-
 struct map *machine__findnew_module_map(struct machine *machine, u64 start,
                                        const char *filename)
 {
@@ -801,15 +783,8 @@ struct map *machine__findnew_module_map(struct machine 
*machine, u64 start,
                return NULL;
 
        map = map_groups__find_by_name(&machine->kmaps, m.name);
-       if (map) {
-               /*
-                * If the map's dso is an offline module, give dso__load()
-                * a chance to find the file path of that module by fixing
-                * long_name.
-                */
-               dso__adjust_kmod_long_name(map->dso, filename);
+       if (map)
                goto out;
-       }
 
        dso = machine__findnew_module_dso(machine, &m, filename);
        if (dso == NULL)

++++++ 
perf-probe-filter-out-instances-except-for-inlined-subroutine-and-subprogram.patch
 ++++++
From: Masami Hiramatsu <[email protected]>
Date: Wed, 30 Oct 2019 16:09:30 +0900
Subject: perf probe: Filter out instances except for inlined subroutine and
 subprogram
Git-commit: da6cb952a89efe24bb76c4971370d485737a2d85
Patch-mainline: v5.5-rc1
References: git-fixes

Filter out instances except for inlined_subroutine and subprogram DIE in
die_walk_instances() and die_is_func_instance().

This fixes an issue that perf probe sets some probes on calling address
instead of a target function itself.

When perf probe walks on instances of an abstruct origin (a kind of
function prototype of inlined function), die_walk_instances() can also
pass a GNU_call_site (a GNU extension for call site) to callback. Since
it is not an inlined instance of target function, we have to filter out
when searching a probe point.

Without this patch, perf probe sets probes on call site address too.This
can happen on some function which is marked "inlined", but has actual
symbol. (I'm not sure why GCC mark it "inlined"):

  # perf probe -D vfs_read
  p:probe/vfs_read _text+2500017
  p:probe/vfs_read_1 _text+2499468
  p:probe/vfs_read_2 _text+2499563
  p:probe/vfs_read_3 _text+2498876
  p:probe/vfs_read_4 _text+2498512
  p:probe/vfs_read_5 _text+2498627

With this patch:

Slightly different results, similar tho:

  # perf probe -D vfs_read
  p:probe/vfs_read _text+2498512

Committer testing:

  # 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

Before:

  # perf probe -D vfs_read
  p:probe/vfs_read _text+3131557
  p:probe/vfs_read_1 _text+3130975
  p:probe/vfs_read_2 _text+3131047
  p:probe/vfs_read_3 _text+3130380
  p:probe/vfs_read_4 _text+3130000
  # 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
  #

After:

  # perf probe -D vfs_read
  p:probe/vfs_read _text+3130000
  #

Fixes: db0d2c6420ee ("perf probe: Search concrete out-of-line instances")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157241937063.32002.11024544873990816590.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index f31001d13bfb..ac1289043204 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -334,18 +334,22 @@ int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)
  * @dw_die: a DIE
  *
  * Ensure that this DIE is an instance (which has an entry address).
- * This returns true if @dw_die is a function instance. If not, you need to
- * call die_walk_instances() to find actual instances.
+ * This returns true if @dw_die is a function instance. If not, the @dw_die
+ * must be a prototype. You can use die_walk_instances() to find actual
+ * instances.
  **/
 bool die_is_func_instance(Dwarf_Die *dw_die)
 {
        Dwarf_Addr tmp;
        Dwarf_Attribute attr_mem;
+       int tag = dwarf_tag(dw_die);
 
-       /* Actually gcc optimizes non-inline as like as inlined */
-       return !dwarf_func_inline(dw_die) &&
-              (dwarf_entrypc(dw_die, &tmp) == 0 ||
-               dwarf_attr(dw_die, DW_AT_ranges, &attr_mem) != NULL);
+       if (tag != DW_TAG_subprogram &&
+           tag != DW_TAG_inlined_subroutine)
+               return false;
+
+       return dwarf_entrypc(dw_die, &tmp) == 0 ||
+               dwarf_attr(dw_die, DW_AT_ranges, &attr_mem) != NULL;
 }
 
 /**
@@ -624,6 +628,9 @@ static int __die_walk_instances_cb(Dwarf_Die *inst, void 
*data)
        Dwarf_Die *origin;
        int tmp;
 
+       if (!die_is_func_instance(inst))
+               return DIE_FIND_CB_CONTINUE;
+
        attr = dwarf_attr(inst, DW_AT_abstract_origin, &attr_mem);
        if (attr == NULL)
                return DIE_FIND_CB_CONTINUE;

++++++ perf-probe-fix-to-find-range-only-function-instance.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Thu, 24 Oct 2019 18:12:36 +0900
Subject: perf probe: Fix to find range-only function instance
Git-commit: b77afa1f810f37bd8a36cb1318178dfe2d7af6b6
Patch-mainline: v5.5-rc1
References: git-fixes

Fix die_is_func_instance() to find range-only function instance.

In some case, a function instance can be made without any low PC or
entry PC, but only with address ranges by optimization.  (e.g. cold text
partially in "text.unlikely" section) To find such function instance, we
have to check the range attribute too.

Fixes: e1ecbbc3fa83 ("perf probe: Fix to handle optimized not-inlined 
functions")
Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157190835669.1859.8368628035930950596.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index df6cee5c071f..2ec24c3bed44 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -318,10 +318,14 @@ bool die_is_func_def(Dwarf_Die *dw_die)
 bool die_is_func_instance(Dwarf_Die *dw_die)
 {
        Dwarf_Addr tmp;
+       Dwarf_Attribute attr_mem;
 
        /* Actually gcc optimizes non-inline as like as inlined */
-       return !dwarf_func_inline(dw_die) && dwarf_entrypc(dw_die, &tmp) == 0;
+       return !dwarf_func_inline(dw_die) &&
+              (dwarf_entrypc(dw_die, &tmp) == 0 ||
+               dwarf_attr(dw_die, DW_AT_ranges, &attr_mem) != NULL);
 }
+
 /**
  * die_get_data_member_location - Get the data-member offset
  * @mb_die: a DIE of a member of a data structure

++++++ perf-probe-fix-to-list-probe-event-with-correct-line-number.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:46:52 +0900
Subject: perf probe: Fix to list probe event with correct line number
Git-commit: 3895534dd78f0fd4d3f9e05ee52b9cdd444a743e
Patch-mainline: v5.5-rc1
References: git-fixes

Since debuginfo__find_probe_point() uses dwarf_entrypc() for finding the
entry address of the function on which a probe is, it will fail when the
function DIE has only ranges attribute.

To fix this issue, use die_entrypc() instead of dwarf_entrypc().

Without this fix, perf probe -l shows incorrect offset:

  # perf probe -l
    probe:clear_tasks_mm_cpumask (on 
clear_tasks_mm_cpumask+18446744071579263632@work/linux/linux/kernel/cpu.c)
    probe:clear_tasks_mm_cpumask_1 (on 
clear_tasks_mm_cpumask+18446744071579263752@work/linux/linux/kernel/cpu.c)

With this:

  # perf probe -l
    probe:clear_tasks_mm_cpumask (on 
clear_tasks_mm_cpumask@work/linux/linux/kernel/cpu.c)
    probe:clear_tasks_mm_cpumask_1 (on 
clear_tasks_mm_cpumask:21@work/linux/linux/kernel/cpu.c)

Committer testing:

Before:

  [root@quaco ~]# perf probe -l
    probe:clear_tasks_mm_cpumask (on 
clear_tasks_mm_cpumask+18446744071579765152@kernel/cpu.c)
  [root@quaco ~]#

After:

  [root@quaco ~]# perf probe -l
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
  [root@quaco ~]#

Fixes: 1d46ea2a6a40 ("perf probe: Fix listing incorrect line number with inline 
function")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199321227.8075.14655572419136993015.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/probe-finder.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 2fa932bcf960..88e17a4f5ac3 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1566,7 +1566,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, 
unsigned long addr,
                /* Get function entry information */
                func = basefunc = dwarf_diename(&spdie);
                if (!func ||
-                   dwarf_entrypc(&spdie, &baseaddr) != 0 ||
+                   die_entrypc(&spdie, &baseaddr) != 0 ||
                    dwarf_decl_line(&spdie, &baseline) != 0) {
                        lineno = 0;
                        goto post;
@@ -1583,7 +1583,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, 
unsigned long addr,
                while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr,
                                                &indie)) {
                        /* There is an inline function */
-                       if (dwarf_entrypc(&indie, &_addr) == 0 &&
+                       if (die_entrypc(&indie, &_addr) == 0 &&
                            _addr == addr) {
                                /*
                                 * addr is at an inline function entry.

++++++ perf-probe-fix-to-probe-a-function-which-has-no-entry-pc.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:46:34 +0900
Subject: perf probe: Fix to probe a function which has no entry pc
Git-commit: 5d16dbcc311d91267ddb45c6da4f187be320ecee
Patch-mainline: v5.5-rc1
References: git-fixes

Fix 'perf probe' to probe a function which has no entry pc or low pc but
only has ranges attribute.

probe_point_search_cb() uses dwarf_entrypc() to get the probe address,
but that doesn't work for the function DIE which has only ranges
attribute. Use die_entrypc() instead.

Without this fix:

  # perf probe -k ../build-x86_64/vmlinux -D clear_tasks_mm_cpumask:0
  Probe point 'clear_tasks_mm_cpumask' not found.
    Error: Failed to add events.

With this:

  # perf probe -k ../build-x86_64/vmlinux -D clear_tasks_mm_cpumask:0
  p:probe/clear_tasks_mm_cpumask clear_tasks_mm_cpumask+0

Committer testing:

Before:

  [root@quaco ~]# perf probe clear_tasks_mm_cpumask:0
  Probe point 'clear_tasks_mm_cpumask' not found.
    Error: Failed to add events.
  [root@quaco ~]#

After:

  [root@quaco ~]# perf probe clear_tasks_mm_cpumask:0
  Added new event:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1

  [root@quaco ~]#

Using it with 'perf trace':

  [root@quaco ~]# perf trace -e probe:clear_tasks_mm_cpumask

Doesn't seem to be used in x86_64:

  $ find . -name "*.c" | xargs grep clear_tasks_mm_cpumask
  ./kernel/cpu.c: * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for 
a CPU
  ./kernel/cpu.c:void clear_tasks_mm_cpumask(int cpu)
  ./arch/xtensa/kernel/smp.c:   clear_tasks_mm_cpumask(cpu);
  ./arch/csky/kernel/smp.c:     clear_tasks_mm_cpumask(cpu);
  ./arch/sh/kernel/smp.c:       clear_tasks_mm_cpumask(cpu);
  ./arch/arm/kernel/smp.c:      clear_tasks_mm_cpumask(cpu);
  ./arch/powerpc/mm/nohash/mmu_context.c:       clear_tasks_mm_cpumask(cpu);
  $ find . -name "*.h" | xargs grep clear_tasks_mm_cpumask
  ./include/linux/cpu.h:void clear_tasks_mm_cpumask(int cpu);
  $ find . -name "*.S" | xargs grep clear_tasks_mm_cpumask
  $

Fixes: e1ecbbc3fa83 ("perf probe: Fix to handle optimized not-inlined 
functions")
Reported-by: Arnaldo Carvalho de Melo <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199319438.8075.4695576954550638618.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/probe-finder.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 2b6513e5725c..71633f55f045 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -982,7 +982,7 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void 
*data)
                param->retval = find_probe_point_by_line(pf);
        } else if (die_is_func_instance(sp_die)) {
                /* Instances always have the entry address */
-               dwarf_entrypc(sp_die, &pf->addr);
+               die_entrypc(sp_die, &pf->addr);
                /* But in some case the entry address is 0 */
                if (pf->addr == 0) {
                        pr_debug("%s has no entry PC. Skipped\n",

++++++ perf-probe-fix-to-probe-an-inline-function-which-has-no-entry-pc.patch 
++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:46:43 +0900
Subject: perf probe: Fix to probe an inline function which has no entry pc
Git-commit: eb6933b29d20bf2c3053883d409a53f462c1a3ac
Patch-mainline: v5.5-rc1
References: git-fixes

Fix perf probe to probe an inlne function which has no entry pc
or low pc but only has ranges attribute.

This seems very rare case, but I could find a few examples, as
same as probe_point_search_cb(), use die_entrypc() to get the
entry address in probe_point_inline_cb() too.

Without this patch:

  # perf probe -D __amd_put_nb_event_constraints
  Failed to get entry address of __amd_put_nb_event_constraints.
  Probe point '__amd_put_nb_event_constraints' not found.
    Error: Failed to add events.

With this patch:

  # perf probe -D __amd_put_nb_event_constraints
  p:probe/__amd_put_nb_event_constraints amd_put_event_constraints+43

Committer testing:

Before:

  [root@quaco ~]# perf probe -D __amd_put_nb_event_constraints
  Failed to get entry address of __amd_put_nb_event_constraints.
  Probe point '__amd_put_nb_event_constraints' not found.
    Error: Failed to add events.
  [root@quaco ~]#

After:

  [root@quaco ~]# perf probe -D __amd_put_nb_event_constraints
  p:probe/__amd_put_nb_event_constraints _text+33789
  [root@quaco ~]#

Fixes: 4ea42b181434 ("perf: Add perf probe subcommand, a kprobe-event setup 
helper")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199320336.8075.16189530425277588587.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/probe-finder.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 71633f55f045..2fa932bcf960 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -930,7 +930,7 @@ static int probe_point_inline_cb(Dwarf_Die *in_die, void 
*data)
                ret = find_probe_point_lazy(in_die, pf);
        else {
                /* Get probe address */
-               if (dwarf_entrypc(in_die, &addr) != 0) {
+               if (die_entrypc(in_die, &addr) != 0) {
                        pr_warning("Failed to get entry address of %s.\n",
                                   dwarf_diename(in_die));
                        return -ENOENT;

++++++ perf-probe-fix-to-show-calling-lines-of-inlined-functions.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Wed, 30 Oct 2019 16:09:40 +0900
Subject: perf probe: Fix to show calling lines of inlined functions
Git-commit: 86c0bf8539e7f46d91bd105e55eda96e0064caef
Patch-mainline: v5.5-rc1
References: git-fixes

Fix to show calling lines of inlined functions (where an inline function
is called).

die_walk_lines() filtered out the lines inside inlined functions based
on the address. However this also filtered out the lines which call
those inlined functions from the target function.

To solve this issue, check the call_file and call_line attributes and do
not filter out if it matches to the line information.

Without this fix, perf probe -L doesn't show some lines correctly.
(don't see the lines after 17)

  # perf probe -L vfs_read
  <vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
        0  ssize_t vfs_read(struct file *file, char __user *buf, size_t count, 
loff_t *pos)
        1  {
        2         ssize_t ret;

        4         if (!(file->f_mode & FMODE_READ))
                          return -EBADF;
        6         if (!(file->f_mode & FMODE_CAN_READ))
                          return -EINVAL;
        8         if (unlikely(!access_ok(buf, count)))
                          return -EFAULT;

       11         ret = rw_verify_area(READ, file, pos, count);
       12         if (!ret) {
       13                 if (count > MAX_RW_COUNT)
                                  count =  MAX_RW_COUNT;
       15                 ret = __vfs_read(file, buf, count, pos);
       16                 if (ret > 0) {
                                  fsnotify_access(file);
                                  add_rchar(current, ret);
                          }

With this fix:

  # perf probe -L vfs_read
  <vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
        0  ssize_t vfs_read(struct file *file, char __user *buf, size_t count, 
loff_t *pos)
        1  {
        2         ssize_t ret;

        4         if (!(file->f_mode & FMODE_READ))
                          return -EBADF;
        6         if (!(file->f_mode & FMODE_CAN_READ))
                          return -EINVAL;
        8         if (unlikely(!access_ok(buf, count)))
                          return -EFAULT;

       11         ret = rw_verify_area(READ, file, pos, count);
       12         if (!ret) {
       13                 if (count > MAX_RW_COUNT)
                                  count =  MAX_RW_COUNT;
       15                 ret = __vfs_read(file, buf, count, pos);
       16                 if (ret > 0) {
       17                         fsnotify_access(file);
       18                         add_rchar(current, ret);
                          }
       20                 inc_syscr(current);
                  }

Fixes: 4cc9cec636e7 ("perf probe: Introduce lines walker interface")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157241937995.32002.17899884017011512577.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index ac1289043204..5544bfbd0f6c 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -784,7 +784,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t 
callback, void *data)
        Dwarf_Lines *lines;
        Dwarf_Line *line;
        Dwarf_Addr addr;
-       const char *fname, *decf = NULL;
+       const char *fname, *decf = NULL, *inf = NULL;
        int lineno, ret = 0;
        int decl = 0, inl;
        Dwarf_Die die_mem, *cu_die;
@@ -835,13 +835,21 @@ int die_walk_lines(Dwarf_Die *rt_die, 
line_walk_callback_t callback, void *data)
                         */
                        if (!dwarf_haspc(rt_die, addr))
                                continue;
+
                        if (die_find_inlinefunc(rt_die, addr, &die_mem)) {
+                               /* Call-site check */
+                               inf = die_get_call_file(&die_mem);
+                               if ((inf && !strcmp(inf, decf)) &&
+                                   die_get_call_lineno(&die_mem) == lineno)
+                                       goto found;
+
                                dwarf_decl_line(&die_mem, &inl);
                                if (inl != decl ||
                                    decf != dwarf_decl_file(&die_mem))
                                        continue;
                        }
                }
+found:
                /* Get source line */
                fname = dwarf_linesrc(line, NULL, NULL);
 

++++++ perf-probe-fix-to-show-function-entry-line-as-probe-able.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Thu, 24 Oct 2019 18:12:54 +0900
Subject: perf probe: Fix to show function entry line as probe-able
Git-commit: 91e2f539eeda26ab00bd03fae8dc434c128c85ed
Patch-mainline: v5.5-rc1
References: git-fixes

Fix die_walk_lines() to list the function entry line correctly.  Since
the dwarf_entrypc() does not return the entry pc if the DIE has only
range attribute, __die_walk_funclines() fails to list the declaration
line (entry line) in that case.

To solve this issue, this introduces die_entrypc() which correctly
returns the entry PC (the first address range) even if the DIE has only
range attribute. With this fix die_walk_lines() shows the function entry
line is able to probe correctly.

Fixes: 4cc9cec636e7 ("perf probe: Introduce lines walker interface")
Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157190837419.1859.4619125803596816752.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 24 +++++++++++++++++++++++-
 tools/perf/util/dwarf-aux.h |  3 +++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index 929b7c0567f4..063f71da6b63 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -307,6 +307,28 @@ bool die_is_func_def(Dwarf_Die *dw_die)
                dwarf_attr(dw_die, DW_AT_declaration, &attr) == NULL);
 }
 
+/**
+ * die_entrypc - Returns entry PC (the lowest address) of a DIE
+ * @dw_die: a DIE
+ * @addr: where to store entry PC
+ *
+ * Since dwarf_entrypc() does not return entry PC if the DIE has only address
+ * range, we have to use this to retrieve the lowest address from the address
+ * range attribute.
+ */
+int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)
+{
+       Dwarf_Addr base, end;
+
+       if (!addr)
+               return -EINVAL;
+
+       if (dwarf_entrypc(dw_die, addr) == 0)
+               return 0;
+
+       return dwarf_ranges(dw_die, 0, &base, addr, &end) < 0 ? -ENOENT : 0;
+}
+
 /**
  * die_is_func_instance - Ensure that this DIE is an instance of a subprogram
  * @dw_die: a DIE
@@ -713,7 +735,7 @@ static int __die_walk_funclines(Dwarf_Die *sp_die, bool 
recursive,
        /* Handle function declaration line */
        fname = dwarf_decl_file(sp_die);
        if (fname && dwarf_decl_line(sp_die, &lineno) == 0 &&
-           dwarf_entrypc(sp_die, &addr) == 0) {
+           die_entrypc(sp_die, &addr) == 0) {
                lw.retval = callback(fname, lineno, addr, data);
                if (lw.retval != 0)
                        goto done;
diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h
index f204e5892403..506006e0cf66 100644
--- a/tools/perf/util/dwarf-aux.h
+++ b/tools/perf/util/dwarf-aux.h
@@ -29,6 +29,9 @@ int cu_walk_functions_at(Dwarf_Die *cu_die, Dwarf_Addr addr,
 /* Get DW_AT_linkage_name (should be NULL for C binary) */
 const char *die_get_linkage_name(Dwarf_Die *dw_die);
 
+/* Get the lowest PC in DIE (including range list) */
+int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr);
+
 /* Ensure that this DIE is a subprogram and definition (not declaration) */
 bool die_is_func_def(Dwarf_Die *dw_die);
 

++++++ perf-probe-fix-to-show-inlined-function-callsite-without-entry_pc.patch 
++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:47:01 +0900
Subject: perf probe: Fix to show inlined function callsite without entry_pc
Git-commit: 18e21eb671dc87a4f0546ba505a89ea93598a634
Patch-mainline: v5.5-rc1
References: git-fixes

Fix 'perf probe --line' option to show inlined function callsite lines
even if the function DIE has only ranges.

Without this:

  # perf probe -L amd_put_event_constraints
  ...
      2  {
      3         if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
                        __amd_put_nb_event_constraints(cpuc, event);
      5  }

With this patch:

  # perf probe -L amd_put_event_constraints
  ...
      2  {
      3         if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
      4                 __amd_put_nb_event_constraints(cpuc, event);
      5  }

Committer testing:

Before:

  [root@quaco ~]# perf probe -L amd_put_event_constraints
  
<amd_put_event_constraints@/usr/src/debug/kernel-5.2.fc30/linux-5.2.18-200.fc30.x86_64/arch/x86/events/amd/core.c:0>
        0  static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
                                                struct perf_event *event)
        2  {
        3         if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
                          __amd_put_nb_event_constraints(cpuc, event);
        5  }

           PMU_FORMAT_ATTR(event, "config:0-7,32-35");
           PMU_FORMAT_ATTR(umask, "config:8-15"   );

  [root@quaco ~]#

After:

  [root@quaco ~]# perf probe -L amd_put_event_constraints
  
<amd_put_event_constraints@/usr/src/debug/kernel-5.2.fc30/linux-5.2.18-200.fc30.x86_64/arch/x86/events/amd/core.c:0>
        0  static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
                                                struct perf_event *event)
        2  {
        3         if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
        4                 __amd_put_nb_event_constraints(cpuc, event);
        5  }

           PMU_FORMAT_ATTR(event, "config:0-7,32-35");
           PMU_FORMAT_ATTR(umask, "config:8-15"   );

  [root@quaco ~]# perf probe amd_put_event_constraints:4
  Added new event:
    probe:amd_put_event_constraints (on amd_put_event_constraints:4)

  You can now use it in all perf tools, such as:

        perf record -e probe:amd_put_event_constraints -aR sleep 1

  [root@quaco ~]#

  [root@quaco ~]# perf probe -l
    probe:amd_put_event_constraints (on 
amd_put_event_constraints:4@arch/x86/events/amd/core.c)
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
  [root@quaco ~]#

Using it:

  [root@quaco ~]# perf trace -e probe:*
  ^C[root@quaco ~]#

Ok, Intel system here... :-)

Fixes: 4cc9cec636e7 ("perf probe: Introduce lines walker interface")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199322107.8075.12659099000567865708.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index 063f71da6b63..e0c507d6b3b4 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -695,7 +695,7 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void 
*data)
        if (dwarf_tag(in_die) == DW_TAG_inlined_subroutine) {
                fname = die_get_call_file(in_die);
                lineno = die_get_call_lineno(in_die);
-               if (fname && lineno > 0 && dwarf_entrypc(in_die, &addr) == 0) {
+               if (fname && lineno > 0 && die_entrypc(in_die, &addr) == 0) {
                        lw->retval = lw->callback(fname, lineno, addr, 
lw->data);
                        if (lw->retval != 0)
                                return DIE_FIND_CB_END;

++++++ 
perf-probe-fix-to-show-ranges-of-variables-in-functions-without-entry_pc.patch 
++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:47:10 +0900
Subject: perf probe: Fix to show ranges of variables in functions without
 entry_pc
Git-commit: af04dd2f8ebaa8fbd46f698714acbf43da14da45
Patch-mainline: v5.5-rc1
References: git-fixes

Fix to show ranges of variables (--range and --vars option) in functions
which DIE has only ranges but no entry_pc attribute.

Without this fix:

  # perf probe --range -V clear_tasks_mm_cpumask
  Available variables at clear_tasks_mm_cpumask
        @<clear_tasks_mm_cpumask+0>
                (No matched variables)

With this fix:

  # perf probe --range -V clear_tasks_mm_cpumask
  Available variables at clear_tasks_mm_cpumask
        @<clear_tasks_mm_cpumask+0>
                [VAL]   int     cpu     
@<clear_tasks_mm_cpumask+[0-35,317-317,2052-2059]>

Committer testing:

Before:

  [root@quaco ~]# perf probe --range -V clear_tasks_mm_cpumask
  Available variables at clear_tasks_mm_cpumask
          @<clear_tasks_mm_cpumask+0>
                  (No matched variables)
  [root@quaco ~]#

After:

  [root@quaco ~]# perf probe --range -V clear_tasks_mm_cpumask
  Available variables at clear_tasks_mm_cpumask
          @<clear_tasks_mm_cpumask+0>
                  [VAL]   int     cpu     
@<clear_tasks_mm_cpumask+[0-23,23-105,105-106,106-106,1843-1850,1850-1862]>
  [root@quaco ~]#

Using it:

  [root@quaco ~]# perf probe clear_tasks_mm_cpumask cpu
  Added new event:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask with cpu)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1

  [root@quaco ~]# perf probe -l
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c with 
cpu)
  [root@quaco ~]#
  [root@quaco ~]# perf trace -e probe:*cpumask
  ^C[root@quaco ~]#

Fixes: 349e8d261131 ("perf probe: Add --range option to show a variable's 
location range")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199323018.8075.8179744380479673672.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index e0c507d6b3b4..ac82fd937e4b 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -1019,7 +1019,7 @@ static int die_get_var_innermost_scope(Dwarf_Die *sp_die, 
Dwarf_Die *vr_die,
        bool first = true;
        const char *name;
 
-       ret = dwarf_entrypc(sp_die, &entry);
+       ret = die_entrypc(sp_die, &entry);
        if (ret)
                return ret;
 
@@ -1082,7 +1082,7 @@ int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die 
*vr_die, struct strbuf *buf)
        bool first = true;
        const char *name;
 
-       ret = dwarf_entrypc(sp_die, &entry);
+       ret = die_entrypc(sp_die, &entry);
        if (ret)
                return ret;
 

++++++ perf-probe-fix-wrong-address-verification.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Fri, 25 Oct 2019 17:46:25 +0900
Subject: perf probe: Fix wrong address verification
Git-commit: 07d369857808b7e8e471bbbbb0074a6718f89b31
Patch-mainline: v5.5-rc1
References: git-fixes

Since there are some DIE which has only ranges instead of the
combination of entrypc/highpc, address verification must use
dwarf_haspc() instead of dwarf_entrypc/dwarf_highpc.

Also, the ranges only DIE will have a partial code in different section
(e.g. unlikely code will be in text.unlikely as "FUNC.cold" symbol). In
that case, we can not use dwarf_entrypc() or die_entrypc(), because the
offset from original DIE can be a minus value.

Instead, this simply gets the symbol and offset from symtab.

Without this patch;

  # perf probe -D clear_tasks_mm_cpumask:1
  Failed to get entry address of clear_tasks_mm_cpumask
    Error: Failed to add events.

And with this patch:

  # perf probe -D clear_tasks_mm_cpumask:1
  p:probe/clear_tasks_mm_cpumask clear_tasks_mm_cpumask+0
  p:probe/clear_tasks_mm_cpumask_1 clear_tasks_mm_cpumask+5
  p:probe/clear_tasks_mm_cpumask_2 clear_tasks_mm_cpumask+8
  p:probe/clear_tasks_mm_cpumask_3 clear_tasks_mm_cpumask+16
  p:probe/clear_tasks_mm_cpumask_4 clear_tasks_mm_cpumask+82

Committer testing:

I managed to reproduce the above:

  [root@quaco ~]# perf probe -D clear_tasks_mm_cpumask:1
  p:probe/clear_tasks_mm_cpumask _text+919968
  p:probe/clear_tasks_mm_cpumask_1 _text+919973
  p:probe/clear_tasks_mm_cpumask_2 _text+919976
  [root@quaco ~]#

But then when trying to actually put the probe in place, it fails if I
use :0 as the offset:

  [root@quaco ~]# perf probe -L clear_tasks_mm_cpumask | head -5
  
<clear_tasks_mm_cpumask@/usr/src/debug/kernel-5.2.fc30/linux-5.2.18-200.fc30.x86_64/kernel/cpu.c:0>
        0  void clear_tasks_mm_cpumask(int cpu)
        1  {
        2       struct task_struct *p;

  [root@quaco ~]# perf probe clear_tasks_mm_cpumask:0
  Probe point 'clear_tasks_mm_cpumask' not found.
    Error: Failed to add events.
  [root@quaco

The next patch is needed to fix this case.

Fixes: 576b523721b7 ("perf probe: Fix probing symbols with optimization suffix")
Reported-by: Arnaldo Carvalho de Melo <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157199318513.8075.10463906803299647907.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/probe-finder.c | 32 ++++++++++----------------------
 1 file changed, 10 insertions(+), 22 deletions(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index cd9f95e5044e..2b6513e5725c 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -604,38 +604,26 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, 
Dwfl_Module *mod,
                                  const char *function,
                                  struct probe_trace_point *tp)
 {
-       Dwarf_Addr eaddr, highaddr;
+       Dwarf_Addr eaddr;
        GElf_Sym sym;
        const char *symbol;
 
        /* Verify the address is correct */
-       if (dwarf_entrypc(sp_die, &eaddr) != 0) {
-               pr_warning("Failed to get entry address of %s\n",
-                          dwarf_diename(sp_die));
-               return -ENOENT;
-       }
-       if (dwarf_highpc(sp_die, &highaddr) != 0) {
-               pr_warning("Failed to get end address of %s\n",
-                          dwarf_diename(sp_die));
-               return -ENOENT;
-       }
-       if (paddr > highaddr) {
-               pr_warning("Offset specified is greater than size of %s\n",
+       if (!dwarf_haspc(sp_die, paddr)) {
+               pr_warning("Specified offset is out of %s\n",
                           dwarf_diename(sp_die));
                return -EINVAL;
        }
 
-       symbol = dwarf_diename(sp_die);
+       /* Try to get actual symbol name from symtab */
+       symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
        if (!symbol) {
-               /* Try to get the symbol name from symtab */
-               symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
-               if (!symbol) {
-                       pr_warning("Failed to find symbol at 0x%lx\n",
-                                  (unsigned long)paddr);
-                       return -ENOENT;
-               }
-               eaddr = sym.st_value;
+               pr_warning("Failed to find symbol at 0x%lx\n",
+                          (unsigned long)paddr);
+               return -ENOENT;
        }
+       eaddr = sym.st_value;
+
        tp->offset = (unsigned long)(paddr - eaddr);
        tp->address = (unsigned long)paddr;
        tp->symbol = strdup(symbol);

++++++ perf-probe-skip-end-of-sequence-and-non-statement-lines.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Wed, 30 Oct 2019 16:09:21 +0900
Subject: perf probe: Skip end-of-sequence and non statement lines
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Git-commit: f4d99bdfd124823a81878b44b5e8750b97f73902
Patch-mainline: v5.5-rc1
References: git-fixes

Skip end-of-sequence and non-statement lines while walking through lines
list.

The "end-of-sequence" line information means:

 "the current address is that of the first byte after the
  end of a sequence of target machine instructions."
 (DWARF version 4 spec 6.2.2)

This actually means out of scope and we can not probe on it.

On the other hand, the statement lines (is_stmt) means:

 "the current instruction is a recommended breakpoint location.
  A recommended breakpoint location is intended to “represent”
  a line, a statement and/or a semantically distinct subpart
  of a statement."

 (DWARF version 4 spec 6.2.2)

So, non-statement line info also should be skipped.

These can reduce unneeded probe points and also avoid an error.

E.g. without this patch:

  # perf probe -a "clear_tasks_mm_cpumask:1"
  Added new events:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_2 (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_3 (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_4 (on clear_tasks_mm_cpumask:1)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask_4 -aR sleep 1

  #

This puts 5 probes on one line, but acutally it's not inlined function.
This is because there are many non statement instructions at the
function prologue.

With this patch:

  # perf probe -a "clear_tasks_mm_cpumask:1"
  Added new event:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1

  #

Now perf-probe skips unneeded addresses.

Committer testing:

Slightly different results, but similar:

Before:

  # 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
  #
  # perf probe -a "clear_tasks_mm_cpumask:1"
  Added new events:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:1)
    probe:clear_tasks_mm_cpumask_2 (on clear_tasks_mm_cpumask:1)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask_2 -aR sleep 1

  #

After:

  # perf probe -a "clear_tasks_mm_cpumask:1"
  Added new event:
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)

  You can now use it in all perf tools, such as:

        perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1

  # perf probe -l
    probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
  #

Fixes: 4cc9cec636e7 ("perf probe: Introduce lines walker interface")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157241936090.32002.12156347518596111660.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index ac82fd937e4b..f31001d13bfb 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -782,6 +782,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t 
callback, void *data)
        int decl = 0, inl;
        Dwarf_Die die_mem, *cu_die;
        size_t nlines, i;
+       bool flag;
 
        /* Get the CU die */
        if (dwarf_tag(rt_die) != DW_TAG_compile_unit) {
@@ -812,6 +813,12 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t 
callback, void *data)
                                  "Possible error in debuginfo.\n");
                        continue;
                }
+               /* Skip end-of-sequence */
+               if (dwarf_lineendsequence(line, &flag) != 0 || flag)
+                       continue;
+               /* Skip Non statement line-info */
+               if (dwarf_linebeginstatement(line, &flag) != 0 || !flag)
+                       continue;
                /* Filter lines based on address */
                if (rt_die != cu_die) {
                        /*

++++++ perf-probe-skip-overlapped-location-on-searching-variables.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Wed, 30 Oct 2019 16:09:49 +0900
Subject: perf probe: Skip overlapped location on searching variables
Git-commit: dee36a2abb67c175265d49b9a8c7dfa564463d9a
Patch-mainline: v5.5-rc1
References: git-fixes

Since debuginfo__find_probes() callback function can be called with  the
location which already passed, the callback function must filter out
such overlapped locations.

add_probe_trace_event() has already done it by commit 1a375ae7659a
("perf probe: Skip same probe address for a given line"), but
add_available_vars() doesn't. Thus perf probe -v shows same address
repeatedly as below:

  # perf probe -V vfs_read:18
  Available variables at vfs_read:18
          @<vfs_read+217>
                  char*   buf
                  loff_t* pos
                  ssize_t ret
                  struct file*    file
          @<vfs_read+217>
                  char*   buf
                  loff_t* pos
                  ssize_t ret
                  struct file*    file
          @<vfs_read+226>
                  char*   buf
                  loff_t* pos
                  ssize_t ret
                  struct file*    file

With this fix, perf probe -V shows it correctly:

  # perf probe -V vfs_read:18
  Available variables at vfs_read:18
          @<vfs_read+217>
                  char*   buf
                  loff_t* pos
                  ssize_t ret
                  struct file*    file
          @<vfs_read+226>
                  char*   buf
                  loff_t* pos
                  ssize_t ret
                  struct file*    file

Fixes: cf6eb489e5c0 ("perf probe: Show accessible local variables")
Signed-off-by: Masami Hiramatsu <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157241938927.32002.4026859017790562751.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/probe-finder.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 582f8c34d93a..9ecea45da4ca 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1428,6 +1428,18 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void 
*data)
        return DIE_FIND_CB_END;
 }
 
+static bool available_var_finder_overlap(struct available_var_finder *af)
+{
+       int i;
+
+       for (i = 0; i < af->nvls; i++) {
+               if (af->pf.addr == af->vls[i].point.address)
+                       return true;
+       }
+       return false;
+
+}
+
 /* Add a found vars into available variables list */
 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
 {
@@ -1438,6 +1450,14 @@ static int add_available_vars(Dwarf_Die *sc_die, struct 
probe_finder *pf)
        Dwarf_Die die_mem;
        int ret;
 
+       /*
+        * For some reason (e.g. different column assigned to same address),
+        * this callback can be called with the address which already passed.
+        * Ignore it first.
+        */
+       if (available_var_finder_overlap(af))
+               return 0;
+
        /* Check number of tevs */
        if (af->nvls == af->max_vls) {
                pr_warning("Too many( > %d) probe point found.\n", af->max_vls);

++++++ perf-probe-walk-function-lines-in-lexical-blocks.patch ++++++
From: Masami Hiramatsu <[email protected]>
Date: Thu, 24 Oct 2019 18:12:45 +0900
Subject: perf probe: Walk function lines in lexical blocks
Git-commit: acb6a7047ac2146b723fef69ee1ab6b7143546bf
Patch-mainline: v5.5-rc1
References: git-fixes

Since some inlined functions are in lexical blocks of given function, we
have to recursively walk through the DIE tree.  Without this fix,
perf-probe -L can miss the inlined functions which is in a lexical block
(like if (..) { func() } case.)

However, even though, to walk the lines in a given function, we don't
need to follow the children DIE of inlined functions because those do
not have any lines in the specified function.

We need to walk though whole trees only if we walk all lines in a given
file, because an inlined function can include another inlined function
in the same file.

Fixes: b0e9cb2802d4 ("perf probe: Fix to search nested inlined functions in CU")
Signed-off-by: Masami Hiramatsu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lore.kernel.org/lkml/157190836514.1859.15996864849678136353.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/dwarf-aux.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
index 2ec24c3bed44..929b7c0567f4 100644
--- a/tools/perf/util/dwarf-aux.c
+++ b/tools/perf/util/dwarf-aux.c
@@ -678,10 +678,9 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void 
*data)
                        if (lw->retval != 0)
                                return DIE_FIND_CB_END;
                }
+               if (!lw->recursive)
+                       return DIE_FIND_CB_SIBLING;
        }
-       if (!lw->recursive)
-               /* Don't need to search recursively */
-               return DIE_FIND_CB_SIBLING;
 
        if (addr) {
                fname = dwarf_decl_file(in_die);
@@ -728,6 +727,10 @@ static int __die_walk_culines_cb(Dwarf_Die *sp_die, void 
*data)
 {
        struct __line_walk_param *lw = data;
 
+       /*
+        * Since inlined function can include another inlined function in
+        * the same file, we need to walk in it recursively.
+        */
        lw->retval = __die_walk_funclines(sp_die, true, lw->callback, lw->data);
        if (lw->retval != 0)
                return DWARF_CB_ABORT;
@@ -817,8 +820,9 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t 
callback, void *data)
         */
        if (rt_die != cu_die)
                /*
-                * Don't need walk functions recursively, because nested
-                * inlined functions don't have lines of the specified DIE.
+                * Don't need walk inlined functions recursively, because
+                * inner inlined functions don't have the lines of the
+                * specified function.
                 */
                ret = __die_walk_funclines(rt_die, false, callback, data);
        else {

++++++ perf-regs-make-perf_reg_name-return-unknown-instead-of-null.patch ++++++
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Wed, 27 Nov 2019 10:13:34 -0300
Subject: perf regs: Make perf_reg_name() return "unknown" instead of NULL
Git-commit: 5b596e0ff0e1852197d4c82d3314db5e43126bf7
Patch-mainline: v5.5-rc1
References: git-fixes

To avoid breaking the build on arches where this is not wired up, at
least all the other features should be made available and when using
this specific routine, the "unknown" should point the user/developer to
the need to wire this up on this particular hardware architecture.

Detected in a container mipsel debian cross build environment, where it
shows up as:

  In file included from /usr/mipsel-linux-gnu/include/stdio.h:867,
                   from /git/linux/tools/perf/lib/include/perf/cpumap.h:6,
                   from util/session.c:13:
  In function 'printf',
      inlined from 'regs_dump__printf' at util/session.c:1103:3,
      inlined from 'regs__printf' at util/session.c:1131:2:
  /usr/mipsel-linux-gnu/include/bits/stdio2.h:107:10: error: '%-5s' directive 
argument is null [-Werror=format-overflow=]
    107 |   return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack 
());
        |          
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

cross compiler details:

  mipsel-linux-gnu-gcc (Debian 9.2.1-8) 9.2.1 20190909

Also on mips64:

  In file included from /usr/mips64-linux-gnuabi64/include/stdio.h:867,
                   from /git/linux/tools/perf/lib/include/perf/cpumap.h:6,
                   from util/session.c:13:
  In function 'printf',
      inlined from 'regs_dump__printf' at util/session.c:1103:3,
      inlined from 'regs__printf' at util/session.c:1131:2,
      inlined from 'regs_user__printf' at util/session.c:1139:3,
      inlined from 'dump_sample' at util/session.c:1246:3,
      inlined from 'machines__deliver_event' at util/session.c:1421:3:
  /usr/mips64-linux-gnuabi64/include/bits/stdio2.h:107:10: error: '%-5s' 
directive argument is null [-Werror=format-overflow=]
    107 |   return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack 
());
        |          
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  In function 'printf',
      inlined from 'regs_dump__printf' at util/session.c:1103:3,
      inlined from 'regs__printf' at util/session.c:1131:2,
      inlined from 'regs_intr__printf' at util/session.c:1147:3,
      inlined from 'dump_sample' at util/session.c:1249:3,
      inlined from 'machines__deliver_event' at util/session.c:1421:3:
  /usr/mips64-linux-gnuabi64/include/bits/stdio2.h:107:10: error: '%-5s' 
directive argument is null [-Werror=format-overflow=]
    107 |   return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack 
());
        |          
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

cross compiler details:

  mips64-linux-gnuabi64-gcc (Debian 9.2.1-8) 9.2.1 20190909

Fixes: 2bcd355b71da ("perf tools: Add interface to arch registers sets")
Cc: Adrian Hunter <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: https://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/perf_regs.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/perf_regs.h b/tools/perf/util/perf_regs.h
index e014c2c038f4..a45499126184 100644
--- a/tools/perf/util/perf_regs.h
+++ b/tools/perf/util/perf_regs.h
@@ -41,7 +41,7 @@ int perf_reg_value(u64 *valp, struct regs_dump *regs, int id);
 
 static inline const char *perf_reg_name(int id __maybe_unused)
 {
-       return NULL;
+       return "unknown";
 }
 
 static inline int perf_reg_value(u64 *valp __maybe_unused,

++++++ 
perf-report-fix-incorrectly-added-dimensions-as-switch-perf-data-file.patch 
++++++
From: Jin Yao <[email protected]>
Date: Fri, 20 Dec 2019 09:37:19 +0800
Subject: perf report: Fix incorrectly added dimensions as switch perf data file
Git-commit: 0feba17bd7ee3b7e03d141f119049dcc23efa94e
Patch-mainline: v5.5-rc7
References: git-fixes

We observed an issue that was some extra columns displayed after switching
perf data file in browser. The steps to reproduce:

1. perf record -a -e cycles,instructions -- sleep 3
2. perf report --group
3. In browser, we use hotkey 's' to switch to another perf.data
4. Now in browser, the extra columns 'Self' and 'Children' are displayed.

The issue is setup_sorting() executed again after repeat path, so dimensions
are added again.

This patch checks the last key returned from __cmd_report(). If it's
K_SWITCH_INPUT_DATA, skips the setup_sorting().

Fixes: ad0de0971b7f ("perf report: Enable the runtime switching of perf data 
file")
Signed-off-by: Jin Yao <[email protected]>
Tested-by: Arnaldo Carvalho de Melo <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Feng Tang <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-report.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 387311c67264..de988589d99b 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -1076,6 +1076,7 @@ int cmd_report(int argc, const char **argv)
        struct stat st;
        bool has_br_stack = false;
        int branch_mode = -1;
+       int last_key = 0;
        bool branch_call_mode = false;
 #define CALLCHAIN_DEFAULT_OPT  "graph,0.5,caller,function,percent"
        static const char report_callchain_help[] = "Display call graph (stack 
chain/backtrace):\n\n"
@@ -1450,7 +1451,8 @@ int cmd_report(int argc, const char **argv)
                sort_order = sort_tmp;
        }
 
-       if (setup_sorting(session->evlist) < 0) {
+       if ((last_key != K_SWITCH_INPUT_DATA) &&
+           (setup_sorting(session->evlist) < 0)) {
                if (sort_order)
                        parse_options_usage(report_usage, options, "s", 1);
                if (field_order)
@@ -1530,6 +1532,7 @@ int cmd_report(int argc, const char **argv)
        ret = __cmd_report(&report);
        if (ret == K_SWITCH_INPUT_DATA) {
                perf_session__delete(session);
+               last_key = K_SWITCH_INPUT_DATA;
                goto repeat;
        } else
                ret = 0;

++++++ perf-script-allow-time-with-reltime.patch ++++++
From: Andi Kleen <[email protected]>
Date: Wed, 2 Oct 2019 09:46:42 -0700
Subject: perf script: Allow --time with --reltime
Git-commit: 3714437d3fcc7956cabcb0077f2a506b61160a56
Patch-mainline: v5.5-rc1
References: git-fixes

The original --reltime patch forbid --time with --reltime.

But it turns out --time doesn't really care about --reltime, because the
relative time is only used at final output, while the time filtering
always works earlier on absolute time.

So just remove the check and allow combining the two options.

Fixes: 90b10f47c0ee ("perf script: Support relative time")
Signed-off-by: Andi Kleen <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-script.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 67be8d31afab..1c797a948ada 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -3605,11 +3605,6 @@ int cmd_script(int argc, const char **argv)
                }
        }
 
-       if (script.time_str && reltime) {
-               fprintf(stderr, "Don't combine --reltime with --time\n");
-               return -1;
-       }
-
        if (itrace_synth_opts.callchain &&
            itrace_synth_opts.callchain_sz > scripting_max_stack)
                scripting_max_stack = itrace_synth_opts.callchain_sz;

++++++ perf-script-fix-brstackinsn-for-auxtrace.patch ++++++
From: Adrian Hunter <[email protected]>
Date: Wed, 27 Nov 2019 11:53:21 +0200
Subject: perf script: Fix brstackinsn for AUXTRACE
Git-commit: 0cd032d3b5fcebf5454315400ab310746a81ca53
Patch-mainline: v5.5-rc1
References: git-fixes

brstackinsn must be allowed to be set by the user when AUX area data has
been captured because, in that case, the branch stack might be
synthesized on the fly. This fixes the following error:

Before:

  $ perf record -e 
'{intel_pt//,cpu/mem_inst_retired.all_loads,aux-sample-size=8192/pp}:u' grep 
-rqs jhgjhg /boot
  [ perf record: Woken up 19 times to write data ]
  [ perf record: Captured and wrote 2.274 MB perf.data ]
  $ perf script -F +brstackinsn --xed --itrace=i1usl100 | head
  Display of branch stack assembler requested, but non all-branch filter set
  Hint: run 'perf record -b ...'

After:

  $ perf record -e 
'{intel_pt//,cpu/mem_inst_retired.all_loads,aux-sample-size=8192/pp}:u' grep 
-rqs jhgjhg /boot
  [ perf record: Woken up 19 times to write data ]
  [ perf record: Captured and wrote 2.274 MB perf.data ]
  $ perf script -F +brstackinsn --xed --itrace=i1usl100 | head
            grep 13759 [002]  8091.310257:       1862                           
             instructions:uH:      5641d58069eb bmexec+0x86b (/bin/grep)
        bmexec+2485:
        00005641d5806b35                        jnz 0x5641d5806bd0              
# MISPRED
        00005641d5806bd0                        movzxb  (%r13,%rdx,1), %eax
        00005641d5806bd6                        add %rdi, %rax
        00005641d5806bd9                        movzxb  -0x1(%rax), %edx
        00005641d5806bdd                        cmp %rax, %r14
        00005641d5806be0                        jnb 0x5641d58069c0              
# MISPRED
        mismatch of LBR data and executable
        00005641d58069c0                        movzxb  (%r13,%rdx,1), %edi

Fixes: 48d02a1d5c13 ("perf script: Add 'brstackinsn' for branch stacks")
Reported-by: Andi Kleen <[email protected]>
Signed-off-by: Adrian Hunter <[email protected]>
Cc: Jiri Olsa <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/builtin-script.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 7b2f0922050c..e8db26b9b29e 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -448,7 +448,7 @@ static int perf_evsel__check_attr(struct evsel *evsel,
                       "selected. Hence, no address to lookup the source line 
number.\n");
                return -EINVAL;
        }
-       if (PRINT_FIELD(BRSTACKINSN) &&
+       if (PRINT_FIELD(BRSTACKINSN) && !allow_user_set &&
            !(perf_evlist__combined_branch_type(session->evlist) &
              PERF_SAMPLE_BRANCH_ANY)) {
                pr_err("Display of branch stack assembler requested, but non 
all-branch filter set\n"

++++++ perf-stat-don-t-report-a-null-stalled-cycles-per-insn-metric.patch ++++++
From: Kim Phillips <[email protected]>
Date: Fri, 7 Feb 2020 17:06:11 -0600
Subject: perf stat: Don't report a null stalled cycles per insn metric
Git-commit: 80cc7bb6c104d733bff60ddda09f19139c61507c
Patch-mainline: v5.6-rc2
References: git-fixes

For data collected on machines with front end stalled cycles supported,
such as found on modern AMD CPU families, commit 146540fb545b ("perf
stat: Always separate stalled cycles per insn") introduces a new line in
CSV output with a leading comma that upsets some automated scripts.
Scripts have to use "-e ex_ret_instr" to work around this issue, after
upgrading to a version of perf with that commit.

We could add "if (have_frontend_stalled && !config->csv_sep)" to the not
(total && avg) else clause, to emphasize that CSV users are usually
scripts, and are written to do only what is needed, i.e., they wouldn't
typically invoke "perf stat" without specifying an explicit event list.

But - let alone CSV output - why should users now tolerate a constant
0-reporting extra line in regular terminal output?:

BEFORE:

$ sudo perf stat --all-cpus -einstructions,cycles -- sleep 1

 Performance counter stats for 'system wide':

       181,110,981      instructions              #    0.58  insn per cycle
                                                  #    0.00  stalled cycles per 
insn
       309,876,469      cycles

       1.002202582 seconds time elapsed

The user would not like to see the now permanent:

  "0.00  stalled cycles per insn"

line fixture, as it gives no useful information.

So this patch removes the printing of the zeroed stalled cycles line
altogether, almost reverting the very original commit fb4605ba47e7
("perf stat: Check for frontend stalled for metrics"), which seems like
it was written to normalize --metric-only column output of common Intel
machines at the time: modern Intel machines have ceased to support the
genericised frontend stalled metrics AFAICT.

AFTER:

$ sudo perf stat --all-cpus -einstructions,cycles -- sleep 1

 Performance counter stats for 'system wide':

       244,071,432      instructions              #    0.69  insn per cycle
       355,353,490      cycles

       1.001862516 seconds time elapsed

Output behaviour when stalled cycles is indeed measured is not affected
(BEFORE == AFTER):

$ sudo perf stat --all-cpus -einstructions,cycles,stalled-cycles-frontend -- 
sleep 1

 Performance counter stats for 'system wide':

       247,227,799      instructions              #    0.63  insn per cycle
                                                  #    0.26  stalled cycles per 
insn
       394,745,636      cycles
        63,194,485      stalled-cycles-frontend   #   16.01% frontend cycles 
idle

       1.002079770 seconds time elapsed

Fixes: 146540fb545b ("perf stat: Always separate stalled cycles per insn")
Signed-off-by: Kim Phillips <[email protected]>
Acked-by: Andi Kleen <[email protected]>
Acked-by: Jiri Olsa <[email protected]>
Acked-by: Song Liu <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Cong Wang <[email protected]>
Cc: Davidlohr Bueso <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/util/stat-shadow.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
index 2c41d47f6f83..90d23cc3c8d4 100644
--- a/tools/perf/util/stat-shadow.c
+++ b/tools/perf/util/stat-shadow.c
@@ -18,7 +18,6 @@
  * AGGR_NONE: Use matching CPU
  * AGGR_THREAD: Not supported?
  */
-static bool have_frontend_stalled;
 
 struct runtime_stat rt_stat;
 struct stats walltime_nsecs_stats;
@@ -144,7 +143,6 @@ void runtime_stat__exit(struct runtime_stat *st)
 
 void perf_stat__init_shadow_stats(void)
 {
-       have_frontend_stalled = pmu_have_event("cpu", 
"stalled-cycles-frontend");
        runtime_stat__init(&rt_stat);
 }
 
@@ -853,10 +851,6 @@ void perf_stat__print_shadow_stats(struct perf_stat_config 
*config,
                        print_metric(config, ctxp, NULL, "%7.2f ",
                                        "stalled cycles per insn",
                                        ratio);
-               } else if (have_frontend_stalled) {
-                       out->new_line(config, ctxp);
-                       print_metric(config, ctxp, NULL, "%7.2f ",
-                                    "stalled cycles per insn", 0);
                }
        } else if (perf_evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES)) {
                if (runtime_stat_n(st, STAT_BRANCHES, ctx, cpu) != 0)

++++++ perf-test-report-failure-for-mmap-events.patch ++++++
From: Leo Yan <[email protected]>
Date: Fri, 11 Oct 2019 17:19:41 +0800
Subject: perf test: Report failure for mmap events
Git-commit: 6add129c5d9210ada25217abc130df0b7096ee02
Patch-mainline: v5.5-rc1
References: git-fixes
X-Info: adjust for context, no 9521b5f2d9d3

When fail to mmap events in task exit case, it misses to set 'err' to
-1; thus the testing will not report failure for it.

This patch sets 'err' to -1 when fails to mmap events, thus Perf tool
can report correct result.

Fixes: d723a55096b8 ("perf test: Add test case for checking number of EXIT 
events")
Signed-off-by: Leo Yan <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/tests/task-exit.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c
index 4965f8b9055b..19fa7cb429fd 100644
--- a/tools/perf/tests/task-exit.c
+++ b/tools/perf/tests/task-exit.c
@@ -111,6 +111,7 @@ int test__task_exit(struct test *test __maybe_unused, int 
subtest __maybe_unused
        if (perf_evlist__mmap(evlist, 128) < 0) {
                pr_debug("failed to mmap events: %d (%s)\n", errno,
                         str_error_r(errno, sbuf, sizeof(sbuf)));
+               err = -1;
                goto out_delete_evlist;
        }
 

++++++ perf-tests-fix-out-of-bounds-memory-access.patch ++++++
From: Leo Yan <[email protected]>
Date: Thu, 7 Nov 2019 10:02:44 +0800
Subject: perf tests: Fix out of bounds memory access
Git-commit: af8490eb2b33684e26a0a927a9d93ae43cd08890
Patch-mainline: v5.5-rc1
References: git-fixes
X-Info: adjust for context, no 474ddc4c4602

The test case 'Read backward ring buffer' failed on 32-bit architectures
which were found by LKFT perf testing.  The test failed on arm32 x15
device, qemu_arm32, qemu_i386, and found intermittent failure on i386;
the failure log is as below:

  50: Read backward ring buffer                  :
  --- start ---
  test child forked, pid 510
  Using CPUID GenuineIntel-6-9E-9
  mmap size 1052672B
  mmap size 8192B
  Finished reading overwrite ring buffer: rewind
  free(): invalid next size (fast)
  test child interrupted
  ---- end ----
  Read backward ring buffer: FAILED!

The log hints there have issue for memory usage, thus free() reports
error 'invalid next size' and directly exit for the case.  Finally, this
issue is root caused as out of bounds memory access for the data array
'evsel->id'.

The backward ring buffer test invokes do_test() twice.  'evsel->id' is
allocated at the first call with the flow:

  test__backward_ring_buffer()
    `-> do_test()
          `-> evlist__mmap()
                `-> evlist__mmap_ex()
                      `-> perf_evsel__alloc_id()

So 'evsel->id' is allocated with one item, and it will be used in
function perf_evlist__id_add():

   evsel->id[0] = id
   evsel->ids   = 1

At the second call for do_test(), it skips to initialize 'evsel->id'
and reuses the array which is allocated in the first call.  But
'evsel->ids' contains the stale value.  Thus:

   evsel->id[1] = id    -> out of bound access
   evsel->ids   = 2

To fix this issue, we will use evlist__open() and evlist__close() pair
functions to prepare and cleanup context for evlist; so 'evsel->id' and
'evsel->ids' can be initialized properly when invoke do_test() and avoid
the out of bounds memory access.

Fixes: ee74701ed8ad ("perf tests: Add test to check backward ring buffer")
Signed-off-by: Leo Yan <[email protected]>
Reviewed-by: Jiri Olsa <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Naresh Kamboju <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Wang Nan <[email protected]>
Cc: [email protected] # v4.10+
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/tests/backward-ring-buffer.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tools/perf/tests/backward-ring-buffer.c 
b/tools/perf/tests/backward-ring-buffer.c
index a4cd30c0beb3..15cea518f5ad 100644
--- a/tools/perf/tests/backward-ring-buffer.c
+++ b/tools/perf/tests/backward-ring-buffer.c
@@ -148,6 +148,15 @@ int test__backward_ring_buffer(struct test *test 
__maybe_unused, int subtest __m
                goto out_delete_evlist;
        }
 
+       perf_evlist__close(evlist);
+
+       err = perf_evlist__open(evlist);
+       if (err < 0) {
+               pr_debug("perf_evlist__open: %s\n",
+                        str_error_r(errno, sbuf, sizeof(sbuf)));
+               goto out_delete_evlist;
+       }
+
        err = do_test(evlist, 1, &sample_count, &comm_count);
        if (err != TEST_OK)
                goto out_delete_evlist;

++++++ perf-ui-gtk-add-missing-zalloc-object.patch ++++++
From: Jiri Olsa <[email protected]>
Date: Mon, 13 Jan 2020 11:43:57 +0100
Subject: perf ui gtk: Add missing zalloc object
Git-commit: 604e2139a1026793b8c2172bd92c7e9d039a5cf0
Patch-mainline: v5.6-rc1
References: git-fixes

When we moved zalloc.o to the library we missed gtk library which needs
it compiled in, otherwise the missing __zfree symbol will cause the
library to fail to load.

Adding the zalloc object to the gtk library build.

Fixes: 7f7c536f23e6 ("tools lib: Adopt zalloc()/zfree() from tools/perf")
Signed-off-by: Jiri Olsa <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jelle van der Waa <[email protected]>
Cc: Michael Petlan <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/ui/gtk/Build | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/tools/perf/ui/gtk/Build b/tools/perf/ui/gtk/Build
index ec22e899a224..9b5d5cbb7af7 100644
--- a/tools/perf/ui/gtk/Build
+++ b/tools/perf/ui/gtk/Build
@@ -7,3 +7,8 @@ gtk-y += util.o
 gtk-y += helpline.o
 gtk-y += progress.o
 gtk-y += annotate.o
+gtk-y += zalloc.o
+
+$(OUTPUT)ui/gtk/zalloc.o: ../lib/zalloc.c FORCE
+       $(call rule_mkdir)
+       $(call if_changed_dep,cc_o_c)

++++++ perf-vendor-events-amd-remove-redundant.patch ++++++
From: Kim Phillips <[email protected]>
Date: Thu, 19 Sep 2019 15:43:03 -0500
Subject: perf vendor events amd: Remove redundant '['
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Git-commit: 0c03d3aa255b5d3a7b64051a79f6e9f487194a9f
Patch-mainline: v5.4-rc1
References: git-fixes

Remove the redundant '['.

'perf list' output before:

  ex_ret_brn
       [[Retired Branch Instructions]

'perf list' output after:

  ex_ret_brn
       [Retired Branch Instructions]

Fixes: 98c07a8f74f8 ("perf vendor events amd: perf PMU events for AMD Family 
17h")
Signed-off-by: Kim Phillips <[email protected]>
Reviewed-by: Andi Kleen <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Janakarajan Natarajan <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Luke Mujica <[email protected]>
Cc: Martin Liška <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/pmu-events/arch/x86/amdfam17h/core.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/pmu-events/arch/x86/amdfam17h/core.json 
b/tools/perf/pmu-events/arch/x86/amdfam17h/core.json
index 7b285b0a7f35..1079544eeed5 100644
--- a/tools/perf/pmu-events/arch/x86/amdfam17h/core.json
+++ b/tools/perf/pmu-events/arch/x86/amdfam17h/core.json
@@ -13,7 +13,7 @@
   {
     "EventName": "ex_ret_brn",
     "EventCode": "0xc2",
-    "BriefDescription": "[Retired Branch Instructions.",
+    "BriefDescription": "Retired Branch Instructions.",
     "PublicDescription": "The number of branch instructions retired. This 
includes all types of architectural control flow changes, including exceptions 
and interrupts."
   },
   {

++++++ perf-vendor-events-arm64-fix-hisi-hip08-ddrc-pmu-eventname.patch ++++++
From: John Garry <[email protected]>
Date: Wed, 4 Sep 2019 23:54:41 +0800
Subject: perf vendor events arm64: Fix Hisi hip08 DDRC PMU eventname
Git-commit: 84b0975f4853ba32d2d9b3c19ffa2b947f023fb3
Patch-mainline: v5.5-rc1
References: git-fixes

The "EventName" for the DDRC precharge command event is incorrect, so
fix it.

Fixes: 57cc732479ba ("perf jevents: Add support for Hisi hip08 DDRC PMU 
aliasing")
Signed-off-by: John Garry <[email protected]>
Reviewed-by: Shaokun Zhang <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: [email protected]
Link: 
http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json 
b/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
index 0d1556fcdffe..99f4fc425564 100644
--- a/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
+++ b/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
@@ -15,7 +15,7 @@
    },
    {
            "EventCode": "0x04",
-           "EventName": "uncore_hisi_ddrc.flux_wr",
+           "EventName": "uncore_hisi_ddrc.pre_cmd",
            "BriefDescription": "DDRC precharge commands",
            "PublicDescription": "DDRC precharge commands",
            "Unit": "hisi_sccl,ddrc",

++++++ perf-vendor-events-remove-p8-hw-events-which-are-not-supported.patch 
++++++
From: Mamatha Inamdar <[email protected]>
Date: Mon, 9 Sep 2019 12:33:33 +0530
Subject: perf vendor events: Remove P8 HW events which are not supported
Git-commit: 28b951760cebdf1de0d32f38f325b667c2494564
Patch-mainline: v5.4-rc1
References: git-fixes

This patch is to remove following hardware events
from JSON file which are not supported on POWER8.

pm_l3_p0_grp_pump
pm_l3_p0_lco_data
pm_l3_p0_lco_no_data
pm_l3_p0_lco_rty

  Note: Unfortunately power8 event list is not publicly available.

Fixes: c3b4d5c4afb0 ("perf vendor events: Remove P8 HW events which are not 
supported")
Signed-off-by: Mamatha Inamdar <[email protected]>
Acked-by: Ravi Bangoria <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Madhavan Srinivasan <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: 
http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 .../perf/pmu-events/arch/powerpc/power8/other.json | 24 ----------------------
 1 file changed, 24 deletions(-)

diff --git a/tools/perf/pmu-events/arch/powerpc/power8/other.json 
b/tools/perf/pmu-events/arch/powerpc/power8/other.json
index 9dc2f6b70354..b2a3df07fbc4 100644
--- a/tools/perf/pmu-events/arch/powerpc/power8/other.json
+++ b/tools/perf/pmu-events/arch/powerpc/power8/other.json
@@ -1775,30 +1775,6 @@
     "BriefDescription": "L3 Load Prefetches",
     "PublicDescription": ""
   },
-  {,
-    "EventCode": "0xa29084",
-    "EventName": "PM_L3_P0_GRP_PUMP",
-    "BriefDescription": "L3 pf sent with grp scope port 0",
-    "PublicDescription": ""
-  },
-  {,
-    "EventCode": "0x528084",
-    "EventName": "PM_L3_P0_LCO_DATA",
-    "BriefDescription": "lco sent with data port 0",
-    "PublicDescription": ""
-  },
-  {,
-    "EventCode": "0x518080",
-    "EventName": "PM_L3_P0_LCO_NO_DATA",
-    "BriefDescription": "dataless l3 lco sent port 0",
-    "PublicDescription": ""
-  },
-  {,
-    "EventCode": "0xa4908c",
-    "EventName": "PM_L3_P0_LCO_RTY",
-    "BriefDescription": "L3 LCO received retry port 0",
-    "PublicDescription": ""
-  },
   {,
     "EventCode": "0x84908d",
     "EventName": "PM_L3_PF0_ALLOC",

++++++ perf-vendor-events-s390-add-json-transaction-for-machine-type-8561.patch 
++++++
From: Thomas Richter <[email protected]>
Date: Fri, 27 Sep 2019 10:11:46 +0200
Subject: perf vendor events s390: Add JSON transaction for machine type 8561
Git-commit: 02d084792273e8a5f1813dcad988229a45be96ea
Patch-mainline: v5.4-rc3
References: git-fixes

Add s390 transaction counter definition for machine 8561. This is the
same file as for the predecessor machine.

Fixes: 6e67d77d673d ("perf vendor events s390: Add JSON files for machine type 
8561")
Signed-off-by: Thomas Richter <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Vasily Gorbik <[email protected]>
Link: http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/pmu-events/arch/s390/cf_m8561/transaction.json | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/tools/perf/pmu-events/arch/s390/cf_m8561/transaction.json 
b/tools/perf/pmu-events/arch/s390/cf_m8561/transaction.json
new file mode 100644
index 000000000000..1a0034f79f73
--- /dev/null
+++ b/tools/perf/pmu-events/arch/s390/cf_m8561/transaction.json
@@ -0,0 +1,7 @@
+[
+  {
+    "BriefDescription": "Transaction count",
+    "MetricName": "transaction",
+    "MetricExpr": "TX_C_TEND + TX_NC_TEND + TX_NC_TABORT + TX_C_TABORT_SPECIAL 
+ TX_C_TABORT_NO_SPECIAL"
+  }
+]

++++++ 
perf-vendor-events-s390-remove-name-from-l1d_ro_excl_writes-description.patch 
++++++
From: Ed Maste <[email protected]>
Date: Thu, 12 Dec 2019 14:53:46 +0000
Subject: perf vendor events s390: Remove name from L1D_RO_EXCL_WRITES
 description
Git-commit: 58b3bafff8257c6946df5d6aeb215b8ac839ed2a
Patch-mainline: v5.5-rc3
References: git-fixes

In 7fcfa9a2d9 an unintended prefix "Counter:18 Name:" was removed from
the description for L1D_RO_EXCL_WRITES, but the extra name remained in
the description.  Remove it too.

Fixes: 7fcfa9a2d9a7 ("perf list: Fix s390 counter long description for 
L1D_RO_EXCL_WRITES")
Signed-off-by: Ed Maste <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Greentime Hu <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Nick Hu <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Richter <[email protected]>
Cc: Vincent Chen <[email protected]>
Link: 
http://lore.kernel.org/lkml/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Tony Jones <[email protected]>
---
 tools/perf/pmu-events/arch/s390/cf_z14/extended.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json 
b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
index 68618152ea2c..89e070727e1b 100644
--- a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
+++ b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
@@ -4,7 +4,7 @@
                "EventCode": "128",
                "EventName": "L1D_RO_EXCL_WRITES",
                "BriefDescription": "L1D Read-only Exclusive Writes",
-               "PublicDescription": "L1D_RO_EXCL_WRITES A directory write to 
the Level-1 Data cache where the line was originally in a Read-Only state in 
the cache but has been updated to be in the Exclusive state that allows stores 
to the cache line"
+               "PublicDescription": "A directory write to the Level-1 Data 
cache where the line was originally in a Read-Only state in the cache but has 
been updated to be in the Exclusive state that allows stores to the cache line"
        },
        {
                "Unit": "CPU-M-CF",


Reply via email to