Skip to content

Commit 978410f

Browse files
olsajiriacmel
authored andcommitted
perf tools: Allow using PERF_RECORD_MMAP2 to synthesize the kernel map
Allow using PERF_RECORD_MMAP2 to synthesize the kernel map so that we can use PERF_RECORD_MMAP2 to encode the kernel build id 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: Jiri Olsa <[email protected]> Acked-by: Namhyung Kim <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Alexei Budankov <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Michael Petlan <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Song Liu <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lore.kernel.org/lkml/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 1ca6e80 commit 978410f

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

tools/perf/util/symbol_conf.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ struct symbol_conf {
4242
report_block,
4343
report_individual_block,
4444
inline_name,
45-
disable_add2line_warn;
45+
disable_add2line_warn,
46+
buildid_mmap2;
4647
const char *vmlinux_name,
4748
*kallsyms_name,
4849
*source_prefix,

tools/perf/util/synthetic-events.c

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -991,11 +991,12 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
991991
perf_event__handler_t process,
992992
struct machine *machine)
993993
{
994-
size_t size;
994+
union perf_event *event;
995+
size_t size = symbol_conf.buildid_mmap2 ?
996+
sizeof(event->mmap2) : sizeof(event->mmap);
995997
struct map *map = machine__kernel_map(machine);
996998
struct kmap *kmap;
997999
int err;
998-
union perf_event *event;
9991000

10001001
if (map == NULL)
10011002
return -1;
@@ -1009,7 +1010,7 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
10091010
* available use this, and after it is use this as a fallback for older
10101011
* kernels.
10111012
*/
1012-
event = zalloc((sizeof(event->mmap) + machine->id_hdr_size));
1013+
event = zalloc(size + machine->id_hdr_size);
10131014
if (event == NULL) {
10141015
pr_debug("Not enough memory synthesizing mmap event "
10151016
"for kernel modules\n");
@@ -1026,16 +1027,29 @@ static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
10261027
event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
10271028
}
10281029

1029-
size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
1030-
"%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
1031-
size = PERF_ALIGN(size, sizeof(u64));
1032-
event->mmap.header.type = PERF_RECORD_MMAP;
1033-
event->mmap.header.size = (sizeof(event->mmap) -
1034-
(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
1035-
event->mmap.pgoff = kmap->ref_reloc_sym->addr;
1036-
event->mmap.start = map->start;
1037-
event->mmap.len = map->end - event->mmap.start;
1038-
event->mmap.pid = machine->pid;
1030+
if (symbol_conf.buildid_mmap2) {
1031+
size = snprintf(event->mmap2.filename, sizeof(event->mmap2.filename),
1032+
"%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
1033+
size = PERF_ALIGN(size, sizeof(u64));
1034+
event->mmap2.header.type = PERF_RECORD_MMAP2;
1035+
event->mmap2.header.size = (sizeof(event->mmap2) -
1036+
(sizeof(event->mmap2.filename) - size) + machine->id_hdr_size);
1037+
event->mmap2.pgoff = kmap->ref_reloc_sym->addr;
1038+
event->mmap2.start = map->start;
1039+
event->mmap2.len = map->end - event->mmap.start;
1040+
event->mmap2.pid = machine->pid;
1041+
} else {
1042+
size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
1043+
"%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
1044+
size = PERF_ALIGN(size, sizeof(u64));
1045+
event->mmap.header.type = PERF_RECORD_MMAP;
1046+
event->mmap.header.size = (sizeof(event->mmap) -
1047+
(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
1048+
event->mmap.pgoff = kmap->ref_reloc_sym->addr;
1049+
event->mmap.start = map->start;
1050+
event->mmap.len = map->end - event->mmap.start;
1051+
event->mmap.pid = machine->pid;
1052+
}
10391053

10401054
err = perf_tool__process_synth_event(tool, event, machine, process);
10411055
free(event);

0 commit comments

Comments
 (0)