Browse Source

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Thomas Gleixner:
 "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"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  tools lib api: Add str_error_c to libapi
  perf s390: Fix 'start' address of module's map
  tools lib bpf: Use official ELF e_machine value
Linus Torvalds 9 years ago
parent
commit
7f7d556496

+ 5 - 0
tools/lib/api/Build

@@ -2,3 +2,8 @@ libapi-y += fd/
 libapi-y += fs/
 libapi-y += fs/
 libapi-y += cpu.o
 libapi-y += cpu.o
 libapi-y += debug.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)

+ 6 - 1
tools/lib/bpf/libbpf.c

@@ -37,6 +37,10 @@
 #include "libbpf.h"
 #include "libbpf.h"
 #include "bpf.h"
 #include "bpf.h"
 
 
+#ifndef EM_BPF
+#define EM_BPF 247
+#endif
+
 #define __printf(a, b)	__attribute__((format(printf, a, b)))
 #define __printf(a, b)	__attribute__((format(printf, a, b)))
 
 
 __printf(1, 2)
 __printf(1, 2)
@@ -439,7 +443,8 @@ static int bpf_object__elf_init(struct bpf_object *obj)
 	}
 	}
 	ep = &obj->efile.ehdr;
 	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",
 		pr_warning("%s is not an eBPF object file\n",
 			obj->path);
 			obj->path);
 		err = -LIBBPF_ERRNO__FORMAT;
 		err = -LIBBPF_ERRNO__FORMAT;

+ 2 - 0
tools/perf/arch/s390/util/Build

@@ -2,3 +2,5 @@ libperf-y += header.o
 libperf-y += kvm-stat.o
 libperf-y += kvm-stat.o
 
 
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
+
+libperf-y += machine.o

+ 19 - 0
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;
+}

+ 0 - 5
tools/perf/util/Build

@@ -70,7 +70,6 @@ libperf-y += stat.o
 libperf-y += stat-shadow.o
 libperf-y += stat-shadow.o
 libperf-y += record.o
 libperf-y += record.o
 libperf-y += srcline.o
 libperf-y += srcline.o
-libperf-y += str_error_r.o
 libperf-y += data.o
 libperf-y += data.o
 libperf-y += tsc.o
 libperf-y += tsc.o
 libperf-y += cloexec.o
 libperf-y += cloexec.o
@@ -176,10 +175,6 @@ $(OUTPUT)util/libstring.o: ../lib/string.c FORCE
 	$(call rule_mkdir)
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 	$(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
 $(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
 	$(call rule_mkdir)
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 	$(call if_changed_dep,cc_o_c)

+ 8 - 0
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);
 	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)
 static int machine__create_module(void *arg, const char *name, u64 start)
 {
 {
 	struct machine *machine = arg;
 	struct machine *machine = arg;
 	struct map *map;
 	struct map *map;
 
 
+	if (arch__fix_module_text_start(&start, name) < 0)
+		return -1;
+
 	map = machine__findnew_module_map(machine, start, name);
 	map = machine__findnew_module_map(machine, start, name);
 	if (map == NULL)
 	if (map == NULL)
 		return -1;
 		return -1;

+ 1 - 0
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,
 struct map *machine__findnew_module_map(struct machine *machine, u64 start,
 					const char *filename);
 					const char *filename);
+int arch__fix_module_text_start(u64 *start, const char *name);
 
 
 int __machine__load_kallsyms(struct machine *machine, const char *filename,
 int __machine__load_kallsyms(struct machine *machine, const char *filename,
 			     enum map_type type, bool no_kcore, symbol_filter_t filter);
 			     enum map_type type, bool no_kcore, symbol_filter_t filter);

+ 0 - 1
tools/perf/util/python-ext-sources

@@ -13,7 +13,6 @@ util/cpumap.c
 ../lib/bitmap.c
 ../lib/bitmap.c
 ../lib/find_bit.c
 ../lib/find_bit.c
 ../lib/hweight.c
 ../lib/hweight.c
-../lib/str_error_r.c
 ../lib/vsprintf.c
 ../lib/vsprintf.c
 util/thread_map.c
 util/thread_map.c
 util/util.c
 util/util.c