mirror of https://gitee.com/openkylin/linux.git
perf/urgent fixes:
- Fix obtaining the 'start' address for a kernel module on s390, where .text doesn't coincides with the start of the module as reported on /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> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJXl8mHAAoJENZQFvNTUqpA0tgP/3UnRhMWLrnxSaw6bGuAdwBF 9MPBK6YNtEQSfpK8Lr4Cbwb4GE4CdcImNx2RT0wtahffJNphfEN6B6LYZZsKIDO8 Z9bqm94TFl8Hu1O0rd808Tg4C7rbz4aU2qECWNYC2WRFooqn4CtaKMqSlHjiqyct KDUdXl9VhrDPRX5WiTzCZoiZMXqX/wlppga9b3ADCxzrfzLnV4smDtiC4GfNv6Aa Th5qXwSR5FnyTcttpuvISj7oL2y+3ROwsRevYhuOCjebvDFmis2EWGJ1IzTR7ua/ UWHpT7KZGVRsz2xs3sZANJdPl37VkUOXQz2+kAaVqk0lGf6/aqW2ly5BS1cEtL1C /mWFtBTQxANu4Wc8m2tqrLr3JYKcqtMABLlINhlOSEu+8qNilzmerybo91kXJKzj YFwrDd6CpGRrOFSaH7FruwwBJft6ArW8kwRSUBcf1PUdp/17oogNS12xEzb3BLyc vBXWHnJbsWdY32yVPPnOh/K4iTdtsCt0oJq4227/9q0Fb0M64LcVGUoQOhYhd/Wx gn15rHZTmMqr7Xjp/T7b5nSmYk+vS9P5Ez5+RH/qPHvG3KfNx+PrsG0Jow0EeAay 0qAjtxaB73FhPpVGkqkxBM5cn6BsWitX9mnjnboLuLzrd+1Y3/dR7dDIEYL1HT4o J7NjNHVMInWk+Af2aZ8a =07px -----END PGP SIGNATURE----- Merge tag 'perf-urgent-for-mingo-20160726' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent 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>
This commit is contained in:
commit
e4b3e0694b
|
@ -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,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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue