Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+41 -7
+5
tools/lib/api/Build
··· 2 2 libapi-y += fs/ 3 3 libapi-y += cpu.o 4 4 libapi-y += debug.o 5 + libapi-y += str_error_r.o 6 + 7 + $(OUTPUT)str_error_r.o: ../str_error_r.c FORCE 8 + $(call rule_mkdir) 9 + $(call if_changed_dep,cc_o_c)
+6 -1
tools/lib/bpf/libbpf.c
··· 37 37 #include "libbpf.h" 38 38 #include "bpf.h" 39 39 40 + #ifndef EM_BPF 41 + #define EM_BPF 247 42 + #endif 43 + 40 44 #define __printf(a, b) __attribute__((format(printf, a, b))) 41 45 42 46 __printf(1, 2) ··· 443 439 } 444 440 ep = &obj->efile.ehdr; 445 441 446 - if ((ep->e_type != ET_REL) || (ep->e_machine != 0)) { 442 + /* Old LLVM set e_machine to EM_NONE */ 443 + if ((ep->e_type != ET_REL) || (ep->e_machine && (ep->e_machine != EM_BPF))) { 447 444 pr_warning("%s is not an eBPF object file\n", 448 445 obj->path); 449 446 err = -LIBBPF_ERRNO__FORMAT;
+2
tools/perf/arch/s390/util/Build
··· 2 2 libperf-y += kvm-stat.o 3 3 4 4 libperf-$(CONFIG_DWARF) += dwarf-regs.o 5 + 6 + libperf-y += machine.o
+19
tools/perf/arch/s390/util/machine.c
··· 1 + #include <unistd.h> 2 + #include <stdio.h> 3 + #include <string.h> 4 + #include "util.h" 5 + #include "machine.h" 6 + #include "api/fs/fs.h" 7 + 8 + int arch__fix_module_text_start(u64 *start, const char *name) 9 + { 10 + char path[PATH_MAX]; 11 + 12 + snprintf(path, PATH_MAX, "module/%.*s/sections/.text", 13 + (int)strlen(name) - 2, name + 1); 14 + 15 + if (sysfs__read_ull(path, (unsigned long long *)start) < 0) 16 + return -1; 17 + 18 + return 0; 19 + }
-5
tools/perf/util/Build
··· 70 70 libperf-y += stat-shadow.o 71 71 libperf-y += record.o 72 72 libperf-y += srcline.o 73 - libperf-y += str_error_r.o 74 73 libperf-y += data.o 75 74 libperf-y += tsc.o 76 75 libperf-y += cloexec.o ··· 172 173 $(call if_changed_dep,cc_o_c) 173 174 174 175 $(OUTPUT)util/libstring.o: ../lib/string.c FORCE 175 - $(call rule_mkdir) 176 - $(call if_changed_dep,cc_o_c) 177 - 178 - $(OUTPUT)util/str_error_r.o: ../lib/str_error_r.c FORCE 179 176 $(call rule_mkdir) 180 177 $(call if_changed_dep,cc_o_c) 181 178
+8
tools/perf/util/machine.c
··· 1093 1093 1094 1094 return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); 1095 1095 } 1096 + int __weak arch__fix_module_text_start(u64 *start __maybe_unused, 1097 + const char *name __maybe_unused) 1098 + { 1099 + return 0; 1100 + } 1096 1101 1097 1102 static int machine__create_module(void *arg, const char *name, u64 start) 1098 1103 { 1099 1104 struct machine *machine = arg; 1100 1105 struct map *map; 1106 + 1107 + if (arch__fix_module_text_start(&start, name) < 0) 1108 + return -1; 1101 1109 1102 1110 map = machine__findnew_module_map(machine, start, name); 1103 1111 if (map == NULL)
+1
tools/perf/util/machine.h
··· 216 216 217 217 struct map *machine__findnew_module_map(struct machine *machine, u64 start, 218 218 const char *filename); 219 + int arch__fix_module_text_start(u64 *start, const char *name); 219 220 220 221 int __machine__load_kallsyms(struct machine *machine, const char *filename, 221 222 enum map_type type, bool no_kcore, symbol_filter_t filter);
-1
tools/perf/util/python-ext-sources
··· 13 13 ../lib/bitmap.c 14 14 ../lib/find_bit.c 15 15 ../lib/hweight.c 16 - ../lib/str_error_r.c 17 16 ../lib/vsprintf.c 18 17 util/thread_map.c 19 18 util/util.c