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

Commit 0ae617be authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo
Browse files

perf record: Get ref_reloc_sym from kernel map



Now that ref_reloc_sym is set up when the kernel map is created,
'perf record' does not need to pass the symbol names to
perf_event__synthesize_kernel_mmap() which can read the values needed
from ref_reloc_sym directly.

Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Tested-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1391004884-10334-6-git-send-email-adrian.hunter@intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5512cf24
Loading
Loading
Loading
Loading
+2 −8
Original line number Original line Diff line number Diff line
@@ -287,10 +287,7 @@ static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
	 * have no _text sometimes.
	 * have no _text sometimes.
	 */
	 */
	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
						 machine, "_text");
						 machine);
	if (err < 0)
		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
							 machine, "_stext");
	if (err < 0)
	if (err < 0)
		pr_err("Couldn't record guest kernel [%d]'s reference"
		pr_err("Couldn't record guest kernel [%d]'s reference"
		       " relocation symbol.\n", machine->pid);
		       " relocation symbol.\n", machine->pid);
@@ -457,10 +454,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
	}
	}


	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
						 machine, "_text");
						 machine);
	if (err < 0)
		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
							 machine, "_stext");
	if (err < 0)
	if (err < 0)
		pr_err("Couldn't record kernel reference relocation symbol\n"
		pr_err("Couldn't record kernel reference relocation symbol\n"
		       "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
		       "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
+6 −20
Original line number Original line Diff line number Diff line
@@ -483,15 +483,13 @@ u64 kallsyms__get_function_start(const char *kallsyms_filename,


int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
				       perf_event__handler_t process,
				       perf_event__handler_t process,
				       struct machine *machine,
				       struct machine *machine)
				       const char *symbol_name)
{
{
	size_t size;
	size_t size;
	const char *filename, *mmap_name;
	const char *mmap_name;
	char path[PATH_MAX];
	char name_buff[PATH_MAX];
	char name_buff[PATH_MAX];
	struct map *map;
	struct map *map;
	u64 start;
	struct kmap *kmap;
	int err;
	int err;
	/*
	/*
	 * We should get this from /sys/kernel/sections/.text, but till that is
	 * We should get this from /sys/kernel/sections/.text, but till that is
@@ -513,31 +511,19 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
		 * see kernel/perf_event.c __perf_event_mmap
		 * see kernel/perf_event.c __perf_event_mmap
		 */
		 */
		event->header.misc = PERF_RECORD_MISC_KERNEL;
		event->header.misc = PERF_RECORD_MISC_KERNEL;
		filename = "/proc/kallsyms";
	} else {
	} else {
		event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
		event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
		if (machine__is_default_guest(machine))
			filename = (char *) symbol_conf.default_guest_kallsyms;
		else {
			sprintf(path, "%s/proc/kallsyms", machine->root_dir);
			filename = path;
		}
	}

	start = kallsyms__get_function_start(filename, symbol_name);
	if (!start) {
		free(event);
		return -ENOENT;
	}
	}


	map = machine->vmlinux_maps[MAP__FUNCTION];
	map = machine->vmlinux_maps[MAP__FUNCTION];
	kmap = map__kmap(map);
	size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
	size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
			"%s%s", mmap_name, symbol_name) + 1;
			"%s%s", mmap_name, kmap->ref_reloc_sym->name) + 1;
	size = PERF_ALIGN(size, sizeof(u64));
	size = PERF_ALIGN(size, sizeof(u64));
	event->mmap.header.type = PERF_RECORD_MMAP;
	event->mmap.header.type = PERF_RECORD_MMAP;
	event->mmap.header.size = (sizeof(event->mmap) -
	event->mmap.header.size = (sizeof(event->mmap) -
			(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
			(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
	event->mmap.pgoff = start;
	event->mmap.pgoff = kmap->ref_reloc_sym->addr;
	event->mmap.start = map->start;
	event->mmap.start = map->start;
	event->mmap.len   = map->end - event->mmap.start;
	event->mmap.len   = map->end - event->mmap.start;
	event->mmap.pid   = machine->pid;
	event->mmap.pid   = machine->pid;
+1 −2
Original line number Original line Diff line number Diff line
@@ -214,8 +214,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
				   struct machine *machine, bool mmap_data);
				   struct machine *machine, bool mmap_data);
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
				       perf_event__handler_t process,
				       perf_event__handler_t process,
				       struct machine *machine,
				       struct machine *machine);
				       const char *symbol_name);


int perf_event__synthesize_modules(struct perf_tool *tool,
int perf_event__synthesize_modules(struct perf_tool *tool,
				   perf_event__handler_t process,
				   perf_event__handler_t process,