[GIT pull] perf fixes for 4.8

From: Thomas Gleixner
Date: Sat Jul 30 2016 - 06:16:31 EST


Linus,

please pull the latest perf-urgent-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus

This update contains:

- A fix for the bpf tools to use the new EM_BPF code

- A fix for the module parser of perf to retrieve the proper text start
address

- Add str_error_c to libapi to avoid linking against
tools/lib/str_error_r.o.

Thanks,

tglx

------------------>
Arnaldo Carvalho de Melo (1):
tools lib api: Add str_error_c to libapi

Song Shan Gong (1):
perf s390: Fix 'start' address of module's map

Wang Nan (1):
tools lib bpf: Use official ELF e_machine value


tools/lib/api/Build | 5 +++++
tools/lib/bpf/libbpf.c | 7 ++++++-
tools/perf/arch/s390/util/Build | 2 ++
tools/perf/arch/s390/util/machine.c | 19 +++++++++++++++++++
tools/perf/util/Build | 5 -----
tools/perf/util/machine.c | 8 ++++++++
tools/perf/util/machine.h | 1 +
tools/perf/util/python-ext-sources | 1 -
8 files changed, 41 insertions(+), 7 deletions(-)
create mode 100644 tools/perf/arch/s390/util/machine.c

diff --git a/tools/lib/api/Build b/tools/lib/api/Build
index 954c644f7ad9..6e2373db5598 100644
--- a/tools/lib/api/Build
+++ b/tools/lib/api/Build
@@ -2,3 +2,8 @@ libapi-y += fd/
libapi-y += fs/
libapi-y += cpu.o
libapi-y += debug.o
+libapi-y += str_error_r.o
+
+$(OUTPUT)str_error_r.o: ../str_error_r.c FORCE
+ $(call rule_mkdir)
+ $(call if_changed_dep,cc_o_c)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 32e6b6bc6f7d..b699aea9a025 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -37,6 +37,10 @@
#include "libbpf.h"
#include "bpf.h"

+#ifndef EM_BPF
+#define EM_BPF 247
+#endif
+
#define __printf(a, b) __attribute__((format(printf, a, b)))

__printf(1, 2)
@@ -439,7 +443,8 @@ static int bpf_object__elf_init(struct bpf_object *obj)
}
ep = &obj->efile.ehdr;

- if ((ep->e_type != ET_REL) || (ep->e_machine != 0)) {
+ /* Old LLVM set e_machine to EM_NONE */
+ if ((ep->e_type != ET_REL) || (ep->e_machine && (ep->e_machine != EM_BPF))) {
pr_warning("%s is not an eBPF object file\n",
obj->path);
err = -LIBBPF_ERRNO__FORMAT;
diff --git a/tools/perf/arch/s390/util/Build b/tools/perf/arch/s390/util/Build
index 8a61372bb47a..5bd7b9260cc0 100644
--- a/tools/perf/arch/s390/util/Build
+++ b/tools/perf/arch/s390/util/Build
@@ -2,3 +2,5 @@ libperf-y += header.o
libperf-y += kvm-stat.o

libperf-$(CONFIG_DWARF) += dwarf-regs.o
+
+libperf-y += machine.o
diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c
new file mode 100644
index 000000000000..b9a95a1a8e69
--- /dev/null
+++ b/tools/perf/arch/s390/util/machine.c
@@ -0,0 +1,19 @@
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include "util.h"
+#include "machine.h"
+#include "api/fs/fs.h"
+
+int arch__fix_module_text_start(u64 *start, const char *name)
+{
+ char path[PATH_MAX];
+
+ snprintf(path, PATH_MAX, "module/%.*s/sections/.text",
+ (int)strlen(name) - 2, name + 1);
+
+ if (sysfs__read_ull(path, (unsigned long long *)start) < 0)
+ return -1;
+
+ return 0;
+}
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 2fa7d8b69873..91c5f6e1af59 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -70,7 +70,6 @@ libperf-y += stat.o
libperf-y += stat-shadow.o
libperf-y += record.o
libperf-y += srcline.o
-libperf-y += str_error_r.o
libperf-y += data.o
libperf-y += tsc.o
libperf-y += cloexec.o
@@ -176,10 +175,6 @@ $(OUTPUT)util/libstring.o: ../lib/string.c FORCE
$(call rule_mkdir)
$(call if_changed_dep,cc_o_c)

-$(OUTPUT)util/str_error_r.o: ../lib/str_error_r.c FORCE
- $(call rule_mkdir)
- $(call if_changed_dep,cc_o_c)
-
$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
$(call rule_mkdir)
$(call if_changed_dep,cc_o_c)
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index bc2cdbd09a25..cb6388dbdd98 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1093,12 +1093,20 @@ static int machine__set_modules_path(struct machine *machine)

return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0);
}
+int __weak arch__fix_module_text_start(u64 *start __maybe_unused,
+ const char *name __maybe_unused)
+{
+ return 0;
+}

static int machine__create_module(void *arg, const char *name, u64 start)
{
struct machine *machine = arg;
struct map *map;

+ if (arch__fix_module_text_start(&start, name) < 0)
+ return -1;
+
map = machine__findnew_module_map(machine, start, name);
if (map == NULL)
return -1;
diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h
index 41ac9cfd416b..20739f746bc4 100644
--- a/tools/perf/util/machine.h
+++ b/tools/perf/util/machine.h
@@ -216,6 +216,7 @@ struct symbol *machine__find_kernel_function_by_name(struct machine *machine,

struct map *machine__findnew_module_map(struct machine *machine, u64 start,
const char *filename);
+int arch__fix_module_text_start(u64 *start, const char *name);

int __machine__load_kallsyms(struct machine *machine, const char *filename,
enum map_type type, bool no_kcore, symbol_filter_t filter);
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
index 5065ec98049c..b7d4f4aeee61 100644
--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -13,7 +13,6 @@ util/cpumap.c
../lib/bitmap.c
../lib/find_bit.c
../lib/hweight.c
-../lib/str_error_r.c
../lib/vsprintf.c
util/thread_map.c
util/util.c