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