@@ -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