Commit e0dbf18f authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Allow using PERF_RECORD_MMAP2 to synthesize the kernel modules maps



Allow using PERF_RECORD_MMAP2 to synthesize the kernel modules maps so
that we can use PERF_RECORD_MMAP2 to encode the kernel modules build ids
in the following csets.

It's enabled by a new symbol_conf.buildid_mmap2 bool field, which will
be switchable in following changes.

Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Acked-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20201214105457.543111-10-jolsa@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 978410ff
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -596,16 +596,17 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t
	int rc = 0;
	struct map *pos;
	struct maps *maps = machine__kernel_maps(machine);
	union perf_event *event = zalloc((sizeof(event->mmap) +
					  machine->id_hdr_size));
	union perf_event *event;
	size_t size = symbol_conf.buildid_mmap2 ?
			sizeof(event->mmap2) : sizeof(event->mmap);

	event = zalloc(size + machine->id_hdr_size);
	if (event == NULL) {
		pr_debug("Not enough memory synthesizing mmap event "
			 "for kernel modules\n");
		return -1;
	}

	event->header.type = PERF_RECORD_MMAP;

	/*
	 * kernel uses 0 for user space maps, see kernel/perf_event.c
	 * __perf_event_mmap
@@ -616,11 +617,23 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t
		event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;

	maps__for_each_entry(maps, pos) {
		size_t size;

		if (!__map__is_kmodule(pos))
			continue;

		if (symbol_conf.buildid_mmap2) {
			size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
			event->mmap2.header.type = PERF_RECORD_MMAP2;
			event->mmap2.header.size = (sizeof(event->mmap2) -
						(sizeof(event->mmap2.filename) - size));
			memset(event->mmap2.filename + size, 0, machine->id_hdr_size);
			event->mmap2.header.size += machine->id_hdr_size;
			event->mmap2.start = pos->start;
			event->mmap2.len   = pos->end - pos->start;
			event->mmap2.pid   = machine->pid;

			memcpy(event->mmap2.filename, pos->dso->long_name,
			       pos->dso->long_name_len + 1);
		} else {
			size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
			event->mmap.header.type = PERF_RECORD_MMAP;
			event->mmap.header.size = (sizeof(event->mmap) -
@@ -633,6 +646,8 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t

			memcpy(event->mmap.filename, pos->dso->long_name,
			       pos->dso->long_name_len + 1);
		}

		if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
			rc = -1;
			break;