--- /dev/null
+From 2ae5d0d7d8868df7c05c2013c0b9cddd4d40610e Mon Sep 17 00:00:00 2001
+From: Masami Hiramatsu <mhiramat@kernel.org>
+Date: Thu, 23 Apr 2020 20:01:13 +0900
+Subject: perf probe: Check address correctness by map instead of _etext
+
+From: Masami Hiramatsu <mhiramat@kernel.org>
+
+commit 2ae5d0d7d8868df7c05c2013c0b9cddd4d40610e upstream.
+
+Since commit 03db8b583d1c ("perf tools: Fix
+maps__find_symbol_by_name()") introduced map address range check in
+maps__find_symbol_by_name(), we can not get "_etext" from kernel map
+because _etext is placed on the edge of the kernel .text section (=
+kernel map in perf.)
+
+To fix this issue, this checks the address correctness by map address
+range information (map->start and map->end) instead of using _etext
+address.
+
+This can cause an error if the target inlined function is embedded in
+both __init function and normal function.
+
+For exaample, request_resource() is a normal function but also embedded
+in __init reserve_setup(). In this case, the probe point in
+reserve_setup() must be skipped.
+
+However, without this fix, it failes to setup all probe points:
+
+ # ./perf probe -v request_resource
+ probe-definition(0): request_resource
+ symbol:request_resource file:(null) line:0 offset:0 return:0 lazy:(null)
+ 0 arguments
+ Looking at the vmlinux_path (8 entries long)
+ Using /usr/lib/debug/lib/modules/5.5.17-200.fc31.x86_64/vmlinux for symbols
+ Open Debuginfo file: /usr/lib/debug/lib/modules/5.5.17-200.fc31.x86_64/vmlinux
+ Try to find probe point from debuginfo.
+ Matched function: request_resource [15e29ad]
+ found inline addr: 0xffffffff82fbf892
+ Probe point found: reserve_setup+204
+ found inline addr: 0xffffffff810e9790
+ Probe point found: request_resource+0
+ Found 2 probe_trace_events.
+ Opening /sys/kernel/debug/tracing//kprobe_events write=1
+ Opening /sys/kernel/debug/tracing//README write=0
+ Writing event: p:probe/request_resource _text+33290386
+ Failed to write event: Invalid argument
+ Error: Failed to add events. Reason: Invalid argument (Code: -22)
+ #
+
+With this fix,
+
+ # ./perf probe request_resource
+ reserve_setup is out of .text, skip it.
+ Added new events:
+ (null):(null) (on request_resource)
+ probe:request_resource (on request_resource)
+
+ You can now use it in all perf tools, such as:
+
+ perf record -e probe:request_resource -aR sleep 1
+
+ #
+
+Fixes: 03db8b583d1c ("perf tools: Fix maps__find_symbol_by_name()")
+Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
+Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
+Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: stable@vger.kernel.org
+Link: http://lore.kernel.org/lkml/158763967332.30755.4922496724365529088.stgit@devnote2
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/util/probe-event.c | 25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+--- a/tools/perf/util/probe-event.c
++++ b/tools/perf/util/probe-event.c
+@@ -245,21 +245,22 @@ static void clear_probe_trace_events(str
+ static bool kprobe_blacklist__listed(unsigned long address);
+ static bool kprobe_warn_out_range(const char *symbol, unsigned long address)
+ {
+- u64 etext_addr = 0;
+- int ret;
++ struct map *map;
++ bool ret = false;
+
+- /* Get the address of _etext for checking non-probable text symbol */
+- ret = kernel_get_symbol_address_by_name("_etext", &etext_addr,
+- false, false);
+-
+- if (ret == 0 && etext_addr < address)
+- pr_warning("%s is out of .text, skip it.\n", symbol);
+- else if (kprobe_blacklist__listed(address))
++ map = kernel_get_module_map(NULL);
++ if (map) {
++ ret = address <= map->start || map->end < address;
++ if (ret)
++ pr_warning("%s is out of .text, skip it.\n", symbol);
++ map__put(map);
++ }
++ if (!ret && kprobe_blacklist__listed(address)) {
+ pr_warning("%s is blacklisted function, skip it.\n", symbol);
+- else
+- return false;
++ ret = true;
++ }
+
+- return true;
++ return ret;
+ }
+
+ /*
--- /dev/null
+From f41ebe9defacddeae96a872a33f0f22ced0bfcef Mon Sep 17 00:00:00 2001
+From: Masami Hiramatsu <mhiramat@kernel.org>
+Date: Thu, 23 Apr 2020 20:01:22 +0900
+Subject: perf probe: Do not show the skipped events
+
+From: Masami Hiramatsu <mhiramat@kernel.org>
+
+commit f41ebe9defacddeae96a872a33f0f22ced0bfcef upstream.
+
+When a probe point is expanded to several places (like inlined) and if
+some of them are skipped because of blacklisted or __init function,
+those trace_events has no event name. It must be skipped while showing
+results.
+
+Without this fix, you can see "(null):(null)" on the list,
+
+ # ./perf probe request_resource
+ reserve_setup is out of .text, skip it.
+ Added new events:
+ (null):(null) (on request_resource)
+ probe:request_resource (on request_resource)
+
+ You can now use it in all perf tools, such as:
+
+ perf record -e probe:request_resource -aR sleep 1
+
+ #
+
+With this fix, it is ignored:
+
+ # ./perf probe request_resource
+ reserve_setup is out of .text, skip it.
+ Added new events:
+ probe:request_resource (on request_resource)
+
+ You can now use it in all perf tools, such as:
+
+ perf record -e probe:request_resource -aR sleep 1
+
+ #
+
+Fixes: 5a51fcd1f30c ("perf probe: Skip kernel symbols which is out of .text")
+Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
+Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: stable@vger.kernel.org
+Link: http://lore.kernel.org/lkml/158763968263.30755.12800484151476026340.stgit@devnote2
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/builtin-probe.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/tools/perf/builtin-probe.c
++++ b/tools/perf/builtin-probe.c
+@@ -376,6 +376,9 @@ static int perf_add_probe_events(struct
+
+ for (k = 0; k < pev->ntevs; k++) {
+ struct probe_trace_event *tev = &pev->tevs[k];
++ /* Skipped events have no event name */
++ if (!tev->event)
++ continue;
+
+ /* We use tev's name for showing new events */
+ show_perf_probe_event(tev->group, tev->event, pev,
--- /dev/null
+From 80526491c2ca6abc028c0f0dbb0707a1f35fb18a Mon Sep 17 00:00:00 2001
+From: Masami Hiramatsu <mhiramat@kernel.org>
+Date: Thu, 23 Apr 2020 20:01:04 +0900
+Subject: perf probe: Fix to check blacklist address correctly
+
+From: Masami Hiramatsu <mhiramat@kernel.org>
+
+commit 80526491c2ca6abc028c0f0dbb0707a1f35fb18a upstream.
+
+Fix to check kprobe blacklist address correctly with relocated address
+by adjusting debuginfo address.
+
+Since the address in the debuginfo is same as objdump, it is different
+from relocated kernel address with KASLR. Thus, 'perf probe' always
+misses to catch the blacklisted addresses.
+
+Without this patch, 'perf probe' can not detect the blacklist addresses
+on a KASLR enabled kernel.
+
+ # perf probe kprobe_dispatcher
+ Failed to write event: Invalid argument
+ Error: Failed to add events.
+ #
+
+With this patch, it correctly shows the error message.
+
+ # perf probe kprobe_dispatcher
+ kprobe_dispatcher is blacklisted function, skip it.
+ Probe point 'kprobe_dispatcher' not found.
+ Error: Failed to add events.
+ #
+
+Fixes: 9aaf5a5f479b ("perf probe: Check kprobes blacklist when adding new events")
+Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
+Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: stable@vger.kernel.org
+Link: http://lore.kernel.org/lkml/158763966411.30755.5882376357738273695.stgit@devnote2
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/util/probe-event.c | 21 +++++++++++++++------
+ 1 file changed, 15 insertions(+), 6 deletions(-)
+
+--- a/tools/perf/util/probe-event.c
++++ b/tools/perf/util/probe-event.c
+@@ -111,7 +111,7 @@ void exit_probe_symbol_maps(void)
+ symbol__exit();
+ }
+
+-static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void)
++static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap)
+ {
+ /* kmap->ref_reloc_sym should be set if host_machine is initialized */
+ struct kmap *kmap;
+@@ -123,6 +123,10 @@ static struct ref_reloc_sym *kernel_get_
+ kmap = map__kmap(map);
+ if (!kmap)
+ return NULL;
++
++ if (pmap)
++ *pmap = map;
++
+ return kmap->ref_reloc_sym;
+ }
+
+@@ -134,7 +138,7 @@ static int kernel_get_symbol_address_by_
+ struct map *map;
+
+ /* ref_reloc_sym is just a label. Need a special fix*/
+- reloc_sym = kernel_get_ref_reloc_sym();
++ reloc_sym = kernel_get_ref_reloc_sym(NULL);
+ if (reloc_sym && strcmp(name, reloc_sym->name) == 0)
+ *addr = (reloc) ? reloc_sym->addr : reloc_sym->unrelocated_addr;
+ else {
+@@ -751,6 +755,7 @@ post_process_kernel_probe_trace_events(s
+ int ntevs)
+ {
+ struct ref_reloc_sym *reloc_sym;
++ struct map *map;
+ char *tmp;
+ int i, skipped = 0;
+
+@@ -759,7 +764,7 @@ post_process_kernel_probe_trace_events(s
+ return post_process_offline_probe_trace_events(tevs, ntevs,
+ symbol_conf.vmlinux_name);
+
+- reloc_sym = kernel_get_ref_reloc_sym();
++ reloc_sym = kernel_get_ref_reloc_sym(&map);
+ if (!reloc_sym) {
+ pr_warning("Relocated base symbol is not found!\n");
+ return -EINVAL;
+@@ -770,9 +775,13 @@ post_process_kernel_probe_trace_events(s
+ continue;
+ if (tevs[i].point.retprobe && !kretprobe_offset_is_supported())
+ continue;
+- /* If we found a wrong one, mark it by NULL symbol */
++ /*
++ * If we found a wrong one, mark it by NULL symbol.
++ * Since addresses in debuginfo is same as objdump, we need
++ * to convert it to addresses on memory.
++ */
+ if (kprobe_warn_out_range(tevs[i].point.symbol,
+- tevs[i].point.address)) {
++ map__objdump_2mem(map, tevs[i].point.address))) {
+ tmp = NULL;
+ skipped++;
+ } else {
+@@ -2887,7 +2896,7 @@ static int find_probe_trace_events_from_
+ /* Note that the symbols in the kmodule are not relocated */
+ if (!pev->uprobes && !pev->target &&
+ (!pp->retprobe || kretprobe_offset_is_supported())) {
+- reloc_sym = kernel_get_ref_reloc_sym();
++ reloc_sym = kernel_get_ref_reloc_sym(NULL);
+ if (!reloc_sym) {
+ pr_warning("Relocated base symbol is not found!\n");
+ ret = -EINVAL;
--- /dev/null
+From 85afd35575a3c1a3a905722dde5ee70b49282e70 Mon Sep 17 00:00:00 2001
+From: Adrian Hunter <adrian.hunter@intel.com>
+Date: Tue, 26 May 2020 18:52:07 +0300
+Subject: perf symbols: Fix debuginfo search for Ubuntu
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+commit 85afd35575a3c1a3a905722dde5ee70b49282e70 upstream.
+
+Reportedly, from 19.10 Ubuntu has begun mixing up the location of some
+debug symbol files, putting files expected to be in
+/usr/lib/debug/usr/lib into /usr/lib/debug/lib instead. Fix by adding
+another dso_binary_type.
+
+Example on Ubuntu 20.04
+
+ Before:
+
+ $ perf record -e intel_pt//u uname
+ Linux
+ [ perf record: Woken up 1 times to write data ]
+ [ perf record: Captured and wrote 0.030 MB perf.data ]
+ $ perf script --call-trace | head -5
+ uname 14003 [005] 15321.764958566: cbr: 42 freq: 4219 MHz (156%)
+ uname 14003 [005] 15321.764958566: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) 7f1e71cc4100
+ uname 14003 [005] 15321.764961566: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) 7f1e71cc4df0
+ uname 14003 [005] 15321.764961900: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) 7f1e71cc4e18
+ uname 14003 [005] 15321.764963233: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) 7f1e71cc5128
+
+ After:
+
+ $ perf script --call-trace | head -5
+ uname 14003 [005] 15321.764958566: cbr: 42 freq: 4219 MHz (156%)
+ uname 14003 [005] 15321.764958566: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _start
+ uname 14003 [005] 15321.764961566: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start
+ uname 14003 [005] 15321.764961900: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start
+ uname 14003 [005] 15321.764963233: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start
+
+Reported-by: Travis Downs <travis.downs@gmail.com>
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+Cc: stable@vger.kernel.org
+Link: http://lore.kernel.org/lkml/20200526155207.9172-1-adrian.hunter@intel.com
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/util/dso.c | 16 ++++++++++++++++
+ tools/perf/util/dso.h | 1 +
+ tools/perf/util/probe-finder.c | 1 +
+ tools/perf/util/symbol.c | 2 ++
+ 4 files changed, 20 insertions(+)
+
+--- a/tools/perf/util/dso.c
++++ b/tools/perf/util/dso.c
+@@ -38,6 +38,7 @@ char dso__symtab_origin(const struct dso
+ [DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO] = 'D',
+ [DSO_BINARY_TYPE__FEDORA_DEBUGINFO] = 'f',
+ [DSO_BINARY_TYPE__UBUNTU_DEBUGINFO] = 'u',
++ [DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO] = 'x',
+ [DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO] = 'o',
+ [DSO_BINARY_TYPE__BUILDID_DEBUGINFO] = 'b',
+ [DSO_BINARY_TYPE__SYSTEM_PATH_DSO] = 'd',
+@@ -120,6 +121,21 @@ int dso__read_binary_type_filename(const
+ snprintf(filename + len, size - len, "%s", dso->long_name);
+ break;
+
++ case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO:
++ /*
++ * Ubuntu can mixup /usr/lib with /lib, putting debuginfo in
++ * /usr/lib/debug/lib when it is expected to be in
++ * /usr/lib/debug/usr/lib
++ */
++ if (strlen(dso->long_name) < 9 ||
++ strncmp(dso->long_name, "/usr/lib/", 9)) {
++ ret = -1;
++ break;
++ }
++ len = __symbol__join_symfs(filename, size, "/usr/lib/debug");
++ snprintf(filename + len, size - len, "%s", dso->long_name + 4);
++ break;
++
+ case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
+ {
+ const char *last_slash;
+--- a/tools/perf/util/dso.h
++++ b/tools/perf/util/dso.h
+@@ -25,6 +25,7 @@ enum dso_binary_type {
+ DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
+ DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
+ DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
++ DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO,
+ DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
+ DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
+ DSO_BINARY_TYPE__GUEST_KMODULE,
+--- a/tools/perf/util/probe-finder.c
++++ b/tools/perf/util/probe-finder.c
+@@ -114,6 +114,7 @@ enum dso_binary_type distro_dwarf_types[
+ DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
+ DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
+ DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
++ DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO,
+ DSO_BINARY_TYPE__NOT_FOUND,
+ };
+
+--- a/tools/perf/util/symbol.c
++++ b/tools/perf/util/symbol.c
+@@ -65,6 +65,7 @@ static enum dso_binary_type binary_type_
+ DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
+ DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
+ DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
++ DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO,
+ DSO_BINARY_TYPE__NOT_FOUND,
+ };
+
+@@ -1419,6 +1420,7 @@ static bool dso__is_compatible_symtab_ty
+ case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
+ case DSO_BINARY_TYPE__FEDORA_DEBUGINFO:
+ case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
++ case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO:
+ case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
+ case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
+ return !kmod && dso->kernel == DSO_TYPE_USER;
mtd-rawnand-brcmnand-fix-hamming-oob-layout.patch
mtd-rawnand-pasemi-fix-the-probe-error-path.patch
w1-omap-hdq-cleanup-to-add-missing-newline-for-some-dev_dbg.patch
+perf-probe-do-not-show-the-skipped-events.patch
+perf-probe-fix-to-check-blacklist-address-correctly.patch
+perf-probe-check-address-correctness-by-map-instead-of-_etext.patch
+perf-symbols-fix-debuginfo-search-for-ubuntu.patch