Skip to content

Commit e0dbf18

Browse files
olsajiriacmel
authored andcommitted
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: Jiri Olsa <[email protected]> Acked-by: Ian Rogers <[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: 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 978410f commit e0dbf18

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

tools/perf/util/synthetic-events.c

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -596,16 +596,17 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t
596596
int rc = 0;
597597
struct map *pos;
598598
struct maps *maps = machine__kernel_maps(machine);
599-
union perf_event *event = zalloc((sizeof(event->mmap) +
600-
machine->id_hdr_size));
599+
union perf_event *event;
600+
size_t size = symbol_conf.buildid_mmap2 ?
601+
sizeof(event->mmap2) : sizeof(event->mmap);
602+
603+
event = zalloc(size + machine->id_hdr_size);
601604
if (event == NULL) {
602605
pr_debug("Not enough memory synthesizing mmap event "
603606
"for kernel modules\n");
604607
return -1;
605608
}
606609

607-
event->header.type = PERF_RECORD_MMAP;
608-
609610
/*
610611
* kernel uses 0 for user space maps, see kernel/perf_event.c
611612
* __perf_event_mmap
@@ -616,23 +617,37 @@ int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__handler_t
616617
event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
617618

618619
maps__for_each_entry(maps, pos) {
619-
size_t size;
620-
621620
if (!__map__is_kmodule(pos))
622621
continue;
623622

624-
size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
625-
event->mmap.header.type = PERF_RECORD_MMAP;
626-
event->mmap.header.size = (sizeof(event->mmap) -
627-
(sizeof(event->mmap.filename) - size));
628-
memset(event->mmap.filename + size, 0, machine->id_hdr_size);
629-
event->mmap.header.size += machine->id_hdr_size;
630-
event->mmap.start = pos->start;
631-
event->mmap.len = pos->end - pos->start;
632-
event->mmap.pid = machine->pid;
623+
if (symbol_conf.buildid_mmap2) {
624+
size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
625+
event->mmap2.header.type = PERF_RECORD_MMAP2;
626+
event->mmap2.header.size = (sizeof(event->mmap2) -
627+
(sizeof(event->mmap2.filename) - size));
628+
memset(event->mmap2.filename + size, 0, machine->id_hdr_size);
629+
event->mmap2.header.size += machine->id_hdr_size;
630+
event->mmap2.start = pos->start;
631+
event->mmap2.len = pos->end - pos->start;
632+
event->mmap2.pid = machine->pid;
633+
634+
memcpy(event->mmap2.filename, pos->dso->long_name,
635+
pos->dso->long_name_len + 1);
636+
} else {
637+
size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
638+
event->mmap.header.type = PERF_RECORD_MMAP;
639+
event->mmap.header.size = (sizeof(event->mmap) -
640+
(sizeof(event->mmap.filename) - size));
641+
memset(event->mmap.filename + size, 0, machine->id_hdr_size);
642+
event->mmap.header.size += machine->id_hdr_size;
643+
event->mmap.start = pos->start;
644+
event->mmap.len = pos->end - pos->start;
645+
event->mmap.pid = machine->pid;
646+
647+
memcpy(event->mmap.filename, pos->dso->long_name,
648+
pos->dso->long_name_len + 1);
649+
}
633650

634-
memcpy(event->mmap.filename, pos->dso->long_name,
635-
pos->dso->long_name_len + 1);
636651
if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
637652
rc = -1;
638653
break;

0 commit comments

Comments
 (0)