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

Commit de176489 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar
Browse files

perf session: Keep pointers to the vmlinux maps



So that tools such as 'perf probe' don't have to lookup
'[kernel.kallsyms]' but instead access them directly after
perf_session__create_kernel_maps or
map_groups__create_kernel_maps.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1262629169-22797-4-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f92cb24c
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -235,9 +235,7 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
	session.psession = perf_session__new(NULL, O_WRONLY, false);
	if (session.psession == NULL)
		die("Failed to init perf_session.");
	session.kmap = map_groups__find_by_name(&session.psession->kmaps,
						MAP__FUNCTION,
						"[kernel.kallsyms]");
	session.kmap = session.psession->vmlinux_maps[MAP__FUNCTION];
	if (!session.kmap)
		die("Could not find kernel map.\n");

+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ struct perf_session {
	struct map_groups	kmaps;
	struct rb_root		threads;
	struct thread		*last_match;
	struct map		*vmlinux_maps[MAP__NR_TYPES];
	struct events_stats	events_stats;
	unsigned long		event_total[PERF_RECORD_MAX];
	unsigned long		unknown_events;
+13 −16
Original line number Diff line number Diff line
@@ -1691,29 +1691,26 @@ out_delete_kernel_dso:
	return NULL;
}

static int map_groups__create_kernel_maps(struct map_groups *self, const char *vmlinux)
static int map_groups__create_kernel_maps(struct map_groups *self,
					  struct map *vmlinux_maps[MAP__NR_TYPES],
					  const char *vmlinux)
{
	struct map *functions, *variables;
	struct dso *kernel = dsos__create_kernel(vmlinux);
	enum map_type type;

	if (kernel == NULL)
		return -1;

	functions = map__new2(0, kernel, MAP__FUNCTION);
	if (functions == NULL)
	for (type = 0; type < MAP__NR_TYPES; ++type) {
		vmlinux_maps[type] = map__new2(0, kernel, type);
		if (vmlinux_maps[type] == NULL)
			return -1;

	variables = map__new2(0, kernel, MAP__VARIABLE);
	if (variables == NULL) {
		map__delete(functions);
		return -1;
		vmlinux_maps[type]->map_ip =
			vmlinux_maps[type]->unmap_ip = identity__map_ip;
		map_groups__insert(self, vmlinux_maps[type]);
	}

	functions->map_ip = functions->unmap_ip =
		variables->map_ip = variables->unmap_ip = identity__map_ip;
	map_groups__insert(self, functions);
	map_groups__insert(self, variables);

	return 0;
}

@@ -1824,7 +1821,7 @@ out_free_comm_list:

int perf_session__create_kernel_maps(struct perf_session *self)
{
	if (map_groups__create_kernel_maps(&self->kmaps,
	if (map_groups__create_kernel_maps(&self->kmaps, self->vmlinux_maps,
					   symbol_conf.vmlinux_name) < 0)
		return -1;