Blame SOURCES/oprofile-remap.patch

c532ac
commit 1c54c9a3d96dd8d9d1d579baaeabc94d0f923ee8
c532ac
Author: William Cohen <wcohen@redhat.com>
c532ac
Date:   Fri Jul 10 15:41:33 2015 -0400
c532ac
c532ac
    Improve handling of remapped anon regions across processes
c532ac
    
c532ac
    Java runtime environments use dynamically allocated memory in
c532ac
    anonymous regions to store Just-In-Time translated code.  The Java
c532ac
    runtime system may change the access permissions for portions of mmap
c532ac
    regions during execution and operf needs to be tolerant of those
c532ac
    change to a portion of the mmap.  operf also needs to keep the anon
c532ac
    memory maps distinct between processes to avoid confusion about the
c532ac
    sizes of the memory regions.
c532ac
    
c532ac
    Signed-off-by: William Cohen <wcohen@redhat.com>
c532ac
c532ac
diff --git a/libperf_events/operf_process_info.h b/libperf_events/operf_process_info.h
c532ac
index f98591f..3138ffb 100644
c532ac
--- a/libperf_events/operf_process_info.h
c532ac
+++ b/libperf_events/operf_process_info.h
c532ac
@@ -25,6 +25,7 @@ struct operf_mmap {
c532ac
 	u64 start_addr;
c532ac
 	u64 end_addr;
c532ac
 	u64 pgoff;
c532ac
+	u32 pid;
c532ac
 	bool is_anon_mapping;
c532ac
 	bool is_hypervisor;
c532ac
 	char filename[PATH_MAX];
c532ac
diff --git a/libperf_events/operf_utils.cpp b/libperf_events/operf_utils.cpp
c532ac
index 90a0765..ff972d4 100644
c532ac
--- a/libperf_events/operf_utils.cpp
c532ac
+++ b/libperf_events/operf_utils.cpp
c532ac
@@ -275,7 +275,10 @@ static void __handle_mmap_event(event_t * event)
c532ac
 	range = all_images_map.equal_range(image_basename);
c532ac
 	for (it = range.first; it != range.second; it++) {
c532ac
 		if (((strcmp((*it).second->filename, image_basename.c_str())) == 0)
c532ac
-				&& ((*it).second->start_addr == event->mmap.start)) {
c532ac
+		    && ((*it).second->pid == 0 || (*it).second->pid == event->mmap.pid)
c532ac
+		    && ((*it).second->start_addr <= event->mmap.start
c532ac
+			&& ((*it).second->end_addr >= event->mmap.start + event->mmap.len)))
c532ac
+		{
c532ac
 			mapping = (*it).second;
c532ac
 			break;
c532ac
 		}
c532ac
@@ -291,12 +294,15 @@ static void __handle_mmap_event(event_t * event)
c532ac
 		 */
c532ac
 		if (mapping->filename[0] == '[') {
c532ac
 			mapping->is_anon_mapping = true;
c532ac
+			mapping->pid = event->mmap.pid;
c532ac
 		} else if ((strncmp(mapping->filename, "//anon",
c532ac
 		                    strlen("//anon")) == 0)) {
c532ac
 			mapping->is_anon_mapping = true;
c532ac
+			mapping->pid = event->mmap.pid;
c532ac
 			strcpy(mapping->filename, "anon");
c532ac
 		} else if ((strncmp(mapping->filename, "/anon_hugepage",
c532ac
 		                    strlen("/anon_hugepage")) == 0)) {
c532ac
+			mapping->pid = event->mmap.pid;
c532ac
 			mapping->is_anon_mapping = true;
c532ac
 			strcpy(mapping->filename, "anon");
c532ac
 		}