Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4b3e069 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'perf-urgent-for-mingo-20160726' of...

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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 37e13a1e 203d8a4a
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
#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;
}
+8 −0
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
@@ -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);