]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge tag 'perf-urgent-for-mingo-20160726' of git://git.kernel.org/pub/scm/linux...
authorIngo Molnar <mingo@kernel.org>
Wed, 27 Jul 2016 09:01:06 +0000 (11:01 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 27 Jul 2016 09:01:06 +0000 (11:01 +0200)
Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

 - Fix obtaining the 'start' address for a kernel module on s390, where
   .text doesn't coincide with the start of the module as reported in
   /proc/modules (Song Shan Gong)

 - Use official ELF e_machine value for BPF objects generated via perf + LLVM
   when specifying BPF scriptlet in 'perf record/trace --event' (Wang Nan)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
tools/lib/bpf/libbpf.c
tools/perf/arch/s390/util/Build
tools/perf/arch/s390/util/machine.c [new file with mode: 0644]
tools/perf/util/machine.c
tools/perf/util/machine.h

index 32e6b6bc6f7d918bc4ceb259021be1cedbceec38..b699aea9a02586903dc0d7a683e8ff995de3298b 100644 (file)
 #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;
index 8a61372bb47a5ba60027c70f7706da3bdcf30661..5bd7b9260cc0858c36730ee367aecc56df6c91bb 100644 (file)
@@ -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 (file)
index 0000000..b9a95a1
--- /dev/null
@@ -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;
+}
index bc2cdbd09a253078e99037fcb189737273e7f33a..cb6388dbdd9875a588207286946cb5bea7887767 100644 (file)
@@ -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;
index 41ac9cfd416b52d5972d8c2f8b5275a62b22ce65..20739f746bc4e583cbeaf9e20673af115b3256a4 100644 (file)
@@ -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);